Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с 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]

Почитай документацию кто может быть парентом.


Наверх

Титульная страница Поиск, карта сайта Написать письмо