Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Что является аналогом inhereted в KOL? [Delphi, Windows]


Страницы:   1 2

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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо