Control has no parent windows delphi

Control has no parent windows delphi

У меня в компоненте TabControl (Моем)
которорый я сейчас создаю
автоматический должны сосздаваться
закладки по идее Но! Когда я бытаюсь
добавить закладку в обработчики Create
появляется окно с ошибкой
Control «has no parent window»

Как мне создать эти закладний
что бы эта ошибка не выходила?


gdaujk © ( 2005-11-05 03:17 ) [1]

которорый я сейчас создаю
TabControl уже давно создан.

Что значит автоматический должны сосздаваться закладки? Либо ты их создашь, либо они не создаются вообще.

С помощью чего ты создаёшь VCL или Win API? Если Win API, то создать TabControl можно сл. способом:

uses CommCtrl;

procedure CreateTab(Wnd: HWND);
procedure InsertTabItem(Text: string; Index: Integer);
var
I: tagTCITEMA;
begin
I.mask := TCIF_TEXT;
I.pszText := PChar(Text);
I.cchTextMax := StrLen(PChar(Text));
I.iImage := -1;
SendMessage(Tab, TCM_INSERTITEM, Index, LParam(@I));
end;
begin
InitCommonControls;
Tab := CreateWindow(WC_TABCONTROL, «», WS_CHILD or WS_VISIBLE or WS_GROUP or WS_TABSTOP or TCS_FOCUSONBUTTONDOWN,
5, 6, 320, 320, Wnd, 13, hInstance, nil);

InsertTabItem(«Первая закладка», 0, 0);

InsertTabItem(«Вторая закладка», 1);
end;

Это в общих чертах. Советую сменить у Таба шрифт. Но это уже детали.

Если же ты пользуешься VCL, то определись, чего тебе надобно: TabControl или PageControl. При динамическом созданнии (если оно конечно используется) не забывай присваивать св-ву Parent твоего компонента Self.

PS: Не очень понятно, в чём твоя проблемма.


Arazel © ( 2005-11-06 08:20 ) [2]

Нет. Я создаю в VCL

Я унаследовал TabControl что бы добавить ему скины!
Но теперь моя задача создавать коекакие закладки при созданий
TabControl.

Вобщем когда я нажму F9 и программа запустится
то я хочу чтобы все что мне нужно(Закладки) было уже созданно
а япытаюсь это сделать в конструкторе «Create»
И когда я ложу этот скомпелированый компонент на форму
то вылетает такая фишка: Control «has no parent window»


gdaujk © ( 2005-11-07 07:04 ) [3]

Arazel © (06.11.05 08:20) [2]
а япытаюсь это сделать в конструкторе «Create»

Я же написал: «не забывай присваивать св-ву Parent твоего компонента Self». То есть, если ты, например, создаёшь свой Tab при создании формы, то:

procedure TForm1.FormCreate(Sender: TObject);
begin
YourTab := TYourTab.Create(self);
YourTab.Parent:=(self);
end;

Self references the object in which the method is called.

PS: Это в случае, если ты создаёшь Tab в методе его родительского окна. Иначе его можно заменить на Form1, конечно, если Form1 — родитель.


gdaujk © ( 2005-11-07 07:07 ) [4]

Иначе его можно заменить

ИМХО, проблема вот в этом :
> в конструкторе «Create»

Если в конструкторе, то сначала надо вызвать inherited. Иначе объект просто не существует.


gdaujk © ( 2005-11-07 09:50 ) [6]

ANB © (07.11.05 09:36) [5]
сначала надо вызвать inherited

При отсутствии inherited вылетает другая ошибка (не Control «has no parent window»).


ANB © ( 2005-11-07 09:55 ) [7]


> gdaujk © (07.11.05 09:50) [6]

Вообще то создавал я объекты контроллов без парента. И ничего не валится, просто пока парент не привяжешь — компонента не видно. Надо код смотреть.
ЗА. Парентом для закладки, скорее всего должен быть сам табконтролл. Имхо.

Читайте также:  Переустановить windows lenovo s10


gdaujk © ( 2005-11-07 10:14 ) [8]

ANB © (07.11.05 09:55) [7]
И ничего не валится

А у меня почему-то валиться. И умные люди в книжках про это пишут. В справке по Delphi об этом говориться.


reonid © ( 2005-11-07 11:58 ) [9]

На счёт парентов:

Окно компонента создаётся при первом обращении к GetHandle.
При создании окна компонент обращается к Parent.GetHandle,
что приводит к созданию окна Parent»a (если оно ещё не создано), и так далее.
Эта цепочка обычно заканчивается на форме,
которая имеет родительским окном Application.Handle.
(или на компоненте, созданном с помощью CreateParented).

Если эта цепочка в каком либо месте имеет обрыв
(компонент не имеет парента, парент компонента не имеет парента и т.д.),
при обращении к GetHandle
возникает пресловутый «Control «» has no parent window».

Назначение парента компонента происходит после его
выполнения его конструктора. Это означает, что
в теле конструктора компонента нельзя обращаться к его хэндлу,
обращаться к свойствам, которые обращаются к хэндлу,
обращаться к хэндлам дочерних компонент
(хотя им парент уже назначен)
и к их свойствам, которые обращаются к их хэндлам.

reonid © (07.11.05 11:58) [9]
Окно компонента создаётся при первом обращении к GetHandle.

Что за GetHandle? Можно поподробнее?

PS: Я думал, «окно компонента создаётся» методом TWinControl.CreateWindowHandle, в котором кстати вызывается CreateWindowEx. Я что не правильно думал?


reonid © ( 2005-11-07 12:36 ) [11]

GetHandle — это get-метод для свойства TWinControl.Handle.
Мне казалось, это очевидно.

Само код создания окна действительно расположен в CreateWindowHandle.
Но в данном случае существенный момент — в каком именно месте
программы вызывается код создания окна.

win := TWinControl.Create(form);
// окно ещё не создано
win.Parent := form;
// окно до сих пор не создано
PostMessage(win.Handle, WM_USER, 0, 0); // только тут окно будет создано.

Собственно, цепочка вызовов будет такая:
GetHandle => HandleNeeded => CreateHandle => CreateWnd => CreateWindowHandle => CreateWindowEx


reonid © ( 2005-11-07 13:09 ) [12]

Собственно, по существу вопроса:
автору, вероятно, следует перекрыть CreateHandle,
где после inherited проверить, созданы ли закладки
(CreateHandle может вызываться не один раз),
и если нет — то создать их.


gdaujk © ( 2005-11-07 14:08 ) [13]

reonid © (07.11.05 13:09) [11]

Вот теперь понял, к чему вы клоните.


Юрий Зотов © ( 2005-11-07 14:55 ) [14]

Просто перенести создание закладок в CreateWnd, вот и все.

Control has no parent window

I’ve checked out many threads of a similar title but they haven’t helped.

The following compiles and installs to the component palette, but when I try to add the component to a panel, I get the error message mentioned in the thread title.

Could anyone please explain why?

If I omit the Btn->Parent=ToolBar line, everything’s OK, so presumably that’s the problem line?

1 Answer 1

Assigning a ToolButton’s Parent requires the ToolBar to have an allocated HWND, which requires it to have a Parent with an allocated HWND , and so on. But your EditBox does not have a Parent (or a Name ) assigned yet when its constructor is called, so the ToolBar cannot allocate an HWND yet, hence the error.

Читайте также:  Где найти командную строку windows

If you want your Toolbar to have a default button at runtime, you need to move the creation of the button to the EditBox’s virtual Loaded() method (or even the SetParent() method), eg:

Not the answer you’re looking for? Browse other questions tagged delphi c++builder or ask your own question.

Linked

Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.4.16.39093

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Control has no parent windows delphi

Vetos
Дата 24.9.2007, 13:14 (ссылка) | (нет голосов) Загрузка .

Опытный

Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 1
Всего: 4

Код
constructor TScene.Create(Aowner:TComponent);
begin
inherited create(Aowner);
fdc:=GetDC(canvas.handle); //в ентом месте все и рушится
//fdc переменная типа hdc
end;

При добавлении на форму моего компонента вылазит ошибка
Control » has no parent window
и форма остается чистой.
В общем проблему вроде бы объяснил
Облазил все что нашел в интернете проблема в том что Parent.handle еще не инициализирован.
Это пишут везде а толковой подсказки как с этим боротся я так и
не нашел
Помогите кто чем сможет, пожалуйста

Snowy
Дата 24.9.2007, 13:36 (ссылка) | (нет голосов) Загрузка .

Эксперт

Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484

Код
constructor TScene.Create(Aowner:TComponent);
begin
inherited create(Aowner);
Parent := AOwner;
fdc:=GetDC(canvas.handle); //в ентом месте все и рушится
//fdc переменная типа hdc
end;
Vetos
Дата 24.9.2007, 17:07 (ссылка) | (нет голосов) Загрузка .

Опытный

Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 1
Всего: 4

Alexeis
Дата 24.9.2007, 17:32 (ссылка) | (нет голосов) Загрузка .

Амеба

Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459

Код
constructor TScene.Create(Aowner:TWinControl);
begin
inherited create(Aowner);
Parent := AOwner;
fdc:=GetDC(canvas.handle); //в ентом месте все и рушится
//fdc переменная типа hdc
end

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать

Inspired =)

Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 18
Всего: 191

Rrader
Дата 24.9.2007, 17:32 (ссылка) | (нет голосов) Загрузка .
Код
If Owner Is TWinControl Then Parent := AOwner As TWinControl;
Vetos
Дата 24.9.2007, 18:06 (ссылка) | (нет голосов) Загрузка .

Опытный

Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 1
Всего: 4

Alexeis
Дата 24.9.2007, 19:03 (ссылка) | (нет голосов) Загрузка .

Амеба

Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать

MetalFan
Дата 24.9.2007, 21:39 (ссылка) | (нет голосов) Загрузка .

Аццкий Сотона

Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128

Цитата(Alexeis @ 24.9.2007, 17:32 )
fdc:=GetDC(canvas.handle);
Vetos
Дата 25.9.2007, 08:17 (ссылка) | (нет голосов) Загрузка .

Опытный

Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 1
Всего: 4

Я не знаю зачем, но так написано в книге, и все примеры содержат такую строчку

Это сообщение отредактировал(а) Vetos — 25.9.2007, 08:19

Читайте также:  Adobe reader ошибка инициализации приложения windows 10
Alexeis
Дата 25.9.2007, 09:07 (ссылка) | (нет голосов) Загрузка .

Амеба

Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459

canvas.handle — это уже HDC.

GetDC() — принимает дескриптор окна, т.е. хэндл, а не графический дескриптор.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать

Rennigth
Дата 25.9.2007, 10:05 (ссылка) | (нет голосов) Загрузка .

Эксперт

Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76

Цитата(Vetos @ 24.9.2007, 18:06 )
public
constructor create(Aowner:TWinControl);override;
procedure repaint;override;
[/code]
Так сделать нельзя ругается.
Код
constructor Create(Aowner:TWinControl); reintroduce; virtual;
Alexeis
Дата 25.9.2007, 10:18 (ссылка) | (нет голосов) Загрузка .

Амеба

Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать

Rennigth
Дата 25.9.2007, 10:23 (ссылка) | (нет голосов) Загрузка .

Эксперт

Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76

Цитата(Alexeis @ 25.9.2007, 10:18 )
Rennigth, так если метод будет с другими параметрами, то его нельзя будет найти если объект будет приведен к типу предка, а именно это и происходит при бросании объекта на форму.

Не совсем понял что ты имеешь ввиду. Что значит нельзя будет найти? ИМХО все равно какие будут параметры у метода(коструктора).

Alexeis
Дата 25.9.2007, 10:47 (ссылка) | (нет голосов) Загрузка .

Амеба

Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459

Rennigth, ну скажем бросили компонент на форму. Сама делфя компилировалась с определенным набором компонентов, откуда ей знать про кастомный класс TScene. Она про него знает лишь то что он обязан быть наследником TComponent с перегруженным конструктором. А как его показать в Disign Time? Вызвать конструктор у класса TComponent, в надежде что на самом деле будет вызван перегруженный конструктор с теми же параметрами и создаст не TComponent, а TScene.

Даже у формы конструктор сохранен неизменным.

Код
constructor Create(AOwner: TComponent); override;

Добавлено через 2 минуты и 10 секунд
Т.е. переданный метакласс должен быть наследником

Код
TComponentClass = class of TComponent;

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать

Rennigth
Дата 25.9.2007, 11:00 (ссылка) | (нет голосов) Загрузка .

Эксперт

Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

Правила форума «Delphi: Для новичков»

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »

[ Время генерации скрипта: 0.1612 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Оцените статью