Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / GetDC, ReleaseDC и ошибка 'has no parent windows' / 22 сообщений из 22, страница 1 из 1
19.02.2020, 13:41
    #39928418
GetDC, ReleaseDC и ошибка 'has no parent windows'
В общем рисую я 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
19.02.2020, 14:09
    #39928435
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetDC, ReleaseDC и ошибка 'has no parent windows'
Андрей Игоревичпричину - нет.

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

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

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

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

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

См. выше.

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

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

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

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

И я не очень понимаю что именно происходит в системе при GetDC. Моё представление таково - мы у системы берём уникальный указатель на область в которой рисуем, система выделяет какую-то память под это (кеширует?), после рисования - указатель и выделенную память освобождаем. Если рисование идет постоянно - зачем освобождать память?
Или я совершенно неправильно всё понимаю?
...
Рейтинг: 0 / 0
19.02.2020, 14:45
    #39928473
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetDC, ReleaseDC и ошибка 'has no parent windows'
Андрей Игоревич
Почему так?
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
19.02.2020, 14:51
    #39928479
GetDC, ReleaseDC и ошибка 'has no parent windows'
Kazantsev Alexey
Андрей Игоревич,

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

Ага, понял, сделал, действительно CreateHandle вызывалось уже после Create. Но на момент Destroy - handle уже не существует. При том перекрытие DestroyHandle, DestroyWindowHandle,DestroyWnd - результатов не дало, они не вызываются. На каком этапе у нас handle уничтожается?
...
Рейтинг: 0 / 0
19.02.2020, 14:56
    #39928484
GetDC, ReleaseDC и ошибка 'has no parent windows'
_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
19.02.2020, 14:58
    #39928485
GetDC, ReleaseDC и ошибка 'has no parent windows'
а, код
Код: 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
19.02.2020, 15:01
    #39928487
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetDC, ReleaseDC и ошибка 'has no parent windows'
Андрей ИгоревичИ я не очень понимаю что именно происходит в системе при GetDC.

Ну так читай до просветления:
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.02.2020, 15:06
    #39928490
GetDC, ReleaseDC и ошибка 'has no parent windows'
Андрей Игоревич
а, код
Код: 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
19.02.2020, 15:12
    #39928499
GetDC, ReleaseDC и ошибка 'has no parent windows'
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
19.02.2020, 15:15
    #39928502
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetDC, ReleaseDC и ошибка 'has no parent windows'
Андрей Игоревич
На каком этапе у нас 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
19.02.2020, 15:25
    #39928509
GetDC, ReleaseDC и ошибка 'has no parent windows'
[quot _Vasilisk_#22083109]
Андрей Игоревич

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


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

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

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


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

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

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

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


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