Форум: "Основная";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];
ВнизКомпонент на основе TCustomPanel: свойство Parent Найти похожие ветки
← →
lookin © (2006-08-14 22:20) [0]Имеется компонент, построенный на основе TCustomPanel. При помещении на форму он размещается только на форме, но не в контроле (TWinControl), на который я его кидаю. Вопрос - почему? Заранее спасибо.
← →
tesseract © (2006-08-14 22:33) [1]> При помещении на форму он размещается только на форме, но
> не в контроле (TWinControl),
Нужен потомок TControl.
← →
Чапаев © (2006-08-14 22:34) [2]> Вопрос - почему?
В коде компонента ошибка.
Как именно он отказывается разместиться на ВинКонтроле?
← →
lookin © (2006-08-14 22:41) [3]Так. Он размещается на нужном контроле, если после первого помещения компонента на форму (а он привязывается к ней) сделать "вырезать-вставить на контрол". Иначе говоря, при щелчке на компонент и перетягивании на форму (и отпускании на контроле), он падает все же на форму. А вот затем средствами среды Дельфи его можно свободно поместить на нужный контрол
← →
DiamondShark © (2006-08-14 22:41) [4]А csAcceptsControls у того контрола стоит?
← →
lookin © (2006-08-14 22:42) [5][1] tesseract © (14.08.06 22:33)
Насколько я могу судить, Parent - это все же именно TwInControl, а не TControl....
← →
lookin © (2006-08-14 22:42) [6][4] DiamondShark © (14.08.06 22:41)
Не стоит. Первый раз о таком услышал... Сейчас прочитаю...
← →
Чапаев © (2006-08-14 22:45) [7]> Parent - это все же именно TwInControl, а не TControl....
Неверно.
← →
lookin © (2006-08-14 22:45) [8][4] DiamondShark © (14.08.06 22:41)
В Create я написал так:
ControlStyle:=ControlStyle+[csAcceptsControls];
Parent:=AOwner as TWinControl;
И тем не менее не помогает... Хотя статья о csAcceptsControls дает лично мне представление, что это именно то, что надо...
← →
lookin © (2006-08-14 22:47) [9][7] Чапаев © (14.08.06 22:45)
Из справки - TControl.Parent: TWinControl...
← →
Чапаев © (2006-08-14 23:01) [10]> [9] lookin © (14.08.06 22:47)
Тьфу. Грешное с праведным попутал. Я имел в виду, что Parent объявлен в TControl. Хотя к чему я это имел в виду, сам не знаю... %-) Денёк трудный выдался...
> ControlStyle:=ControlStyle+[csAcceptsControls];
Всё-таки csAcceptControls отвечает за то, примет ли контрол "детей", а не может ли он сам дитём быть. Имхо csAcceptControls тут ни при чём.
Приведи полный код конструктора и процедуры отрисовки.
← →
lookin © (2006-08-14 23:10) [11][10] Чапаев © (14.08.06 23:01)
>>Всё-таки csAcceptControls
На самом деле, я сам написал чушь (как я разумею)... Надо было бы так (вроде):
(AOwner as TWinControl).ControlStyle:=(AOwner as TWinControl).ControlStyle+[csAcceptsControls];
Впрочем, и это не помогло...
Вот коды создания и прорисовки полностью, правда не думаю, что это прояснит ситуацию...
constructor TEqapColorBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Parent:=AOwner as TWinControl; IsCreated:=false;
CreateShape(ColorShape,self,self,8,0);
CreateShape(MarginShape,self,self,0,0,1,1,stRectangle,clNone);
CreateUpDown(UpDown,self,self,0,0,16,0,0,
integer(ecbpSomeColorSet),1,0,udVertical);
UpDown.OnClick:=UpDownClick;
ColorImage:=TImage.Create(self); ColorImage.Parent:=self;
with ColorImage do begin Transparent:=false;
Stretch:=false; Left:=0; Top:=1;
OnMouseDown:=ColorImageMouseDown;
OnMouseMove:=ColorImageMouseMove;
OnMouseUp:=ColorImageMouseUp; end;
FSelectedColorShape:=TSelectedColorShape.Create(self);
SetSelectedColorShape(FSelectedColorShape);
SetOptions([]); SetVersion(""); InitImage;
Paint; IsCreated:=true; Resize;
SetPalette(ecbpBlackWhite); Caption:="";
end;
procedure TEqapColorBox.Paint;
begin
Canvas.Brush.Color:=Color; Canvas.FillRect(Rect(0,0,Width,Height));
end;
← →
Чапаев © (2006-08-14 23:15) [12]> Parent:=AOwner as TWinControl;
С ума сошёл!
Подумай хорошенько над этой строчкой. ;-)
← →
lookin © (2006-08-14 23:51) [13][12] Чапаев © (14.08.06 23:15)
А что там не так?
← →
Чапаев © (2006-08-14 23:58) [14]Ну в общем распространённая ошибка новичков. Просто усвой, что хозяин окна совсем не обязан совпадать с его родителем. Присваивать Parent=Owner не только бессмысленно, но и опасно временами: контролу командуют прорисоваться, а он ещё окно не создал, хэндла нету, и так далее... В общем, строчку с присвоением Парента из конструктора просто убери...
← →
lookin © (2006-08-15 00:25) [15][14] Чапаев © (14.08.06 23:58)
>>В общем, строчку с присвоением Парента из конструктора просто убери
И не подумаю... Убирал как-то, ругалось все сильно непосредственно при кидании компонента на форму на отсутствие Parent window/control... И пока еще именно эта строчка ни разу не сбойнула ни на одном компоненте... Единственное разумное замечание по этому поводу - проверить, что TComponent является действительно TWinControl...
← →
lookin © (2006-08-15 00:27) [16]Ну и вдогонку - Parent не Parent, а дела с проблемой, описанной выше, это не меняет...
← →
DiamondShark © (2006-08-15 00:37) [17]Давай по порядку.
Ты на какой контрол свой компонент бросаешь?
А то я тут накидал простенький наследник от TCustomPanel.
Бросаю его на любые стандартные контейнерные контролы TGroupBox, TPanel, TScrollBox, TControlBar, TCoolBar, TPageScroller, TToolBar,.. уф-фф... никого не забыл? А! На самого себя, да.
Везде становится чайлдом.
Конечно, чайлдом кнопки или листбокса не становится ;)))
← →
lookin © (2006-08-15 00:39) [18][17] DiamondShark © (15.08.06 00:37)
Кидаю на TPanel...
← →
DiamondShark © (2006-08-15 00:45) [19]Чудес не бывает.
У меня минимальный наследник:
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:51) [20][19] DiamondShark © (15.08.06 00:45)
Что-то не помогает приближение...
← →
DiamondShark © (2006-08-15 00:52) [21]Присваивание Parent уже реализовано в недрах VCL
← →
DiamondShark © (2006-08-15 00:53) [22]Даже минимальный наследник не работает? =-0
← →
lookin © (2006-08-15 00:54) [23]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:56) [24]constructor TEqapColorBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Parent:=AOwner as TWinControl; IsCreated:=false;
Paint; IsCreated:=true; Resize;
end;
Выкинуть и обратно не вставлять.
← →
DiamondShark © (2006-08-15 01:00) [25]Скопировал всё кроме конструктора.
Все работает как надо.
← →
lookin © (2006-08-15 01:00) [26][24] DiamondShark © (15.08.06 00:56)
Пьтрясающе! Все работает.... Теперь - а почему?
← →
lookin © (2006-08-15 01:01) [27]Я полагал, что ресайзинг и прорисовку следует вручную вызывать при создании компонента...
← →
DiamondShark © (2006-08-15 01:05) [28]
> Теперь - а почему?
constructor TEqapColorBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ShowMessage(AOwner.Name);
end;
Скомпилировать. Запустить. Медитировать.
← →
lookin © (2006-08-15 01:09) [29][28] DiamondShark © (15.08.06 01:05)
Это ли не дефект среды? Да, показывает TForm1, хотя должен бы TPanel...
← →
DiamondShark © (2006-08-15 01:15) [30]
> Это ли не дефект среды?
Нет. Это фича. Так устроен дизайнер и механизм загрузки.
Овнером всегда назначается 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:17) [31][30] DiamondShark © (15.08.06 01:15)
Относительно понятно... Спасибо...
← →
DiamondShark © (2006-08-15 01:19) [32]
> Я полагал, что ресайзинг и прорисовку следует вручную вызывать
> при создании компонента...
Ни в коем случае :)
Они сами вызовутся, когда к тому будет необходимость.
(когда создадутся окна и придут нужные сообщения)
← →
DiamondShark © (2006-08-15 01:20) [33]
> lookin © (15.08.06 01:17) [31]
:-)
← →
Чапаев © (2006-08-15 09:41) [34]> Убирал как-то, ругалось все сильно непосредственно при кидании
> компонента на форму на отсутствие Parent window/control...
Рисуешь, не проверяя, есть ли на чём рисовать.
> Я полагал, что ресайзинг и прорисовку следует вручную вызывать
> при создании компонента...
Создание и прорисовка -- вещи довольно-таки невзаимосвязанные... ;-) Эх, позже ещё столкнёшься с загрузкой компонента из ресурса, вот тогда веселуха будет...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.045 c