Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
9-1090243094
Zak3D[@Tm]
2004-07-19 17:18
2004.12.05
Вопрос по игре Xonix.


4-1098344748
Klopan
2004-10-21 11:45
2004.12.05
Реестр


4-1098353983
Lingo
2004-10-21 14:19
2004.12.05
AddPrinterDriver


14-1100625771
Piter
2004-11-16 20:22
2004.12.05
Как проиграть QuickTime?


3-1099989544
goldenmax
2004-11-09 11:39
2004.12.05
Как подключится по сети к базе через BDE





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский