Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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

Dron (статус: Студент), 27 февраля 2008, 14:54 [#1]:

Если честно, не понял вопроса.
Во-первых, сначала вы говорите о массиве кнопок, а затем речь ведёте о клавишах. Клавиши на клавиатуре, а на экране кнопки. Так что именно нажимается?
Во-вторых, вы сами ответили на свой вопрос - используя свойство Tag: каждой кнопке присвоить номер и просто его и забирать при нажатии. В чём проблема?
С уважением.
Полушин Сергей Анатольевич

Полушин Сергей Анатольевич (статус: Посетитель), 28 февраля 2008, 18:22 [#2]:

Dron, вы правы. Звиняйте пожалуйста. Речь целиком и полностью шла о кнопках.

>>не прибегая к посторонним переменным, массивам и т.д.( например, используя свойство Tag это легко реализовать).

Я хотел сказать, что свойствами тоже нельзя пользоваться, а свойство Tag привел в пример, чтоб показать, что этот способ мне не катит.
Dron

Dron (статус: Студент), 28 февраля 2008, 18:49 [#3]:

Цитата:

Я хотел сказать, что свойствами тоже нельзя пользоваться

Интересно, почему? Ведь понятно, что цикл будет работать гораздо дольше обращения напрямую к свойству объекта.
С уважением.
Полушин Сергей Анатольевич

Полушин Сергей Анатольевич (статус: Посетитель), 28 февраля 2008, 21:10 [#4]:

>>Интересно, почему?
Так поставлено условие задачи.
Матвеев Игорь Владимирович

Матвеев Игорь Владимирович (статус: Студент), 29 февраля 2008, 02:01 [#5]:

Ну и странные у Вас вопросы...
Нельзя пользоваться TButton.Tag (можно еще понять, может оно уже занято), так сделайте потомка от TButton и добавьте сколько нужно дополнительных свойств, в чем проблема-то?

Изначально ведь было понятно, что кроме использования свойств TButton или цикла перебора ничего другого быть не может, но цикл - неправильное решение во всех отношениях.
Полушин Сергей Анатольевич

Полушин Сергей Анатольевич (статус: Посетитель), 29 февраля 2008, 13:24 [#6]:

Я понимаю, что цикл это самое нерациональное решение, но условие задачи ставил не я. Условие такое, что никаких дополнительных переменных, свойств и т.д.
Dron

Dron (статус: Студент), 29 февраля 2008, 16:28 [#7]:

Дурацкое условие одним словом... Даже если это лабораторная работа, то придумана она неправильно. Только приучают людей делать глупости.
С уважением.
Полушин Сергей Анатольевич

Полушин Сергей Анатольевич (статус: Посетитель), 29 февраля 2008, 18:13 [#8]:

Полностью с вами согласен! Сам спорил!
DNK

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

DNK (статус: Студент), 9 марта 2008, 06:10 [#11]:

Ничего не имею против. Все визуальные компоненты (в том числе и стандартная фома) - это в конечном итоге просто объекты-обертки для WinAPI. Я могу поспорить с любым, что использование компонентов предпочтительнее чем голое API.
Добавлю, что ObjectList я предложил как самое простое и наглядное решение. В моем же стиле создать класс-потомок MyObjectList и работать с ним.
"Digital Networked Knight"

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:28
Выполнено за 0.03 сек.