![]() |
| ||
|
|
Новости |
Поиск |
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.
не могу понять как определить в следствии какого события была вызвана процедура. первое что пришло в голову это то что надо как-то переопределять метод обработки сообщений. поскажите как? или где можно про это почитать.
заранее спасибо.
f2d (2007-03-13 21:55:00) [1]если кому-то интересно, то решение пришло в следующем виде:
при открытии, программа считывает из файла список объектов для создания, создаёт их, после чего вызывается скрипт который дописывает необходимые обработчики для объектов. выглядит скрипт так:
procedure onButtonClick(Sender:TObject);
begin
self.caption:='blablbalbalballba';
button.caption:=self.caption;
end;
procedure onPanelClick(Sender:TObject);
begin
panel.caption:='';
end;
procedure onEditChange(Sender:TObject);
begin
self.caption:=edit.text;
end;
begin
panel.parent:=self;
button.parent:=panel;
edit.parent:=panel;
panel.onClick:=@onPanelClick;
button.onClick:=@onButtonClick;
edit.onChange:=@onEditChange;
application.mainform.show;
while not application.terminated do
application.handlemessage;
end.
списибо всем кто откликнулся, отдельное спабо Palladin'у :)
Юрий Зотов (2007-03-12 18:28:00) [2]> f2d © (12.03.07 17:59) [29]
1. А почему не использовать штатную сериализацию?
2. Можно писать в XML и имя обработчика:
name=Button class=TButton top=5 left=5 parent=panel onClick=ButtonClick
name=Button2 class=TButton top=30 left=5 parent=panel onMouseMove=ButtonMouseMove
name=Button3 class=TButton top=55 left=5 parent=panel onMouseMove=ButtonMouseMove, onClick=ButtonClick
Юрий Зотов (2007-03-12 18:16:00) [3]> Нуб (12.03.07 17:54) [28]
> а где меньше строк здесь... или...
Меньше всего - здесь:
with TButton(Sender) do
if Edit1.Text <> '0' then begin
Edit1.Text := Edit1.Text + Caption;
Label1.Caption := Label1.Caption + Caption;
end
else begin
Edit1.Text := Caption;
Label1.Caption := Caption;
end;
И не нужны никакие бессмысленные функции (тем более, с многогоэтажными if).
И даже не нужно знать "для чего я ту функцию юзал и что в дальнейшем с ее помощью я хотел осуществить".
:o)
Тем более, что в коде [19] есть ошибка: после вызова
btn := btnName(Sender);
проверка
(Sender as TButton) = btn
всегда даст true. Поэтому ветка else в последнем if недостижима, а сам этот if, соответственно, оказывается лишним. Вряд ли это именно то, что Вы хотели получить.
RASkov (2007-03-12 18:11:00) [4]> [29] f2d © (12.03.07 17:59)
Ну так у тебя же они(обработчики) объекта перечисленны в файле, вот и добавляей создаваемому объекты обработчики из списка....
Реализация должна присутствовать в любом случаее...
Т.е. твой хмл и модуль где реализованы обработчики должны быть согласованы. (типа API)...
Или ты хочешь обработчик некоего нового события, не реализованного в модуле программы, описать в своем хмл и чтобы объект на него реогировал?
Нуб (2007-03-12 18:10:00) [5]это будет, эсли конечно же будет :), что-то нереальное :)
f2d (2007-03-12 17:59:00) [6]
> RASkov (12.03.07 17:40) [27]
> f2d © (11.03.07 23:17) [2]
> проблема в том что кнопки создаются динамически и создавать
> все события которыми может обладать кнопка вручную не совсем
> удобно.
для большей понятности опишу саму задачу:
в файле описаны объекты, которые должны присутствовать на форме. способ описания объектов пока произвольный. потом будет хмл.
пока что у меня в файле записано так
name=Panel class=TPanel top=5 left=5 parent=self
name=Button class=TButton top=5 left=5 parent=panel ev=onClick
name=Button2 class=TButton top=30 left=5 parent=panel ev=onMouseMove
name=Button3 class=TButton top=55 left=5 parent=panel ev=onMouseMove,onClick
при запуске, приложение читает файл и создают объекты которые в нём описаны.
когда мы создаем Button мы должны назначить обработчик только на onClick, когда Button3, то и на onClick и на onMouseMove.
постарался объяснить максимально понятно :)
Нуб (2007-03-12 17:54:00) [7]
> >
> А если бы было 100 кнопок? Или 100 тыс?
>
> function TCalc.btnName(Sender: TObject) : TButton;
> begin
> if Sender is TButton then
> result := TButton(Sender)
> else
> result := nil
> end;
>
> Только смысла нет и в этой функции тоже. Не нужны такие
> функции.
> Юрий Зотов
а где меньше строк здесь
//
if (Sender as TButton) = btn then begin
if Edit1.Text <> '0' then begin
Edit1.Text := Edit1.Text + btn.Caption;
Label1.Caption := Label1.Caption + btn.Caption;
end
else begin Edit1.Text := btn.Caption;
Label1.Caption := Label1.Caption + btn.Caption;
end;
end;
или
if (Sender as TButton) = btnOne then begin
if Edit1.Text <> '0' then begin
Edit1.Text := Edit1.Text + btnOne.Caption;
Label1.Caption := Label1.Caption + btnOne.Caption;
end
else begin Edit1.Text := btnOne.Caption;
Label1.Caption := Label1.Caption + btnOne.Caption;
end;
end else
if (Sender as TButton) = btnTwo then begin
if Edit1.Text <> '0' then begin
Edit1.Text := Edit1.Text + btnTwo.Caption;
Label1.Caption := Label1.Caption + btnTwoCaption;
end
else begin Edit1.Text := btnOne.Caption;
Label1.Caption := Label1.Caption + btnTwo.Caption;
end;
end else
... и так дальше аж раз до btnNine в сумме 81 строка
так что Уважаемый Юрий Зотов мне это просто было необходимо сделать , Вы же не знаете для чего я ту функцию юзал и что в дальнейшем с ее помощью я хотел осуществить, я же всего лишь выше привел фрагмент программы, я знаю Ваш опыт и мой это небо и земля, по - этому я учту в дальнейшем, то что вы мне написали
RASkov (2007-03-12 17:40:00) [8]> у меня вопрос стоит в том, что для батона1 может быть нужен
> onClick, а для батона2 он нафиг не нужен. для батона2 нас
> интересует, например, onMouseMove.
Что-то вообще не понятно, что надо, а что нет....
Не проще ли определенным кнопкам при создании добовлять только нужные им обработчики?
Может я неправильно понял вопрос....
Юрий Зотов (2007-03-12 17:29:00) [9]> f2d © (12.03.07 15:55) [23]
> мышиные и нужны. только я не представляю как это реализовать.
Что-то типа этого в Application.OnMessage:
if Message.msg in [WM_MOUSEFIRST..WM_MOUSELAST] then
begin
... // Здесь анализируем, что за сообщение и какому окну оно послано.
... // В зависимости от результата делаем то, что нужно.
end;
Юрий Зотов (2007-03-12 17:24:00) [10]> Нуб (12.03.07 15:09) [19]
А если бы было 100 кнопок? Или 100 тыс?
function TCalc.btnName(Sender: TObject) : TButton;
begin
if Sender is TButton then
result := TButton(Sender)
else
result := nil
end;
Только смысла нет и в этой функции тоже. Не нужны такие функции.
Knight (2007-03-12 16:33:00) [11]
> [21] Нуб (12.03.07 15:22)
Тогда уж лучше Тэги заюзать + кэйс по ним.
f2d (2007-03-12 15:55:00) [12]
> Нуб (12.03.07 15:22) [21]
спасибо, но подобное у меня уже реализовано в BtnProc. в зависимости от название нажатой кнопки загружается соответствущий скрипт.
...
PS.Script.LoadFromFile(ExtractFilePath(ParamStr(0))+'\scripts\'+TComponent(Sender).Name+'.scr');
...
PS.Execute;
...
это конечно подходит когда нужно реализовать один и тот же метод для многих одинаковых объектов. но... у меня вопрос стоит в том, что для батона1 может быть нужен onClick, а для батона2 он нафиг не нужен. для батона2 нас интересует, например, onMouseMove.
> Юрий Зотов © (12.03.07 01:05) [18]
вот вот туда я и глядел. мне как раз мышиные и нужны. только я не представляю как это реализовать.
Джо (2007-03-12 15:32:00) [13]> [21] Нуб (12.03.07 15:22)
>
> > Джо
>
>
> за то работает чудесно все , конечно код корявый , пусть
> разберается, может поймет чего-то
Какой вообще смысл в методе btnName?
Нуб (2007-03-12 15:22:00) [14]
> Джо
за то работает чудесно все , конечно код корявый , пусть разберается, может поймет чего-то
Джо (2007-03-12 15:16:00) [15][19] Нуб
Ужас какой. И зачем такое советовать?
Нуб (2007-03-12 15:09:00) [16]
//***********************************************************
function TCalc.btnName(Sender: TObject) : TButton; // return name of the button
begin
result := btnOne;
if (Sender as TButton) = btnOne then result := btnOne;
if (Sender as TButton) = btnTwo then result := btnTwo;
if (Sender as TButton) = btnThree then result := btnThree;
if (Sender as TButton) = btnFour then result := btnFour;
if (Sender as TButton) = btnFive then result := btnFive;
if (Sender as TButton) = btnSix then result := btnSix;
if (Sender as TButton) = btnSeven then result := btnSeven;
if (Sender as TButton) = btnEight then result := btnEight;
if (Sender as TButton) = btnNine then result := btnNine;
if (Sender as TButton) = btnPlus then result := btnPlus; // for result on onSummaMinusClick
if (Sender as TButton) = btnMinus then result := btnMinus;
end;
//***********************************************************
вот так вот можно все сделать у меня есть 10 кнопок при нажатии на которые срабатывает одна функция и в зависимости от нажатой кнопки возвращает нэймбатон и все чудесно
а вот здесь вот ее юзаю , очень удобно сам попробуй
//***********************************************************
procedure TCalc.onbtnClick(Sender : TObject);
var btn : TButton;
begin
if bolonSummaMinusClick then begin
Edit1.Text := '';
bolonSummaMinusClick := false;
end;
btn := btnName(Sender);
if (Sender as TButton) = btnZero then begin
if Trim(Edit1.Text) = '0' then
Edit1.Text := '0'
else begin
Edit1.Text := Edit1.Text + '0';
Label1.Caption := Label1.Caption + '0';
end;
end else
if (Sender as TButton) = btn then begin
if Edit1.Text <> '0' then begin
Edit1.Text := Edit1.Text + btn.Caption;
Label1.Caption := Label1.Caption + btn.Caption;
end
else begin Edit1.Text := btn.Caption;
Label1.Caption := Label1.Caption + btn.Caption;
end;
end;
end;
//***********************************************************
Юрий Зотов (2007-03-12 01:05:00) [17]> f2d © (12.03.07 00:31) [17]
> я полагал что можно перехватить событие на более низком уровне.
Можно. На уровне WndProc. Но не все, конечно, а только те, что через WndProc вообще проходят. Мышиные - проходят.
f2d (2007-03-12 00:31:00) [18]
> Юрий Зотов © (12.03.07 00:05) [13]
я вас прекрасно понимаю. я полагал что можно перехватить событие на более низком уровне. правда не представлял...и не представляю как это реализовать.
> Palladin © (12.03.07 00:22) [16]
хорошо, не буду гадать)
Palladin (2007-03-12 00:22:00) [19]
> f2d © (12.03.07 00:18) [15]
подробности я сейчас написать не осилю так же как и пример не немогу... по первому пути ты не понял что я имею ввиду, лучше завтра поговорим...
f2d (2007-03-12 00:18:00) [20]
> либо регистрировать существующие объекты движку через SetVarInstance
> и "дописывать" программно скрипт кодом назначения этим объектам
> свойств
мне придётся какому-либо событию присваивать процедуру которая будет это событие обрабатывать. эта процедура должна находиться в основном коде программы либо она может находиться в скрипте?
скорее всего пойду по первому пути, то есть создавать объекты тоже буду в скрипте. думаю так будет проще потому как реализовать эту "технологию" нужно будет не только для кнопок, но и для других компонентов, которые могут быть созданы динамечески. Panel, Memo,... например.
сейчас буду пробовать