![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Компонент на основе TCustomPanel: свойство Parent
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...