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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 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 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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):

Приложение:
  1. procedure TDiscTools.tbToolsClick(Sender: TObject);
  2. begin
  3.  
  4. else if Sender = tbStructures then { ... }
  5. else if Sender = tbDump then { ... }
  6.  
  7.  
  8. end;
  9.  


Ответ отправил: bugmenot (статус: 3-ий класс)
Время отправки: 24 августа 2010, 11:39


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 24 августа 2010, 16:58; участников в обсуждении: 2.
Вадим К

Вадим К (статус: Академик), 24 августа 2010, 10:25 [#1]:

ну не нужно забывать, что мы можем прочитать и имя на кнопке, нам никто не мешает
TButton(Sender).Caption
Галочка "подтверждения прочтения" - вселенское зло.
bugmenot

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

bugmenot (статус: 3-ий класс), 24 августа 2010, 16:58 [#4]:

> Но полагаться на то, что SizeOf(Longint) = SizeOf(Pointer)
Угу, ради этого всегда пишу {$IF SizeOf(Pointer) <> SizeOf(Longint)}{$MESSAGE ERROR 'итд
И очень интересно, как решат когда наконец разродятся 64-битным портом.

> В с++ с этим уже наломали дров:)
Да ну их, хаос и анархия ;-)
виконання програми розпочинається з того самого мiсця, де призупинилося.

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

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