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]
Вообще то создавал я объекты контроллов без парента. И ничего не валится, просто пока парент не привяжешь — компонента не видно. Надо код смотреть.
ЗА. Парентом для закладки, скорее всего должен быть сам табконтролл. Имхо.
← →
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.
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
Related
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 |
| ||
Опытный Профиль Репутация: 1
При добавлении на форму моего компонента вылазит ошибка | |||
|
Snowy |
| ||
Эксперт Профиль Репутация: 31
| |||
|
Vetos |
| ||
Опытный Профиль Репутация: 1 | |||
|
Alexeis |
| ||
Амеба Профиль Репутация: 34
Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать | |||
|
Rrader |
| ||
Код |
If Owner Is TWinControl Then Parent := AOwner As TWinControl; |
Vetos |
| ||
Опытный Профиль Репутация: 1 | |||
|
Alexeis |
| ||
Амеба Профиль Репутация: 34 Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать | |||
|
MetalFan |
| ||
Аццкий Сотона Профиль Репутация: 22
| |||
|
Vetos |
| ||
Опытный Профиль Репутация: 1 Я не знаю зачем, но так написано в книге, и все примеры содержат такую строчку Это сообщение отредактировал(а) Vetos — 25.9.2007, 08:19 | |||
|
Alexeis |
| ||
Амеба Профиль Репутация: 34 canvas.handle — это уже HDC. GetDC() — принимает дескриптор окна, т.е. хэндл, а не графический дескриптор. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать | |||
|
Rennigth |
| |||
Эксперт Профиль Репутация: 15
| ||||
|
Alexeis |
| ||
Амеба Профиль Репутация: 34 Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать | |||
|
Rennigth |
| ||
Эксперт Профиль Репутация: 15
Не совсем понял что ты имеешь ввиду. Что значит нельзя будет найти? ИМХО все равно какие будут параметры у метода(коструктора). | |||
|
Alexeis |
| |||
Амеба Профиль Репутация: 34 Rennigth, ну скажем бросили компонент на форму. Сама делфя компилировалась с определенным набором компонентов, откуда ей знать про кастомный класс TScene. Она про него знает лишь то что он обязан быть наследником TComponent с перегруженным конструктором. А как его показать в Disign Time? Вызвать конструктор у класса TComponent, в надежде что на самом деле будет вызван перегруженный конструктор с теми же параметрами и создаст не TComponent, а TScene. Даже у формы конструктор сохранен неизменным.
Добавлено через 2 минуты и 10 секунд
Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать | ||||
|
Rennigth |
| |||||||||
Эксперт Профиль Репутация: 15
|