![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
определение произошедшего события [D6, XP]
f2d © (2007-03-11 22:57:00)есть:
procedure BtnProc(Sender:TObject);
begin
....
end;
procedure form1.xxx
var
b:TButton;
begin
...
b.onClick:=BtnProc;
end;
можно ли как-нибудь абстрагировать метод BtnProc чтобы он работал не только для события onClick, но и для других событий кнопки? Мною задумано так, что BtnProc будет загружать и выполнять скрипт.
то есть на нужное нам событие(onClick, onMouseMove,...) мы назначаем BtnProc, а далее, при выполнении процедуры BtnProc она по параметрам, или каким-либо другим образом(свойствам sender'a) определяет что за событие её вызвало и производит соответствующие действия. например если нажали на Button1 то BtnProc должна вызвать скрипт с именем Button1.onClick.scr, если навели на Button2, Button2.onMouseMove.scr.
не могу понять как определить в следствии какого события была вызвана процедура. первое что пришло в голову это то что надо как-то переопределять метод обработки сообщений. поскажите как? или где можно про это почитать.
заранее спасибо.
Knight (2007-03-12 00:14:00) [21]И прикола я чё-то всё-равно не понял... почему нельзя всем onClick назначить обработчик из которого вызывать скрипт обработки клика.. а из общего обработчика OnMouseMove вызывать скрипт обработки мува... и т.д... %(
Юрий Зотов (2007-03-12 00:05:00) [22]Попробовал заюзать дефолтные параметры:
procedure TForm1.ButtonHandler(Sender: TObject; Shift: TShiftState = []; X: Integer = 0; Y: Integer = 0);
Не пущает, ругается (D7).
Юрий Зотов (2007-03-11 23:48:00) [23]> f2d © (11.03.07 23:29) [8]
> "можно ли как-нибудь абстрагировать метод BtnProc чтобы он работал не
> только для события onClick, но и для других событий кнопки?"
Для событий с одинаковыми параметрами - легко. Просто назначить.
Для событий с разными параметрами - еще раз: каким образом Вы собираетесь написать одинметод с двумяразными наборами параметров?
Вот напишите его прямо здесь.
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
public
procedure ButtonHandler(Sender: TObject); overload;
procedure ButtonHandler(Sender: TObject; Shift: TShiftState; X, Y: Integer); overload;
end;
procedure TForm1.ButtonHandler(Sender: TObject);
begin
ShowMessage('')
end;
procedure TForm1.ButtonHandler(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
ShowMessage('')
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.OnClick := ButtonHandler;
Button2.OnMouseMove := ButtonHandler;
end;
Этот код работает. Но, как видите, в нем не один , а два метода. Хотя и с одинаковыми именами , но все равно два .
Вы же собираетесь запихнуть два разных набора параметров в один метод. Спрашивается - каким образом?
Допустим, что компилятор такой умный, что пропустит и нормально скомпилирует любой заголовок метода. Но попробуйте его вообще написать. Вот прямо здесь и сейчас.
Palladin (2007-03-11 23:39:00) [24]
> Юрий Зотов © (11.03.07 23:27) [7]
:) очень просто, нырнуть в исходники RemObjects Pascal Script и разнюхать
> f2d © (11.03.07 23:29) [8]
короче есть два путя:
либо как я уже сказал нырнуть туда и разнюхать, бо он позволяет в скрипте создавать объекты и устанавливать свойства-методы, это долгий путь, врядли тебе в короткие сроки удасться
либо регистрировать существующие объекты движку через SetVarInstance и "дописывать" программно скрипт кодом назначения этим объектам свойств
Knight (2007-03-11 23:39:00) [25]
> [8] f2d © (11.03.07 23:29)
> к тому я и спрашиваю - "можно ли как-нибудь абстрагировать
> метод BtnProc
Можно... написать свой компонент баттон у которого будет на все события один единственный обработчик :)
DrPass (2007-03-11 23:36:00) [26]
> f2d © (11.03.07 23:29) [8]
Сказали ж уже - нельзя.
f2d (2007-03-11 23:29:00) [27]
> Юрий Зотов ©
к тому я и спрашиваю - "можно ли как-нибудь абстрагироватьметод BtnProc чтобы он работал не только для события onClick, но и для других событий кнопки?"
> Palladin ©
горит блин) не могу сидеть и ничего не делать :)
Юрий Зотов (2007-03-11 23:27:00) [28]> f2d © (11.03.07 23:17) [2]
Обработчики событий OnClick и OnMouseMove имеют разные наборы параметров.
Каким образом Вы собираетесь написать один метод с двумя разными наборами параметров?
Knight (2007-03-11 23:26:00) [29]А почему бы не сделать два обработчика
ButtonsOnClick(...) и ButtonsOnMouseMove(...;...;...)
И присваивать нужным кнопкам... А в них вызывать BtnProc или разбить BtnProc на пару частей, если они объединены искуственно...
Или подождать Паладина и он что-нить придумает :)
Palladin (2007-03-11 23:23:00) [30]
> f2d © (11.03.07 23:18) [3]
до когда тебе это вообще нужно?
Palladin (2007-03-11 23:22:00) [31]
> f2d © (11.03.07 22:57)
Да подожди ты до понедельника :) протрезвею напишу :)
f2d (2007-03-11 23:18:00) [32]если конечно я правильно понял, вы предлагали в обработчиках событий вызывать BtnProc с разными параметрами...
f2d (2007-03-11 23:17:00) [33]проблема в том что кнопки создаются динамически и создавать все события которыми может обладать кнопка вручную не совсем удобно.
кусок кода
b.onClick:=BtnProc;
я тоже хочу засунуть в отдельный скрипт, чтобы при создании кнопки этот скрипт выполнялся, а уже в нем было бы определено какие события этой кнопки нам нужны. если это батон1, то на него нам нужно только кликать, и в скрипте будет только
begin
button1.onClick:=BtnProc;
end.
если это батон2, то только наводить
begin
button2.onMouseMove:=BtnProc;
end.
и тд...
Knight (2007-03-11 23:03:00) [34]Имхо.. нельзя.. типы процедур разные...
Самое простое, сделать общую процедуру, в которую отправлять Сендера и условный код операции.