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