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

 



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