![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с Items [D6, D7, Win2k]
Neo Trinitron © (2006-03-21 11:08:00)Уважаемые Мастера! Столкнулся с такой проблемой: создаю компоненту - наследник TLabel. На неё помещаю TCheckBox и TComboBox. На этом этапе компонента работает нормально. Однако при помытке добавить ITems в ComboBox выдаёт ошибку: "Component '' has no parent window". Почему так? Вот код конструктора:
begin
inherited Create(AOwner);
CB:=TCheckBox.Create(Self);
FComb:=TComboBox.Create(Self);
CB.Parent:=Self;
FComb.Parent:=Self;
FComb.Items.Add('>');
FComb.Items.Add('>=');
FComb.Items.Add('<');
FComb.Items.Add('<=');
FComb.Items.Add('=');
FComb.Items.Add('<>');
FComb.Items.Add('like');
.....
ЗЫ: Сама компонента компилится нормально. Может чего криво написал - новичок в этом, буду признателен за замечания.
icWasya (2006-03-21 19:22:00) [1]Вообще говоря, большая часть функциональности TCombobox реализуется средствами WIN API. В том числе и забота с TCombobox.Items - все Itemsы хранятся внутри виндусовского комбобокса. И только после того, как у него создастся окно(Handle).
Выход:
1) как уже говорили, наследовать Вашу компоненту от какого-нибудь потомка TWinControl;
2) переопределить метод CreateWnd, например так
type
TMyLabel=Class(...)
...
procedure CreateWnd;override;
...
procedure TMyLabel.CreateWnd;
begin
inherited;
FComb.Parent:=Self;// из конструктора убрать
if FComb.Items.Count>0 then Exit;
FComb.Items.Add('>');// и эти строки из конструктора убрать
FComb.Items.Add('>=');
FComb.Items.Add('<');
FComb.Items.Add('<=');
FComb.Items.Add('=');
FComb.Items.Add('<>');
FComb.Items.Add('like');
end;
Юрий Зотов (2006-03-21 13:36:00) [2]> Neo Trinitron © (21.03.06 12:07) [8]
> Неужели в Delphi нельзя делать такие незамысловатые компонетны?
Можно, только действительно нужно знать тот самый букварь, который Вам усиленно советуют таки прочитать. Например, возьмите панель (или фрейм) и там помещайте все, что угодно.
Reindeer Moss Eater (2006-03-21 12:32:00) [3]Значит у твоего лэйбла на этот момент нет парента.
Иди кури букварь уже.
Neo Trinitron (2006-03-21 12:25:00) [4]>CB.Parent:=Self.Parent;
И так не хочетъ...
Reindeer Moss Eater (2006-03-21 12:09:00) [5]CB.Parent:=Self.Parent;
Neo Trinitron (2006-03-21 12:07:00) [6]>Поместить на него никакой другой контрол невозможно.
Но без Items.Add всё работает красиво...Как же грамотно поступить? Неужели в Delphi нельзя делать такие незамысловатые компонетны?
Юрий Зотов (2006-03-21 11:58:00) [7]> Neo Trinitron © (21.03.06 11:38) [3]
Parent'ом может быть ТОЛЬКО TWinControl. А TLabel - это TGraphicControl. Поместить на него никакой другой контрол невозможно.
clickmaker (2006-03-21 11:42:00) [8]
> Neo Trinitron © (21.03.06 11:39) [4]
Label не может быть парентом. Только Owner'ом. Почему - F1
Reindeer Moss Eater (2006-03-21 11:40:00) [9]>ЗЫ: По-прежнему не работает.
И не должно.
Neo Trinitron (2006-03-21 11:39:00) [10]ЗЫ: По-прежнему не работает.
Neo Trinitron (2006-03-21 11:38:00) [11]> CB.Parent:=Self;
> FComb.Parent:=Self;
>Обе этих строки ошибочны. См. [1].
Убрал эти строки. Parentом по идее должен быть тот обьект на котором расположены эти компоненты. Кто же если не Self?
Юрий Зотов (2006-03-21 11:20:00) [12]> Neo Trinitron © (21.03.06 11:08)
> На неё помещаю TCheckBox и TComboBox.
Это невозможно. См. [1].
> CB.Parent:=Self;
> FComb.Parent:=Self;
Обе этих строки ошибочны. См. [1].
Reindeer Moss Eater (2006-03-21 11:15:00) [13]Почитай документацию кто может быть парентом.