powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / GetDC, ReleaseDC и ошибка 'has no parent windows'
22 сообщений из 22, страница 1 из 1
GetDC, ReleaseDC и ошибка 'has no parent windows'
    #39928418
В общем рисую я OpenGl. Пока рисовал в основной форме и создавал/освобождал конрол через
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
TForm1.Create ()
Begin
 DC := GetDC(Handle);      
end;
TForm1.Destroy ()
Begin
 ReleaseDC(Handle, DC);
End;


Всё хорошо.Но мне удобнее упаковать все рисование в свой класс - наследник панели, далее подключая модуль и рисовать в любом приложении, но код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
constructor TCore3D.Create(AOwner: TWinControl);
begin
  inherited Create (AOwner);
   Parent:=AOwner;

   DC := GetDC(Handle);   
end;

destructor TCore3D.Destroy;
begin
  ReleaseDC(Handle, DC);
  inherited;
end;


выдает ошибку (см. картинку) смысл текста я понимаю, причину - нет.
...
Рейтинг: 0 / 0
GetDC, ReleaseDC и ошибка 'has no parent windows'
    #39928435
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревичпричину - нет.

В момент Create у твоей панели ещё нет хэндла.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
GetDC, ReleaseDC и ошибка 'has no parent windows'
    #39928442
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич,

Если хочешь кешировать DC, то делай это в CreateHandle или CreateWnd, которые нужно перекрыть. И имей ввиду, что Handle может быть пересоздан в процесс работы приложения.
...
Рейтинг: 0 / 0
GetDC, ReleaseDC и ошибка 'has no parent windows'
    #39928447
Dimitry Sibiryakov

Андрей Игоревичпричину - нет.

В момент Create у твоей панели ещё нет хэндла.

Я думал после inherited Create (AOwner); (вызов create панели) он создается.
Да и, как мне кажется, GetDC не сработал бы без корректного хендла..
Хотя вот при просмотре хендла в destroy выдал ошибку... Где же я его потерял...
...
Рейтинг: 0 / 0
GetDC, ReleaseDC и ошибка 'has no parent windows'
    #39928450
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичГде же я его потерял...

См. выше.

Создание панели объекта панели и создание окна панели - две большие разницы, разнесённые
по времени.

И таки да, кэшировать DC затея дурная. Оно предназначено работать так:
получил-нарисовал-отдал.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
GetDC, ReleaseDC и ошибка 'has no parent windows'
    #39928461
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
И таки да, кэшировать DC затея дурная. Оно предназначено работать так:
получил-нарисовал-отдал.
А как работает TCanvas.Handle?
...
Рейтинг: 0 / 0
GetDC, ReleaseDC и ошибка 'has no parent windows'
    #39928462
Dimitry Sibiryakov

И таки да, кэшировать DC затея дурная. Оно предназначено работать так:
получил-нарисовал-отдал.

Почему так? Все примеры, статьи и прочее по OpenGL вызывали GetDC в конструкторе и освобождали в деструкторе.
Там ведь рисование непрерывно происходит по Х-раз в секунду.

И я не очень понимаю что именно происходит в системе при GetDC. Моё представление таково - мы у системы берём уникальный указатель на область в которой рисуем, система выделяет какую-то память под это (кеширует?), после рисования - указатель и выделенную память освобождаем. Если рисование идет постоянно - зачем освобождать память?
Или я совершенно неправильно всё понимаю?
...
Рейтинг: 0 / 0
GetDC, ReleaseDC и ошибка 'has no parent windows'
    #39928473
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
Почему так?
Kazantsev Alexey
Если хочешь кешировать DC, то делай это в CreateHandle или CreateWnd, которые нужно перекрыть. И имей ввиду, что Handle может быть пересоздан в процесс работы приложения .

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
constructor TCore3D.CreateHandle;
begin
  inherited CreateHandle;
  if WindowHandle <> 0 then
    FDC := GetDC(Handle);   
end;

destructor TCore3D.DestroyWindowHandle;
begin
  if FDC <> 0 then begin
    ReleaseDC(WindowHandle, FDC);
    FDC := 0;
  end;
  inherited DestroyWindowHandle;
end;
...
Рейтинг: 0 / 0
GetDC, ReleaseDC и ошибка 'has no parent windows'
    #39928479
Kazantsev Alexey
Андрей Игоревич,

Если хочешь кешировать DC, то делай это в CreateHandle или CreateWnd, которые нужно перекрыть. И имей ввиду, что Handle может быть пересоздан в процесс работы приложения.

Ага, понял, сделал, действительно CreateHandle вызывалось уже после Create. Но на момент Destroy - handle уже не существует. При том перекрытие DestroyHandle, DestroyWindowHandle,DestroyWnd - результатов не дало, они не вызываются. На каком этапе у нас handle уничтожается?
...
Рейтинг: 0 / 0
GetDC, ReleaseDC и ошибка 'has no parent windows'
    #39928484
_Vasilisk_
Андрей Игоревич
Почему так?
Kazantsev Alexey
Если хочешь кешировать DC, то делай это в CreateHandle или CreateWnd, которые нужно перекрыть. И имей ввиду, что Handle может быть пересоздан в процесс работы приложения .

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
constructor TCore3D.CreateHandle;
begin
  inherited CreateHandle;
  if WindowHandle <> 0 then
    FDC := GetDC(Handle);   
end;

destructor TCore3D.DestroyWindowHandle;
begin
  if FDC <> 0 then begin
    ReleaseDC(WindowHandle, FDC);
    FDC := 0;
  end;
  inherited DestroyWindowHandle;
end;



Код: pascal
1.
2.
3.
    procedure DestroyHandle; override;
    procedure DestroyWindowHandle; override;
    procedure DestroyWnd; override;


Ни на одном не останавливается :(. Ну и обнулять FDC при уничтожении компонента, по мне, как-то излишне :). Или важно придерживаться принципа: "после нас только нули"?
...
Рейтинг: 0 / 0
GetDC, ReleaseDC и ошибка 'has no parent windows'
    #39928485
а, код
Код: pascal
1.
2.
3.
4.
5.
 destructor TCore3D.Destroy;
begin
  if DC <> 0 then ReleaseDC(WindowHandle, DC);
 inherited;
end;


Работает, чем Handle отличается от WindowHandle
А, не WindowHandle=0, это я поспешил. Но зато не вылетело :).
...
Рейтинг: 0 / 0
GetDC, ReleaseDC и ошибка 'has no parent windows'
    #39928487
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичИ я не очень понимаю что именно происходит в системе при GetDC.

Ну так читай до просветления:
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
GetDC, ReleaseDC и ошибка 'has no parent windows'
    #39928490
Андрей Игоревич
а, код
Код: pascal
1.
2.
3.
4.
5.
 destructor TCore3D.Destroy;
begin
  if DC <> 0 then ReleaseDC(WindowHandle, DC);
 inherited;
end;


Работает, чем Handle отличается от WindowHandle

А, не WindowHandle=0, это я на радостях поспешил. Но зато не вылетело (шутка если что) :).
...
Рейтинг: 0 / 0
GetDC, ReleaseDC и ошибка 'has no parent windows'
    #39928499
Dimitry Sibiryakov

Андрей ИгоревичИ я не очень понимаю что именно происходит в системе при GetDC.

Ну так читай до просветления:
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc

Это всё, что я нашел про помятьмайкрософт The device context is an opaque data structure, whose values are used internally by GDI.
Так я правильно понимаю про память? Просто я в этих мануалах с большим трудом понимаю суть.
Тут больше про контекст windows читать надо, чем про GetDC. Просто с нахрапу я не очень понял всю суть, а пишут там много (да и, если честно, мне это не особо и надо-то, мне бы сделать корректно и забыть, ибо постоянно использовать не буду, а что не использую, увы, забываю).
...
Рейтинг: 0 / 0
GetDC, ReleaseDC и ошибка 'has no parent windows'
    #39928502
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
На каком этапе у нас handle уничтожается?
Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
destructor TWinControl.Destroy;
var
  I: Integer;
  Instance: TControl;
begin
  Destroying;
  if FDockSite then
  begin
    FDockSite := False;
    RegisterDockSite(Self, False);
  end;
  FDockManager := nil;
  FreeAndNil(FDockClients);
  if (Touch <> nil) and (Touch.GestureEngine <> nil) then
  begin
    Touch.GestureEngine.Free;
    Touch.GestureEngine := nil;
  end;
  if Parent <> nil then
    RemoveFocus(True);
  if WindowHandle <> 0 then
    DestroyWindowHandle;
  I := ControlCount;
  while I <> 0 do
  begin
    Instance := Controls[I - 1];
    Remove(Instance);
    Instance.Destroy;
    I := ControlCount;
  end;
  FreeAndNil(FBrush);
{$IF DEFINED(CLR)}
  if Assigned(FHandle.FObjInstance) then
  begin
    FreeObjectInstance(@FHandle.FObjInstance);
    FHandle.FObjInstance := nil;
  end;
{$ELSE}
  if FObjectInstance <> nil then FreeObjectInstance(FObjectInstance);
{$ENDIF}
  FreeAndNil(FPadding);
  if ((sfHandleMessages) in TStyleManager.Flags) then
    TStyleManager.Notification(snControlDestroyed, Self);
  inherited Destroy;
end;

Андрей Игоревич
Ни на одном не останавливается :(
Ищите ошибку у себя. Как вариант у вас не уничтожается сам компонент или его окно.
Андрей Игоревич
. Ну и обнулять FDC при уничтожении компонента, по мне, как-то излишне
Не при уничтожении компонента, а при уничтожении хендла
...
Рейтинг: 0 / 0
GetDC, ReleaseDC и ошибка 'has no parent windows'
    #39928509
[quot _Vasilisk_#22083109]
Андрей Игоревич

[/src][/spoiler]
Андрей Игоревич
Ни на одном не останавливается :(
Ищите ошибку у себя. Как вариант у вас не уничтожается сам компонент или его окно.
Андрей Игоревич
. Ну и обнулять FDC при уничтожении компонента, по мне, как-то излишне
Не при уничтожении компонента, а при уничтожении хендла


Нашел, я не вызывал Destroy своего объекта в Destroy формы (много всего туда сюда гонял и закоментил, он как бы всё равно срабатывал, но, судя по всему, куда позже), при вызове Destroy из формы - DestroyWindowHandle срабатывает.
Спасибо большое.

А уничтожение хендла возможно без вызова уничтожения объекта? Процедуры уничтожения хендла же недоступны извне и, как я понимаю, вызываются при уничтожении объекта (только в процедуре TWinControl.Destroy)?
...
Рейтинг: 0 / 0
GetDC, ReleaseDC и ошибка 'has no parent windows'
    #39928511
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
А уничтожение хендла возможно без вызова уничтожения объекта? Процедуры уничтожения же недоступны извне и, как я понимаю, вызываются при уничтожении объекта (только в процедуре TWinControl.Destroy)?
Вы неправильно понимаете. Изучайте исходники TWinControl
...
Рейтинг: 0 / 0
GetDC, ReleaseDC и ошибка 'has no parent windows'
    #39928516
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
При том перекрытие DestroyHandle, DestroyWindowHandle,DestroyWnd - результатов не дало, они не вызываются. На каком этапе у нас handle уничтожается?

Ловить сообщение WM_DESTROY
...
Рейтинг: 0 / 0
GetDC, ReleaseDC и ошибка 'has no parent windows'
    #39928522
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
А уничтожение хендла возможно без вызова уничтожения объекта? Процедуры уничтожения хендла же недоступны извне и, как я понимаю, вызываются при уничтожении объекта (только в процедуре TWinControl.Destroy)?


Еще есть RecreateWindow() или как-то так.
...
Рейтинг: 0 / 0
GetDC, ReleaseDC и ошибка 'has no parent windows'
    #39928538
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Еще есть RecreateWindow() или как-то так.
Там дофига всего
...
Рейтинг: 0 / 0
GetDC, ReleaseDC и ошибка 'has no parent windows'
    #39928561
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Андрей Игоревичпричину - нет.

В момент Create у твоей панели ещё нет хэндла.
Еще нет. Но разве хендл не будет создан по запросу?

Код: pascal
1.
2.
3.
4.
5.
function TWinControl.GetHandle: HWND;
begin
  HandleNeeded;
  Result := WindowHandle;
end;
...
Рейтинг: 0 / 0
GetDC, ReleaseDC и ошибка 'has no parent windows'
    #39928568
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд
Еще нет. Но разве хендл не будет создан по запросу?
Будет. А потом пересоздастся при установке Parent
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / GetDC, ReleaseDC и ошибка 'has no parent windows'
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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