Delphi control has no parent window

Delphi control has no parent window

Control ‘ has no parent window

Control ‘ has no parent window

I have been writing custom components for quite some time now. I’ve also converted some things to ActiveX. What I’m working on now I’ve already converted to an ActiveX control, but now for some reason, when I try to build the ActiveX control (based on my existing control), I get this error "Control ‘ has no parent window".

I am using Delphi7 and its option to create an ActiveX control based on any TWinControl inheritance. In this case, I’m basing my control off of a TCustomControl. I suspect my problem is coming from within this control’s constructor.

RE: Control ‘ has no parent window

——————————————————
What You See Is What You Get
Never underestimate tha powah of tha google!

У меня в компоненте 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;

Читайте также:  Amd a8 6410 игры

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

Если же ты пользуешься 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]

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


ANB © ( 2005-11-07 09:36 ) [5]

ИМХО, проблема вот в этом :
> в конструкторе "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]

Читайте также:  Fe 004h kit прошивка


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

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


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

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

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


reon >2005-11-07 11:58 ) [9]

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

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

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

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


gdaujk © ( 2005-11-07 12:15 ) [10]

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

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

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


reon >2005-11-07 12:36 ) [11]

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

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

Читайте также:  Ac back function что это в биосе

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

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


reon >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, вот и все.

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.

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:

Ссылка на основную публикацию
Adblock detector