![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что является аналогом inhereted в KOL? [Delphi, Windows]
Delphi5.01 © (2004-04-27 20:20:00)Вот появилась такая мысля!
Что является аналогом inhereted в KOL?
Вот например если а хочу перекрыть свойство MouseClick у моего компонента.
Один из вариантов который мне пришел в голову это старомодный (не работает)
function NewCrazyButton(AParent: pControl): TKOLCrazyButton;
...
begin
...
Result.OnMouseClick:=fMouseClick;
...
end;
procedure TKOLCrazyButton.fMouseClick(...)
...
begin
...
// здесь все что надо чтоб произошло на MouseClick
...
end;
но когда в программе надо прикрепить к моему новому компоненту обработку MouseClick я пишу:
MyButton.OnMouseClick:=MyMouseClick;
Фактически я сам удаляю указатель на процедуру компонента fMouseClick в которой хранится информация что именно должен сделать компонент при MouseClick. Как я заметил в данном случае решением является inhereted но его у KOL нету, или я не смог найти.
Вторым решением является (работает, но не для всех месаг)
function CrazyButtonWndProc(Sender: PControl; var Msg: TMsg; var Rslt: Integer): Boolean;
...
begin
...
Result:=false;
case Msg.message of
WM_LBUTTONDBLCLK:
begin
pCrazyButton(Sender).fMouseClick(Sender,
SmallPointToPoint(TSmallPoint(Msg.LParam)));
end;
end;
...
end;
procedure TKOLCrazyButton.fMouseClick(...)
...
begin
...
// здесь все что надо чтоб произошло на MouseClick
...
end;
все работает без сбоев, переменная OnMouseMove свободна, при программировании в нее можно помещать указатель на нашу функцию, нижу указанный код не даст сбоев
MyButton.OnMouseClick:=MyMouseClick;
Зачем мне нужно было так длинно все изъяснять, "это же и так всем ясно".
Так вот перейду к сути. Проблема в том что данным методом не возможно обработать сообщение:
WM_MOUSELEAVE:
begin
MsgOK('OK');
end;
А почему? Оно появляется только в том случае если в конструктора есть строка
Result.OnMouseLeave:=fMouseLeave;
Не имеет значения что делает процедура fMouseLeave, она может быть вообще пустой.
В чем загвоздка?
П.С. Не один раз перечитал статью "Создание визуальных компонентов для библиотеки KOL"
Delphi5.01 (2004-05-05 19:52:00) [1]2 Speller: I poetomu on tak ispravno rabotaet? :-)
SPeller (2004-05-03 12:01:00) [2]
> кстати, чем при наследовании лучше AttachProc обычного перекрывания?
> это ж доп. код ведения динамич. списка всех окконных функций,
> ect..
Не надо WndProc перекрывать, лучше использовать AttachProc, который предназначен именно для этих целей.
марсианин (2004-05-02 01:42:00) [3]у PControl есть же оконная процедура:
function WndProc( var Msg: TMsg ): Integer; virtual;
перекрыть бы ее и все! и инхеритед добавить.. правда я так не делал. мне надо было, я банально присвоил свой обработчик св-ву OnMessage..
Хотя вот компоненты, которые мне попадались (KOLStringGrid например), добавляют свои фенечки ч-з AttachProc
кстати, чем при наследовании лучше AttachProc обычного перекрывания? это ж доп. код ведения динамич. списка всех окконных функций, ect..
Delphi5.01 (2004-05-01 20:15:00) [4]A reshenie banalnoe (u kol problemi s AttachProc), vmesto standartnogo, chto sovetuiut v FAQ AttachProc nujno ispolzovat OnMessage.
:-))))
Gandalf (2004-05-01 13:44:00) [5]2 Delphi5.01
Не надо переводить - надо FAQ читать внимательно...
z007 (2004-04-30 23:59:00) [6]2 Delphi5.01
> Sender нужен по двум причинам:
> pCrazyButton(Sender).fMouseDown(Sender,SmallPointToPoint(TSmallPoint(Msg.LParam)));
Ну-ну...
> Dummy - перевожу с английского:
Не надо переводить, см kol.pas:
function MakeMethod( Data, Code: Pointer ): TMethod;
{* Help function to construct TMethod record. Can be useful to
assign regular type procedure/function as event handler for
event, defined as object method (do not forget, that in that
case it must have first dummy parameter to replace @Self,
passed in EAX to methods of object). }
Dimaxx (2004-04-30 22:07:00) [7]Ага, ShowMessage или beep он тоже заоптимизил? :-)
PVOzerski (2004-04-30 10:51:00) [8]Вместо override пиши virtual - это же объекты стиля BP.
PVOzerski (2004-04-30 10:49:00) [9]Вместо override пиши virtual - это же объекты стиля BP.
Юра (2004-04-30 10:16:00) [10]Про "бряк"
У тебя вероятно компилер заоптимизил присвоение за ненадобностью.
Юзай: DebugBreak()
-= MSDN =-
The DebugBreak function causes a breakpoint exception to occur in the current process. This allows the calling thread to signal the debugger to handle the exception
Delphi5.01 (2004-04-30 07:55:00) [11]Всем кто считает что вопрос легкий!
На легкие вопросы мне кажется ответы есть а я что-то не вижу ни одного реального ответа!
Хочу поблагодарить z007 который реально посоветовал, и благодаря его совету вопрос был решен.
Всем спасибо кто реально хотел помочь, а не показать что они умней и что я задаю глупые вопросы!
Всегда найдется легкий вопрос в котором что-то можно научится.
Объявляю тему закрытой
Dimaxx (2004-04-29 22:06:00) [12]2 SPeller: Я в OnMessage ставил одну команду присовения (I:=1) и бряк на нее. Ни фига не отловилось! Может, думаю, не так надо. Отлавливал WM_KEYDOWN и опять бряк не срабатывает! Какие дрова на руки надо?
Delphi5.01 (2004-04-29 21:47:00) [13]Sender нужен по двум причинам:
pCrazyButton(Sender).fMouseDown(Sender,SmallPointToPoint(TSmallPoint(Msg.LParam)));
^^^^^^ ^^^^^^
Dummy - перевожу с английского:
dummy
I макет ( установки )
II фиктивный, ложный; холостой ( о команде )
z007 (2004-04-29 21:19:00) [14]Зачем ЗДЕСЬ нужен Sender?
И что такое, по-твоему, Dummy?
Delphi5.01 (2004-04-29 20:59:00) [15]Решение проблемы нашел в форуме:
====================================================
savva © (26.02.04 13:30) [4]
а Run(Applet) кто делать будет? И к тому же я че то не наблюдаю где же ты все таки обрабатываешь сообщения?
Назначь обработчик сообщений
applet.OnMessage:=TOnMessage(MakeMethod(nil,@ProcessMesages)); // назначаем новый обработчик сообщений
и потом лови их
// обработка сообщений
function ProcessMesages(Dummy : pointer; var Msg: TMsg; var Rslt: Integer ): Boolean;
begin
case Msg.message of
WM_<что-то твое> : begin
ShowMessage('Неужели работает??!!');
end;
end;
result:=false;
end;
и наслаждайся.
====================================================
но вот у функции:
function ProcessMesages(Dummy : pointer; var Msg: TMsg; var Rslt: Integer ): Boolean;
нет свойства Sender! А как я могу его достать? Может и туповатый вопрос но прошу ответить!
Delphi5.01 (2004-04-29 17:30:00) [16]Da mlin, a ti u nas znachit iz komarova?
Vo kakaie mi vumnie!
Znachit v KOL mojno napisat
procedure MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); override;
^^^^^^^^^^^^
:-D
Solik (2004-04-29 07:47:00) [17]Дык блин сказали же - точно так же как и в вцл!
Только "inhereted" нету - есть "inherited"!
Наверное потому и не работает :))
Delphi5.01 (2004-04-29 07:33:00) [18]Я наверно не правильно выразился когда сказал "Что является аналогом inhereted в KOL?".
Я имел в виду, какая конструкция является аналогом VCL кода:
procedure MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); override;
procedure TMyComp.MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
...
begin
...
// делаю что-то
...
inhereted;
end;
Спасибо за помощь
SPeller (2004-04-29 02:36:00) [19]Всё он дружит. Если всё делать правильно, то всё прекрасно отлавливается. Кстати, AttachProc - это ни что иное как добавление ещё одного обработчика OnMessage. Так что тут скорее всего в руках дело.
Dimaxx (2004-04-28 21:46:00) [20]KOL действительно не дружит с кое-какими мессагами. И ваще дружит неправильно! Причем я не мог отловить в событии onmessage практически ничего! Получилось только через AttachProc.