Форум: "KOL";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
ВнизЧто является аналогом inhereted в KOL? Найти похожие ветки
← →
Delphi5.01 © (2004-04-27 20:20) [0]Вот появилась такая мысля!
Что является аналогом 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"
← →
Dimaxx © (2004-04-27 21:36) [1]inherited и является. Его никто не отменял...
← →
Delphi5.01 © (2004-04-27 23:14) [2]Я имею в виду конструкцию которая дает аналог inhereted в KOL. Как я уже изъяснился обыкновенный старый метод в кол не работает а вот WM_MOUSELEAVE не могу использовать.
Вот еще одна загвоздка, почему-то после WM_MOUSELEAVE я получая и WM_MOUSEMOVE?
← →
Dimaxx © (2004-04-28 21:46) [3]KOL действительно не дружит с кое-какими мессагами. И ваще дружит неправильно! Причем я не мог отловить в событии onmessage практически ничего! Получилось только через AttachProc.
← →
SPeller © (2004-04-29 02:36) [4]Всё он дружит. Если всё делать правильно, то всё прекрасно отлавливается. Кстати, AttachProc - это ни что иное как добавление ещё одного обработчика OnMessage. Так что тут скорее всего в руках дело.
← →
Delphi5.01 © (2004-04-29 07:33) [5]Я наверно не правильно выразился когда сказал "Что является аналогом 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;
Спасибо за помощь
← →
Solik © (2004-04-29 07:47) [6]Дык блин сказали же - точно так же как и в вцл!
Только "inhereted" нету - есть "inherited"!
Наверное потому и не работает :))
← →
Delphi5.01 © (2004-04-29 17:30) [7]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
← →
Delphi5.01 © (2004-04-29 20:59) [8]Решение проблемы нашел в форуме:
====================================================
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! А как я могу его достать? Может и туповатый вопрос но прошу ответить!
← →
z007 (2004-04-29 21:19) [9]Зачем ЗДЕСЬ нужен Sender?
И что такое, по-твоему, Dummy?
← →
Delphi5.01 © (2004-04-29 21:47) [10]Sender нужен по двум причинам:
pCrazyButton(Sender).fMouseDown(Sender,SmallPointToPoint(TSmallPoint(Msg.LParam)));
^^^^^^ ^^^^^^
Dummy - перевожу с английского:
dummy
I макет ( установки )
II фиктивный, ложный; холостой ( о команде )
← →
Dimaxx © (2004-04-29 22:06) [11]2 SPeller: Я в OnMessage ставил одну команду присовения (I:=1) и бряк на нее. Ни фига не отловилось! Может, думаю, не так надо. Отлавливал WM_KEYDOWN и опять бряк не срабатывает! Какие дрова на руки надо?
← →
Delphi5.01 © (2004-04-30 07:55) [12]Всем кто считает что вопрос легкий!
На легкие вопросы мне кажется ответы есть а я что-то не вижу ни одного реального ответа!
Хочу поблагодарить z007 который реально посоветовал, и благодаря его совету вопрос был решен.
Всем спасибо кто реально хотел помочь, а не показать что они умней и что я задаю глупые вопросы!
Всегда найдется легкий вопрос в котором что-то можно научится.
Объявляю тему закрытой
← →
Юра (2004-04-30 10:16) [13]Про "бряк"
У тебя вероятно компилер заоптимизил присвоение за ненадобностью.
Юзай: 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
← →
PVOzerski © (2004-04-30 10:49) [14]Вместо override пиши virtual - это же объекты стиля BP.
← →
PVOzerski © (2004-04-30 10:51) [15]Вместо override пиши virtual - это же объекты стиля BP.
← →
Dimaxx © (2004-04-30 22:07) [16]Ага, ShowMessage или beep он тоже заоптимизил? :-)
← →
z007 (2004-04-30 23:59) [17]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). }
← →
Gandalf © (2004-05-01 13:44) [18]2 Delphi5.01
Не надо переводить - надо FAQ читать внимательно...
← →
Delphi5.01 © (2004-05-01 20:15) [19]A reshenie banalnoe (u kol problemi s AttachProc), vmesto standartnogo, chto sovetuiut v FAQ AttachProc nujno ispolzovat OnMessage.
:-))))
← →
марсианин © (2004-05-02 01:42) [20]у PControl есть же оконная процедура:
function WndProc( var Msg: TMsg ): Integer; virtual;
перекрыть бы ее и все! и инхеритед добавить.. правда я так не делал. мне надо было, я банально присвоил свой обработчик св-ву OnMessage..
Хотя вот компоненты, которые мне попадались (KOLStringGrid например), добавляют свои фенечки ч-з AttachProc
кстати, чем при наследовании лучше AttachProc обычного перекрывания? это ж доп. код ведения динамич. списка всех окконных функций, ect..
← →
SPeller © (2004-05-03 12:01) [21]
> кстати, чем при наследовании лучше AttachProc обычного перекрывания?
> это ж доп. код ведения динамич. списка всех окконных функций,
> ect..
Не надо WndProc перекрывать, лучше использовать AttachProc, который предназначен именно для этих целей.
← →
Delphi5.01 © (2004-05-05 19:52) [22]2 Speller: I poetomu on tak ispravno rabotaet? :-)
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.034 c