|
Вопрос # 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"
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|