|
Вопрос # 4 531/ вопрос открыт / |
|
Здравствуйте, эксперты!
На форме есть 6 кнопок, которые обрабатывают совершенно одну и ту же процедуру но с разными параметрами:
procedure pr(s : string; sender : TObject);
begin
// устанавливаю значение переменной s, в завимимости от того, какая из кнопок вызвала процедуру
ShellExecute(Application.Handle, Pchar('Open'), Pchar('Rundll32.exe'), Pchar('shell32, Control_RunDLL ' + s),'', SW_SHOWNORMAL);
end;
Трабл: мне нужно знать какая кнопка вызвала эту процедуру, чтобы задать значение переменной _s_.
sender - необязательный параметр, можно откинуть... пробовал через него выяснить кто вызвал, но ничего не вышло - ведь класс то у всех одинаковый. Пытался найди подобное в нете - не сумел правильно сформулировать запрос - в двух словах не скажешь. Жду помощи...
 |
Вопрос задал: padonak (статус: Посетитель)
Вопрос отправлен: 24 августа 2010, 01:14
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Егор
Здравствуйте, padonak!
Проще всего воспользоваться свойством tag, которое есть у каждого компонента и никак не используется самой delphi. Нужное значение в это свойство можно записать на этапе проектирования, в инспекторе объектов.
А потом в обработчике проверять:
procedure TForm1.Button1Click(Sender: TObject);
var s: AnsiString;
begin
case TButton(Sender).Tag of
1: s:='первая кнопка';
2: s:='вторая кнопка';
3: s:='третья кнопка';
else s:='непонятная кнопка';
end;
...
end;
 |
Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 24 августа 2010, 04:55
Оценка за ответ: 5
Комментарий к оценке: Браво!
|
Ответ #2. Отвечает эксперт: bugmenot
> никак не используется самой delphi
Не Delphi, а VCL, если точнее. Собственно, Tag существует исключительно для хранения пользовательского значения типа Longint, а поскольку SizeOf(Longint) = SizeOf(Pointer) - свойство получается действительно полезным.
Хотя предложенное решение мне не нравится потому что придется разводить кучу волшебных чисел и следить чтобы в форме и модуле они совпадали. А константы использовать нельзя потому что дизайнер о них ничего не знает.
Собственно, твоя проблема решается проще (в case можно использовать только константы, поэтому else if):
Приложение: Переключить в обычный режим- procedure TDiscTools.tbToolsClick(Sender: TObject);
- begin
-
- else if Sender = tbStructures then { ... }
- else if Sender = tbDump then { ... }
-
-
- end;
-
 |
Ответ отправил: bugmenot (статус: 3-ий класс)
Время отправки: 24 августа 2010, 11:39
|
Мини-форум вопроса
Всего сообщений: 4; последнее сообщение — 24 августа 2010, 16:58; участников в обсуждении: 2.
|
Вадим К (статус: Академик), 24 августа 2010, 10:25 [#1]:
ну не нужно забывать, что мы можем прочитать и имя на кнопке, нам никто не мешает
TButton(Sender).Caption
Галочка "подтверждения прочтения" - вселенское зло.
|
|
bugmenot (статус: 3-ий класс), 24 августа 2010, 11:50 [#2]:
> имя кнопки
> TButton(Sender).Caption
Имя и Caption - разные вещи.
Насколько я понимаю на выходе надо получать точки входа контроль-панели, в Name их хранить неудобно, а в Caption - выглядит страшно. Так что путь ведет к сравнению строк, а так делать нельзя
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
Вадим К (статус: Академик), 24 августа 2010, 12:41 [#3]:
задачи бывают разные. иногда удобно, иногда нет. Иногда можно хранить в свойстве tag ссылку на объекты некого вида...
Но полагаться на то, что
SizeOf(Longint) = SizeOf(Pointer)
не нужно. В с++ с этим уже наломали дров
Галочка "подтверждения прочтения" - вселенское зло.
|
|
bugmenot (статус: 3-ий класс), 24 августа 2010, 16:58 [#4]:
> Но полагаться на то, что SizeOf(Longint) = SizeOf(Pointer)
Угу, ради этого всегда пишу {$IF SizeOf(Pointer) <> SizeOf(Longint)}{$MESSAGE ERROR 'итд
И очень интересно, как решат когда наконец разродятся 64-битным портом.
> В с++ с этим уже наломали дров
Да ну их, хаос и анархия
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|