Cоздание компонента - неправильный выбор Parent-a

Kotъ-Begemotъ
Дата: 22.06.2009 10:38:52
Что-то затупил. Смотрю существующий код создания компонента (комбо-бокс с дополнительной кнопкой вызова справочника. Код готовый и работает (привожу ниже). Но! Если с палитры компонент кинуть этот компонент на форму, то всё хорошо. А вот когда на форме уже лежит TPageControl вот тут шляпа - компонент оказывается на ФОРМЕ, ПОД TPageControl, хотя должен по идее оказываться на текущей вкладке TTabSheet этого TPageControl... Смотрю в код в переопределённую процедуру Create:

  inherited Create(AOwner); // Ну, понятно

  OnEnter := OnControlEnter;
  fEnabled := True;
  fButtonEnabled := True;
   ...
   ...
  if AOwner is TWinControl then             // А вот тут призадумался. Что будет AOwner-ом?!?
    Parent := AOwner as TWinControl;     // вроде же должен быть как раз TTabSheet ?

  fCombo := TComboBox.Create(AOwner);
  fCombo.Parent := Self;
  fCombo.Visible := True;
  fCombo.Style := csDropDownList;
  fCombo.Left := 0;
  fCombo.Top  := 0;
  fCombo.Hint := '';
  fCombo.ShowHint := True;
  fCombo.OnChange := OnComboChange;
  fCombo.OnKeyDown := OnComboKeyDown;
  fCombo.ItemIndex := -1;
  fCombo.Hint := '';

  fButton := TButton.Create(Self);
  fButton.TabStop := False;
  fButton.OnClick := OnButtonClick;
  fButton.Parent := Self;
  fButton.Caption := '...';
  fButton.Font.Style := [fsBold];
  fButton.Hint := 'Вызов справочника [F4]';
  fButton.ShowHint := True;
  fButton.Enabled := fButtonEnabled;
  fButton.Left := 0;
  fButton.Top  := 0;
  fButton.Width := fCombo.Height;
  fButton.Height := fCombo.Height;
  fButton.Visible := True;

  Height := fCombo.Height;
FlyD
Дата: 22.06.2009 10:48:54
Убирай вот это:
  if AOwner is TWinControl then             // А вот тут призадумался. Что будет AOwner-ом?!?
    Parent := AOwner as TWinControl;     // вроде же должен быть как раз TTabSheet ?
Пусть IDE сама обозначает контрол, на котором будет размещаться. А этим действием
ты явно указываешь, что твой компонент будет размещаться на владельце, а
в данном случае - это форма.
Kotъ-Begemotъ
Дата: 22.06.2009 11:05:26
FlyD
Убирай вот это:
  if AOwner is TWinControl then             // А вот тут призадумался. Что будет AOwner-ом?!?
    Parent := AOwner as TWinControl;     // вроде же должен быть как раз TTabSheet ?
Пусть IDE сама обозначает контрол, на котором будет размещаться. А этим действием
ты явно указываешь, что твой компонент будет размещаться на владельце, а
в данном случае - это форма.

Гм... Если вооще убрать этот кусок - ругается что компонент has no parent window
Граур Станислав
Дата: 22.06.2009 11:09:42
А компонент от кого наследник ?
вопрос по компонентам
Дата: 22.06.2009 11:12:26
а что вообще-то создаем?

fCombo.Parent := Self;

а не
fCombo.Parent := Parent;
вопрос по компонентам
Дата: 22.06.2009 11:15:27
Если fCombo лежит на панели или на WinControl,
то Parent надо присваивать родительскому классу т.е. Panel или WinControl
FlyD
Дата: 22.06.2009 11:16:12
Kotъ-Begemotъ
Гм... Если вооще убрать этот кусок - ругается что компонент has no parent window
Попробуй создать в рантайме, без участия IDE. Должно помочь выявить проблему.
Kotъ-Begemotъ
Дата: 22.06.2009 11:31:25
Наследник от Twicontrol создаётся. Кстати, если положить компонент на TTabSheet, компонент "провалится" сквозь TPageControl и упадёт на форму, а после этого его удалить в буфер, и выделив TabSheet вставить - вставляется корректно...
вопрос по компонентам
Дата: 22.06.2009 11:41:20
Есть TEdit+TLabel наследник от TCustomControl
создается просто
  inherited Create(AOwner);

  FLabel:=TLabel.Create(nil);
  FLabel.Parent:=TWinControl(self);

  FEdit:=TEdit.Create(nil);
  FEDit.Parent:=TWinControl(self);

Никаких проблем с TabSheet
Kotъ-Begemotъ
Дата: 22.06.2009 12:07:18
вопрос по компонентам
Есть TEdit+TLabel наследник от TCustomControl
создается просто
  inherited Create(AOwner);

  FLabel:=TLabel.Create(nil);
  FLabel.Parent:=TWinControl(self);

  FEdit:=TEdit.Create(nil);
  FEDit.Parent:=TWinControl(self);

Никаких проблем с TabSheet


Вообще странно...
{ Закоментил вообще
  if AOwner is TWinControl then
    Parent := AOwner as TWinControl;
}
  fCombo := TComboBox.Create(nil);    // Решил вот так попробовать
  fCombo.Parent := TWinControl(Self);  // но что-то опять ошибка что контрол has no parent window
  fCombo.Visible := True;
  fCombo.Style := csDropDownList;
  fCombo.Left := 0;
  fCombo.Top  := 0;

Компонент точно наследник TWinControl - толко что посмотрел...