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

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

Компонент на основе TCustomPanel: свойство Parent


Страницы:   1 2

lookin ©   (2006-08-14 22:20:00) 

Имеется компонент, построенный на основе TCustomPanel. При помещении на форму он размещается только на форме, но не в контроле (TWinControl), на который я его кидаю. Вопрос - почему? Заранее спасибо.


Чапаев   (2006-08-15 09:41:00) [1]

> Убирал как-то, ругалось все сильно непосредственно при кидании
> компонента на форму на отсутствие Parent window/control...

Рисуешь, не проверяя, есть ли на чём рисовать.


> Я полагал, что ресайзинг и прорисовку следует вручную вызывать
> при создании компонента...

Создание и прорисовка -- вещи довольно-таки невзаимосвязанные... ;-) Эх, позже ещё столкнёшься с загрузкой компонента из ресурса, вот тогда веселуха будет...


DiamondShark   (2006-08-15 01:20:00) [2]


> lookin ©   (15.08.06 01:17) [31]

:-)


DiamondShark   (2006-08-15 01:19:00) [3]


> Я полагал, что ресайзинг и прорисовку следует вручную вызывать
> при создании компонента...

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


lookin   (2006-08-15 01:17:00) [4]

[30] DiamondShark ©   (15.08.06 01:15)

Относительно понятно... Спасибо...


DiamondShark   (2006-08-15 01:15:00) [5]


> Это ли не дефект среды?

Нет. Это фича. Так устроен дизайнер и механизм загрузки.

Овнером всегда назначается top-level компонент.
Кстати, отношение parent-child поддерживается для всех компонентов, не только для котролов, и отображается в dfm вложенностью секций object...end.
А внутри TReader.ReadComponent вызывается TComponent.SetParentComponent.
Для TControl реализация, разумется, такая:

procedure TControl.SetParentComponent(Value: TComponent);
begin
 if (Parent <> Value) and (Value is TWinControl) then
   SetParent(TWinControl(Value));
end;

Вот почему не надо Parent:=AOwner as TWinControl


lookin   (2006-08-15 01:09:00) [6]

[28] DiamondShark ©   (15.08.06 01:05)

Это ли не дефект среды? Да, показывает TForm1, хотя должен бы TPanel...


DiamondShark   (2006-08-15 01:05:00) [7]


> Теперь - а почему?

constructor TEqapColorBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ShowMessage(AOwner.Name);
end;

Скомпилировать. Запустить. Медитировать.


lookin   (2006-08-15 01:01:00) [8]

Я полагал, что ресайзинг и прорисовку следует вручную вызывать при создании компонента...


lookin   (2006-08-15 01:00:00) [9]

[24] DiamondShark ©   (15.08.06 00:56)

Пьтрясающе! Все работает.... Теперь - а почему?


DiamondShark   (2006-08-15 01:00:00) [10]

Скопировал всё кроме конструктора.
Все работает как надо.


DiamondShark   (2006-08-15 00:56:00) [11]

constructor TEqapColorBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Parent:=AOwner as TWinControl; IsCreated:=false;
Paint; IsCreated:=true; Resize;
end;
Выкинуть и обратно не вставлять.


lookin   (2006-08-15 00:54:00) [12]

unit EqapColorBox;

interface

uses Windows, SysUtils, Classes, Controls, ExtCtrls, Graphics, ComCtrls,
    Forms, EqapCommon;

type TEqapColorBox = class(TCustomPanel)
    private
      pxl: array of TPixelArray;
      IsCreated,IsColorSelection: boolean;
      FVersion: string;
    public
      constructor Create(AOwner: TComponent); override;
      destructor Destroy; override;
      procedure Paint; override;
      procedure Resize; override;
    published
      property Align;
      property BevelInner;
      property BevelOuter;
      property BorderStyle;
      property Color;
      property Visible;
    end;

procedure Register;

implementation

constructor TEqapColorBox.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 Parent:=AOwner as TWinControl; IsCreated:=false;
 Paint; IsCreated:=true; Resize;
end;

destructor TEqapColorBox.Destroy;
begin
end;

procedure TEqapColorBox.Paint;
begin
 Canvas.Brush.Color:=Color; Canvas.FillRect(Rect(0,0,Width,Height));
end;

procedure TEqapColorBox.Resize;
begin
end;

procedure Register;
begin
 RegisterComponents('Eqap', [TEqapColorBox]);
end;

end.

Вот это сейчас весь рабочий код...


DiamondShark   (2006-08-15 00:53:00) [13]

Даже минимальный наследник не работает? =-0


DiamondShark   (2006-08-15 00:52:00) [14]

Присваивание Parent уже реализовано в недрах VCL


lookin   (2006-08-15 00:51:00) [15]

[19] DiamondShark ©   (15.08.06 00:45)

Что-то не помогает приближение...


DiamondShark   (2006-08-15 00:45:00) [16]

Чудес не бывает.
У меня минимальный наследник:

 TCustomPanel1 = class(TCustomPanel)
 private
   { Private declarations }
 protected
   { Protected declarations }
 public
   { Public declarations }
 published
   { Published declarations }
 end;

(естественно, в пакете, пакет зарегистрирован)

Давай тогда методом последовательных приближений.
Начнём с такого же минимального компонента.
Потом по чуть-чуть добавлять начинку, пока не сломается.

Кста.
Parent:=AOwner as TWinControl
нафиг не нужно.


lookin   (2006-08-15 00:39:00) [17]

[17] DiamondShark ©   (15.08.06 00:37)

Кидаю на TPanel...


DiamondShark   (2006-08-15 00:37:00) [18]

Давай по порядку.
Ты на какой контрол свой компонент бросаешь?

А то я тут накидал простенький наследник от TCustomPanel.

Бросаю его на любые стандартные контейнерные контролы TGroupBox, TPanel, TScrollBox, TControlBar, TCoolBar, TPageScroller, TToolBar,.. уф-фф... никого не забыл? А! На самого себя, да.

Везде становится чайлдом.
Конечно, чайлдом кнопки или листбокса не становится ;)))


lookin   (2006-08-15 00:27:00) [19]

Ну и вдогонку - Parent не Parent, а дела с проблемой, описанной выше, это не меняет...


lookin   (2006-08-15 00:25:00) [20]

[14] Чапаев ©   (14.08.06 23:58)
>>В общем, строчку с присвоением Парента из конструктора просто убери

И не подумаю... Убирал как-то, ругалось все сильно непосредственно при кидании компонента на форму на отсутствие Parent window/control... И пока еще именно эта строчка ни разу не сбойнула ни на одном компоненте... Единственное разумное замечание по этому поводу - проверить, что TComponent является действительно TWinControl...


Страницы:   1 2

Наверх

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