IPB
ЛогинПароль:

> 

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Несовместимость типов! Proc:=@proc
сообщение
Сообщение #1


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


При попытке скомпилировать GraphiX в FPC версии выше 1.0.9, возникает ошибка (в 1.0.9 все отлично - думаю многие слышали о библиотеке GraphiX)
Итак, ошибка возникает здесь:
(модуль gxdd.pp)
FUNCTION DDInit(hInst:THANDLE;nCmdShow:integer):HResult;
VAR wc:WNDCLASS;
   ddsd:TDDSurfaceDesc;
   ddscaps:TDDSCaps2;
   dddi:TDDDeviceIdentifier;
   hRet:HRESULT;
{   pDDTemp:IDirectDraw; }
   i:integer;
BEGIN
 GXMouseCallbackUsed:=FALSE;
{===== Set up and register window class }
 wc.style:=CS_HREDRAW OR CS_VREDRAW;
 wc.lpfnWndProc:=@WindowProc;


На строчке
wc.lpfnWndProc:=@WindowProc;

Вот какая ошибка:

gxdd.pp(359,19) Error: 
Incompatible types: got
"<address of function(LongWord, LongWord, LongWord, LongInt):LongInt;StdCall>"
expected
"<procedure variable type of function(LongWord, LongWord, LongInt, LongInt):LongInt;StdCall>"


Вроде все соответсвует, но почему-то ошибка вылазиет! Повторю, что в FPC 1.0.9 все компилируется.

Вот тип WNDCLASS
WNDCLASS = record
         style : UINT;
         lpfnWndProc : WNDPROC;
         cbClsExtra : longint;
         cbWndExtra : longint;
         hInstance : HANDLE;
         hIcon : HICON;
         hCursor : HCURSOR;
         hbrBackground : HBRUSH;
         lpszMenuName : LPCTSTR;
         lpszClassName : LPCTSTR;
      end;

Вот тип, проблеммной WNDPROC:
WNDPROC = function (_para1:HWND; _para2:UINT; _para3:WPARAM; 
_para4:LPARAM):LRESULT;stdcall;


Это все что касается левой части строчки (до оператора := ) в которой ошибка.
Вот что относиться к @WindowProc; (то есть адрес получаем )

FUNCTION WindowProc(h_Wnd:HWND;aMSG:Cardinal;
wParam:Cardinal;lParam:Integer):longint;stdcall;
VAR hRet:HRESULT;
   ret,i,j:integer, SysUtils, GraphiX,gxcrt;
   kbstate:array[0..255] of byte;
   keybuffer:word;
BEGIN
 CASE aMSG OF
   {===== Pause if minimized }
   WM_ACTIVATE:
     BEGIN
       IF GraphiXActive THEN DDBackUp;
       GXbActive:=(HIWORD(wParam)=0);
       Result:=0;
       Exit;
     END;
   {====== }
   WM_ACTIVATEAPP:
     BEGIN
    {   PrntStr(h_wnd,50,50,'Backup/Restore '+hexlong(wParam)+' '+hexlong(lParam)+' '+hexlong(h_wnd)); }
       IF GraphiXActive THEN IF (wParam<>0) THEN DDRestore;
       Result:=0;
       exit;
     END;
   {===== Clean up and close the app }
   WM_DESTROY:
     BEGIN
       DDDone;
       PostQuitMessage(0);
       Result:=0;
       Exit;
     END;
   {===== Handle any non-accelerated key commands }
   WM_KEYDOWN:
     BEGIN
       GetKeyboardState(@kbstate);
       ret:=ToASCII(wparam AND $FF,(lParam SHR 16) AND $FF,@kbstate,@keybuffer,0);
       CASE ret OF
       0:BEGIN
           putchar(#0);
           putchar(chr((lParam SHR 16) AND $FF));
         END;
       1:BEGIN
           putchar(chr(keybuffer AND $FF));
         END;
       END;
     END;
   {===== Turn off the cursor since this is a full-screen app }
   WM_SETCURSOR:
     BEGIN
       SetCursor(0);
       SetCapture(h_wnd);
   {    PrintString(random(400),random(300),'WM_SETCURSOR'); }
       Result:=1;
       Exit;
     END;
   WM_LBUTTONDOWN,
   WM_MBUTTONDOWN,
   WM_RBUTTONDOWN,
   WM_LBUTTONUP,
   WM_MBUTTONUP,
   WM_RBUTTONUP,
   WM_MOUSEMOVE:
     BEGIN
{PrintString(300,200,long2str(loword(lparam)));
PrintString(300,220,long2str(hiword(lparam)));
PrintString(300,240,long2str(wParam));}
     {  GetClientRect(h_wnd,@Rect);
       GXmx:=loword(lparam)+Rect.left;
       GXmy:=hiword(lparam)+Rect.top; }
       GXmx:=loword(lparam);
       GXmy:=hiword(lparam);
       GXmb:=0;
       IF (wParam<>0) THEN
         BEGIN
           IF (wParam AND MK_LBUTTON<>0) THEN GXmb:=GXmb OR $01;
           IF (wParam AND MK_RBUTTON<>0) THEN GXmb:=GXmb OR $02;
           IF (wParam AND MK_MBUTTON<>0) THEN GXmb:=GXmb OR $04;
         END;
       IF GXMouseCallbackUsed THEN GXMouseCallback;
     {  IF NOT GraphiXActive THEN
         BEGIN
           GXamx:=GXmx;
           GXamy:=GXmy;
         END; }

       Result:=0;
       Exit;
     END;
   END;
 Result:=DefWindowProc(h_Wnd,aMSG,wParam,lParam);
END;


Кто-нибудь знает в какую сторону копать что бы избавиться от этой ошибки? Я уже исправил все, что нужно для успешной компиляции GraphiX'a, осталось кажется только это, но проблемма в том, что gxdd это главный модуль GraphiX'a, и без этой
wc.lpfnWndProc:=@WindowProc; просто никак! sad.gif


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Попобуй {$T-} в начале модуля (если такая опция вообще присутствует в FPC), либо
wc.lpfnWndProc := Pointer(@WindowProc);


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Нет, все бесполезно ... sad.gif

Я сегодня посмотрю как регистрировался оконный класс при создании окна в уроках "Пишем окна в FPC"
...


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 19:54
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name