| 
| 
 | Вопрос # 1 380/ вопрос открыт / | 
 |  Здравствуйте, уважаемые эксперты!Объявлен массив mas:array of TButton;. При выполнении программы этому массиву присваивается размер n и создаётся n кнопок, отображающихся на форме. Потом, производится клик по некоторой клавише. Как узнать под каким номером эта клавиша находится в массиве не прибегая к посторонним переменным, массивам и т.д.( например, используя свойство Tag это легко реализовать).
 
|  |   Вопрос задал: Полушин Сергей Анатольевич (статус: Посетитель)Вопрос отправлен: 27 февраля 2008, 13:42
 Состояние вопроса: открыт, ответов: 3.
 |  Ответ #1. Отвечает эксперт: Помфюк Владимир Степанович Здравствуйте, Полушин Сергей Анатольевич!
 что-то типа такого на OnClick:
 
 Clicked=n;
 for i:=0 to n-1 do
 if Sender=mas[i] Then Clicked:=i;
 
 if Clicked<>n then ShowMessage('Кнопка №'+IntToStr(Clicked));
 
 должно работать.
 
|  | Ответ отправил: Помфюк Владимир Степанович (статус: Абитуриент)Время отправки: 27 февраля 2008, 14:52
 Оценка за ответ: 5
 Комментарий к оценке: За правильно понятый вопрос и наилучший ответ несомненные пять баллов! |  Ответ #2. Отвечает эксперт: Feniks Здравствуйте, Полушин Сергей Анатольевич!Почитайте статью "Массив из элементов - как с ним бороться или как с ним дружить". Там описаны примеры для TEdit. Думаю вам она поможет.
 
|  | Ответ отправил: Feniks (статус: Бакалавр)Время отправки: 27 февраля 2008, 16:21
 Оценка за ответ: 4
 Комментарий к оценке: Всё это я знал, за исключением последнего пункта. |  Ответ #3. Отвечает эксперт: Матвеев Игорь Владимирович Здравствуйте, Полушин Сергей Анатольевич!При создании:
 
 mas[i] := TButton.Create(Self);
mas[i].Tag := i; При OnClick:
 
 ShowMessage( 'Это кнопка номер:' + IntToStr(Sender.Tag) ); 
|  | Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)Время отправки: 28 февраля 2008, 10:41
 Оценка за ответ: 1
 Комментарий к оценке: Вопрос вами понят неправильно. |  
 Мини-форум вопросаВсего сообщений: 11; последнее сообщение — 9 марта 2008, 06:10; участников в обсуждении: 4. 
|   | Dron (статус: Студент), 27 февраля 2008, 14:54 [#1]:Если честно, не понял вопроса. Во-первых, сначала вы говорите о массиве кнопок, а затем речь ведёте о клавишах. Клавиши на клавиатуре, а на экране кнопки. Так что именно нажимается?
 Во-вторых, вы сами ответили на свой вопрос - используя свойство Tag: каждой кнопке присвоить номер и просто его и забирать при нажатии. В чём проблема?
 С уважением. |  
|   | Полушин Сергей Анатольевич (статус: Посетитель), 28 февраля 2008, 18:22 [#2]:Dron, вы правы. Звиняйте пожалуйста. Речь целиком и полностью шла о кнопках. 
 >>не прибегая к посторонним переменным, массивам и т.д.( например, используя свойство Tag это легко реализовать).
 
 Я хотел сказать, что свойствами тоже нельзя пользоваться, а свойство Tag привел в пример, чтоб показать, что этот способ мне не катит.
 |  
|   | Dron (статус: Студент), 28 февраля 2008, 18:49 [#3]: Цитата: Я хотел сказать, что свойствами тоже нельзя пользоваться Интересно, почему? Ведь понятно, что цикл будет работать гораздо дольше обращения напрямую к свойству объекта.
 С уважением. |  
|   | Матвеев Игорь Владимирович (статус: Студент), 29 февраля 2008, 02:01 [#5]:Ну и странные у Вас вопросы... Нельзя пользоваться TButton.Tag (можно еще понять, может оно уже занято), так сделайте потомка от TButton и добавьте сколько нужно дополнительных свойств, в чем проблема-то?
 
 Изначально ведь было понятно, что кроме использования свойств TButton или цикла перебора ничего другого быть не может, но цикл - неправильное решение во всех отношениях.
 |  
|   | Полушин Сергей Анатольевич (статус: Посетитель), 29 февраля 2008, 13:24 [#6]:Я понимаю, что цикл это самое нерациональное решение, но условие задачи ставил не я. Условие такое, что никаких дополнительных переменных, свойств и т.д. |  
|   | Dron (статус: Студент), 29 февраля 2008, 16:28 [#7]:Дурацкое условие одним словом... Даже если это лабораторная работа, то придумана она неправильно. Только приучают людей делать глупости. С уважением. |  
|   | DNK (статус: Студент), 4 марта 2008, 21:18 [#9]:А использование массива обязательно? Используя ObjectList, номер элемента можно получить просто вызывая IndexOf. По опыту знаю, что списки в использовании гибче массивов. Часто при поддержке старых проектов, возникали кучи проблем из-за использования массивов.
 "Digital Networked Knight" |  
|   | Матвеев Игорь Владимирович (статус: Студент), 5 марта 2008, 07:22 [#10]:В VCL почти все списки - это просто обертки над массивами, например: 
 TObjectList <- TList / PPointerList <- TPointerList = array[0..MaxListSize - 1] of Pointer;Так что это и есть массив. |  
|   | DNK (статус: Студент), 9 марта 2008, 06:10 [#11]:Ничего не имею против. Все визуальные компоненты (в том числе и стандартная фома) - это в конечном итоге просто объекты-обертки для WinAPI. Я могу поспорить с любым, что использование компонентов предпочтительнее чем голое API. Добавлю, что ObjectList я предложил как самое простое и наглядное решение. В моем же стиле создать класс-потомок MyObjectList и работать с ним.
 "Digital Networked Knight" |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |