Вот со звуком надо бы поработать....

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

kotompazb писал(а):LongInt" to "<procedure variable type

Когда Вы просто так запускаете функцию, Вы получаете тот тип, который в качестве ответа даёт выполнение функции. А Вам, видимо, нужно получить её адрес. Это очень большая и очень печальная проблема всех пользующихся сравнительно новым Дельфи - они всегда путают ответ функции и её адрес. У FreePascal такие проблемы выявляются ещё на этапе компиляции. Подставите операцию "адрес" - "@" и тип будет самый тот... ;-)
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

Дело в том что более старым компилятором оно компилировалось именно так, как мне подсказали в примере выше.
В таком виде:

Код: Выделить всё

PrevWndProc:=@(Windows.WNDPROC(SetWindowLong(Self.Handle,GWL_WNDPROC,PtrInt(@WndCallback)))); 

ругается уже так:
formaboutpas.pas(144,18) Error: Illegal type conversion: "LongInt" to "<procedure variable type of function(QWord;LongWord;Int64;Int64):Int64;StdCall>"
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

kotompazb, возможно, где-то в модулях поменялся режим компиляции. Вроде как в дельфовском режиме @ можно опустить.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

kotompazb
А WndCallBack у Вас каким образом описано? Может там проблема?
Или может нужно попроще, типа что-то этого:

Код: Выделить всё

PrevWndProc:=@WndCallBack

?
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

Код: Выделить всё

function WndCallback(Ahwnd: HWND; uMsg: UINT; wParam: WParam; lParam: LParam):LRESULT; stdcall;
begin
  if (uMsg = MM_MCINOTIFY) then
    if wParam = MCI_NOTIFY_SUCCESSFUL then
       mciSendString(PChar('play mySound from 0 notify'), nil, 0, FormAbout.Handle);

  result:=CallWindowProc(PrevWndProc,Ahwnd, uMsg, WParam, LParam);
end;


Добавлено спустя 1 минуту 12 секунд:
Вот так.
Ваще, думаю имеет смысл обновиться до последнее версии Lazarus, а то, возможно, придется снова решать решенную проблему.

Добавлено спустя 26 минут 39 секунд:
Ээээ. Ну в общем обновил Lazarus до 2, убрал собаку. Теперь все компилируется и даже работает :/ Я не знаю почему, но всем спасибо!

Добавлено спустя 2 минуты 23 секунды:
Появилась другая проблема, но с ней пойду в тему другую.
Ответить