powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получение объекта по HWND
6 сообщений из 6, страница 1 из 1
Получение объекта по HWND
    #40081372
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень нужно в дополнительном потоке отобразить окно прогресса с кнопкой "Отмена". Само окно без проблем рисуется на WinApi. Вопрос - как мне из оконной функции добраться до конкретного объекта, который реализует работу с этим окном?

Сейчас у меня есть два варианта: либо повторить реализацию MakeObjectInstance (стандартный использовать нельзя, т.к. он оперирует глобальными переменными) и обрабатывать сообщения уже самим объектом, либо помещать указатель на объект через SetWindowLongPtr(Handle, GWLP_USERDATA, Self).

Первый способ правильнее, второй проще. Может еще есть варианты?

Фактически нужно только особым способом обрабатывать WM_CLICK по кнопке. Со всем остальным отлично справляется cстандартная DefWindowProc()

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Получение объекта по HWND
    #40081378
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз ты отображаешь окно в дополнительном потоке, значит в этом потоке есть цикл обработки
сообщений. Выкинь оконную процедуру вообще, обрабатывай сообщение непосредственно в цикле.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Получение объекта по HWND
    #40081424
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
обрабатывай сообщение непосредственно в цикле.
Вариант
...
Рейтинг: 0 / 0
Получение объекта по HWND
    #40082960
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В итоге остановился на таком варианте:
1. При регистрации класса окна оказываем
Код: pascal
1.
AParams.cbWndExtra := SizeOf(TObject);


2. В CreateWindowEx последним параметром передаем Self
3. Оконную функцию пишем так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
function WindowProc(AHWnd: HWND; AMsg: UINT; AWParam: WPARAM; ALParam: LPARAM): LRESULT; stdcall;
var
  LCreateStruct: PCreateStruct absolute ALParam;
  LPrevVal: LONG_PTR;
  LError: Cardinal;
  LObj: TObject;
  LMsg: TMessage;
begin
  LMsg.Result := DefWindowProc(AHWnd, AMsg, AWParam, ALParam);
  if AMsg = WM_NCCREATE then begin
    LObj := LCreateStruct^.lpCreateParams;
    SetLastError(0);
    LPrevVal := SetWindowLongPtr(AHWnd, 0, LONG_PTR(LObj));
    if LPrevVal <> 0 then
      raise Exception.Create('Object already assigned');
    LError := GetLastError;
    if LError <> 0 then
      RaiseLastOSError(LError);
  end else
    LObj := TObject(GetWindowLongPtr(AHWnd, 0));
  if LObj <> nil then begin
    LMsg.Msg := AMsg;
    LMsg.WParam := AWParam;
    LMsg.LParam := ALParam;
    LObj.Dispatch(LMsg);
  end;
  Result := LMsg.Result;
end;
...
Рейтинг: 0 / 0
Получение объекта по HWND
    #40082974
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

ыыы... это весенне - летнее обострение... я на днях тоже такое делал https://www.sql.ru/forum/1336558/kak-iz-nestaticheskogo-metoda-obekta-sdelat-staticheskiy-ili-analog-allocatehwnd :)
...
Рейтинг: 0 / 0
Получение объекта по HWND
    #40082980
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ,

Я хотел уйти от GWL_USERDATA
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получение объекта по HWND
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]