Вернуть ноль после обработки сообщения

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

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

Ответить
InnI
незнакомец
Сообщения: 5
Зарегистрирован: 30.11.2011 12:23:30

Вернуть ноль после обработки сообщения

Сообщение InnI »

Здравствуйте, уважаемые.
Изучаю Lazarus (пока под Windows). Столкнулся с обработкой сообщений. Сделал так:

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

var PrevWndProc: WNDPROC;
...
function WndCallback(Ahwnd: HWND; uMsg: UINT; wParam: WParam; lParam: LParam): LRESULT; stdcall;
begin
  if (uMsg = WM_CLIPBOARDUPDATE)
  then
    begin
      FormViewer.WMDrawClipboard;
      Exit;
    end;
  result := CallWindowProc(PrevWndProc, Ahwnd, uMsg, wParam, lParam);
end;

procedure TFormViewer.FormCreate(Sender: TObject);
begin
  PrevWndProc := Windows.WNDPROC(SetWindowLong(Handle, GWL_WNDPROC, PtrInt(@WndCallback)));
end;

procedure TFormViewer.WMDrawClipboard;
begin
// здесь я работаю с буфером обмена
end;

Вроде работает, но в MSDN написано: If an application processes this message, it should return zero.
Объясните, где и как мне вернуть этот ноль?
И что будет, если этого не сделать?
Спасибо.
alex208210
постоялец
Сообщения: 207
Зарегистрирован: 12.05.2010 13:16:51

Сообщение alex208210 »

в функции если условие выполнится, то результата у функции не будет.. перед exit присвойте result какое нить значение
InnI
незнакомец
Сообщения: 5
Зарегистрирован: 30.11.2011 12:23:30

Сообщение InnI »

alex208210 писал(а):в функции если условие выполнится, то результата у функции не будет.. перед exit присвойте result какое нить значение

Да, действительно... А какое конкретно в данном случае значение нужно присвоить?
Alex333
новенький
Сообщения: 32
Зарегистрирован: 21.08.2011 19:14:28

Сообщение Alex333 »

"If an application processes this message, it should return zero" переводится примерно как "Если приложение обрабатывает это сообщение, оно должно возвратить ноль". Если обработка сообщения заключается у вас в этом:

FormViewer.WMDrawClipboard;

то вероятно перед Exit надо написать Result := 0;

Или может я вопрос не понял...
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

В самом начале напишите

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

  Result := -1;

По этому результату вы будете знать, что условие не было выполнено и функция не отработала.
InnI
незнакомец
Сообщения: 5
Зарегистрирован: 30.11.2011 12:23:30

Сообщение InnI »

Alex333 писал(а):Или может я вопрос не понял...

Дело в том, что в Delphi можно сделать так:

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

procedure WMDrawClipboard(var Msg: TWMCLIPBOARDUPDATE); message WM_CLIPBOARDUPDATE;

procedure WMDrawClipboard(var Msg: TWMCLIPBOARDUPDATE);
begin
// обработка
Msg.Result := 0;
end;

Вероятно, вот этот ноль (Msg.Result := 0;) и должно вернуть приложение.
А в Лазарусе я несколько запутался с колбэк-функциями (уровень знаний ещё не на столько высок). Поэтому и спрашиваю, каким образом через колбэк-функцию этот ноль вернуть.
Ответить