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

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

TOnMessage в новом KOL [Win32]


Stargazer ©   (2005-09-12 21:39:00) 

Всем привет!
Я так понимаю, в новом 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>"

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

С уважением.


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

;) see ICQ answer also ;)


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

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

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


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

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 11:13:00) [4]

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

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 10:02:00) [5]


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-17 22:27:00) [6]

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

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.


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

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


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

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

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


Наверх

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