Помощь - Поиск - Пользователи - Календарь
Полная версия: Несовместимость типов! Proc:=@proc
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Free Pascal, Pascal ABC и другие
Altair
При попытке скомпилировать 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
xds
Попобуй {$T-} в начале модуля (если такая опция вообще присутствует в FPC), либо
wc.lpfnWndProc := Pointer(@WindowProc);
Altair
Нет, все бесполезно ... sad.gif

Я сегодня посмотрю как регистрировался оконный класс при создании окна в уроках "Пишем окна в FPC"
...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.