Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.28;
Скачать: CL | DM;

Вниз

TOnMessage в новом KOL   Найти похожие ветки 

 
Stargazer   (2005-09-12 21:39) [0]

Всем привет!
Я так понимаю, в новом KOL сменился тип TOnMessage?
Раньше было всё нормально, а теперь компилятор выдаёт ошибку:

Error: Incompatible types: got "TMyObj.Form_OnMsg(var MSG,var LongInt):Boolean" expected "<procedure variable type of function(var tagMSG,var LongInt):Boolean of object;Register>"

Я чего-то не понимаю.

С уважением.


 
Stargazer   (2005-09-12 22:30) [1]

Сам себе отвечаю.
Раньше делал так: Applet.OnMessage = O.Form_OnMsg;
А теперь только через MakeMethod.

Компилятор вроде пропустил - посмотрим, что из этого выйдет в рантайме.


 
Stargazer   (2005-09-17 12:28) [2]

А вышло плохо - падает при попытке вызвать Form.Show.


 
Stargazer   (2005-09-17 22:27) [3]

Вот простейший код, который падает.

program myform;

{$APPTYPE GUI}

uses
   Windows, Messages, Kol;

var
  Form :pControl;

function DoMessage(var Msg:TMsg;var Rslt:integer):Boolean;
begin
    Result:=false;
    if Msg.message = WM_KEYDOWN then begin
    end;    
end;

begin
    Form:= NewForm(Applet,"Demo").SetSize(420,350);
    Applet:=Form;
    Form.OnMessage := TOnMessage(MakeMethod(nil,@DoMessage));
    Run(Applet);
end.


 
Thaddy   (2005-09-18 10:02) [4]


Function DoMessage(Dummy:pointer;var Msg:TMsg;var Rslt:integer):Boolean;
begin
   Result:=.false;
   If Msg.message = WM_.KEYDOWN then begin
   end;    
end;



Because MakeMethod needs a function layout compatible with an object method, you need to include the (hidden) self parameter. So, include a dummy pointer as the first parameter if you use makemethod! This is documented in kol.pas


 
Stargazer   (2005-09-18 11:13) [5]

Бесполезно.
Может, я чего-то не так делаю?
Вот новый код, который всё равно падает.

program myform;
{$APPTYPE GUI}
uses Windows, Messages, Kol;

var Form  : pControl;
   dummy : PControl;

function DoMessage(var Msg:TMsg;var Rslt:integer):Boolean;
begin
   Result:=false;
   if Msg.message = WM_KEYDOWN then begin
   end;    
end;

begin
   Form:= NewForm(Applet,"Demo").SetSize(420,350);
   Applet:=Form;
   Form.OnMessage := TOnMessage(MakeMethod(dummy,@DoMessage));
   Run(Applet);
end.


 
Thaddy   (2005-09-18 14:53) [6]

Again,

Read my response properly: The DoMessage needs an EXTRA parameter, which is the normally hidden self pointer of a class or object method:

Function DoMessage(Dummy:pointer;var Msg:TMsg;var Rslt:integer):Boolean;
                           ^^^^^^^^^^
begin
  Result:=.false;
  If Msg.message = WM_.KEYDOWN then begin
  end;    
end;


 
Stargazer   (2005-09-18 17:23) [7]

Да, что-то я протупил.
Неверно понял текст в KOL.PAS: "..it must have first dummy parameter to replace @Self", решил, что это относится к другому.

Большое спасибо Вам, Thaddy, за консультацию! Всё прекрасно заработало.
Приезжайте к нам в Ярославль, угощу Вас пивом :)))


 
Thaddy   (2005-09-18 23:16) [8]

;) see ICQ answer also ;)



Страницы: 1 вся ветка

Текущий архив: 2006.05.28;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.039 c
6-1138136250
Yeg
2006-01-24 23:57
2006.05.28
Ответ на ICQ сообщения


15-1145904665
ArtemESC
2006-04-24 22:51
2006.05.28
Потерял стилус к КПК...


9-1130783574
NightLord
2005-10-31 21:32
2006.05.28
Text в DelphiX


2-1147240632
D@Nger
2006-05-10 09:57
2006.05.28
RxLib


10-1119734411
Shamansky
2005-06-26 01:20
2006.05.28
Экспорт в 1С Бухгалтерию