![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по ActionList [D5, Win95/98, WinME, NT4, Win2k, WinXP]
bmai © (2002-06-03 15:16:00)Здравствуйте
Имеется большое количество (не массив) SpeedButton с именами SPB1, SPB2, ... и соответствующих пунктов меню MNU1, MNU2, ...
У всех общий Action, и в обработчике OnExecute нужно вызвать одну и ту же функцию, но с параметром, равным цифрам из имени нажатой кнопки или меню. Как сделать?
Возможно, подход в корне неверный (мой первый опыт использования ActionList), тогда подскажите как лучше.
Спасибо
bmai (2002-06-05 03:13:00) [1]Вся хитрость была в том, что у меню и кнопок надо было оставить свойство Action пустым, а в OnClick поставить Action1Execute. Тогда Sender, естественно, получает значение, соответствующее задействованному Control-у.
bmai (2002-06-03 19:18:00) [2]Вот те на! Заработало! Вроде тоже самое раньше не хотело работать.
Кинул на форму 2 Button-а, ActionList, Edit, поставил обеим кнопкам в Action Action1Execute и дописал
procedure TForm1.Action1Execute(Sender: TObject);
begin
Edit1.Text:= TComponent(Sender).Name;
end;
Выдает в Edit-e имена кнопок, как мне и требовалось.
Всем спасибо за предложения.
bmai (2002-06-03 19:05:00) [3]2MAxiMum ©
TComponent(Sender).Name - Specifies the name of the component as referenced in code.
TComponent(Sender).GetNamePath - Returns a string used by the Object Inspector.
Видимо правильнее использовать 1-ый вариант.
MAxiMum (2002-06-03 18:44:00) [4]TComponent(Sender).Name. А какая разница?
bmai (2002-06-03 18:31:00) [5]Нашел, что имя компонента можно выудить так:
Str := TComponent(Sender).GetNamePath
Остался вопрос как найти в OnExecute кто именно исходный Sender?
bmai (2002-06-03 18:02:00) [6]2Mz_________
Для моего случая строке должны были бы присвоиться "SPB1", если была нажата SPB1 и т.д.
Вариант с Tag выглядит вполне подходящим, только как узнать в OnExecute кто именно вызвал событие, чтобы определить его Tag?
Mz_______ (2002-06-03 16:25:00) [7]2bmai (03.06.02 15:30)"пример кода преобразования имени компонента в строку"
????
TComponentName = type string;
Mz_______ (2002-06-03 16:16:00) [8]Можно извратиться таким способом но imho не стоит,..
В обработчике Button OnClick
Action1Execute(Sender);
тогда в Action OnExcecute
Showmessage((Sender as TButton).Caption);
bmai (2002-06-03 15:52:00) [9]Нет, не то. ClassName возвращает мне TAction, а надо не имя класса, а имя конкретного объекта (кнопки или пункта меню), вызвавшего OnExecute в ActionList-е
Lord Warlock (2002-06-03 15:33:00) [10]Свойство ClassName?
bmai (2002-06-03 15:30:00) [11]Дело в том что мне недавно попался пример кода преобразования имени компонента в строку. Тогда это было не актуально, а теперь не могу найти.
Lord Warlock (2002-06-03 15:24:00) [12]Вообще-то ActionList используется для выполнения одинаковых операций различными контролями, но если тебе надо уникально идентифицировать каждый контроль, пользуйся свойством Tag.