![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Компонент на основе TCustomPanel: свойство Parent
lookin © (2006-08-14 22:20:00)Имеется компонент, построенный на основе TCustomPanel. При помещении на форму он размещается только на форме, но не в контроле (TWinControl), на который я его кидаю. Вопрос - почему? Заранее спасибо.
Чапаев (2006-08-14 23:58:00) [21]Ну в общем распространённая ошибка новичков. Просто усвой, что хозяин окна совсем не обязан совпадать с его родителем. Присваивать Parent=Owner не только бессмысленно, но и опасно временами: контролу командуют прорисоваться, а он ещё окно не создал, хэндла нету, и так далее... В общем, строчку с присвоением Парента из конструктора просто убери...
lookin (2006-08-14 23:51:00) [22][12] Чапаев © (14.08.06 23:15)
А что там не так?
Чапаев (2006-08-14 23:15:00) [23]> Parent:=AOwner as TWinControl;
С ума сошёл!
Подумай хорошенько над этой строчкой. ;-)
lookin (2006-08-14 23:10:00) [24][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:01:00) [25]> [9] lookin © (14.08.06 22:47)
Тьфу. Грешное с праведным попутал. Я имел в виду, что Parent объявлен в TControl. Хотя к чему я это имел в виду, сам не знаю... %-) Денёк трудный выдался...
> ControlStyle:=ControlStyle+[csAcceptsControls];
Всё-таки csAcceptControls отвечает за то, примет ли контрол "детей", а не может ли он сам дитём быть. Имхо csAcceptControls тут ни при чём.
Приведи полный код конструктора и процедуры отрисовки.
lookin (2006-08-14 22:47:00) [26][7] Чапаев © (14.08.06 22:45)
Из справки - TControl.Parent: TWinControl...
lookin (2006-08-14 22:45:00) [27][4] DiamondShark © (14.08.06 22:41)
В Create я написал так:
ControlStyle:=ControlStyle+[csAcceptsControls];
Parent:=AOwner as TWinControl;
И тем не менее не помогает... Хотя статья о csAcceptsControls дает лично мне представление, что это именно то, что надо...
Чапаев (2006-08-14 22:45:00) [28]> Parent - это все же именно TwInControl, а не TControl....
Неверно.
lookin (2006-08-14 22:42:00) [29][4] DiamondShark © (14.08.06 22:41)
Не стоит. Первый раз о таком услышал... Сейчас прочитаю...
lookin (2006-08-14 22:42:00) [30][1] tesseract © (14.08.06 22:33)
Насколько я могу судить, Parent - это все же именно TwInControl, а не TControl....
DiamondShark (2006-08-14 22:41:00) [31]А csAcceptsControls у того контрола стоит?
lookin (2006-08-14 22:41:00) [32]Так. Он размещается на нужном контроле, если после первого помещения компонента на форму (а он привязывается к ней) сделать "вырезать-вставить на контрол". Иначе говоря, при щелчке на компонент и перетягивании на форму (и отпускании на контроле), он падает все же на форму. А вот затем средствами среды Дельфи его можно свободно поместить на нужный контрол
Чапаев (2006-08-14 22:34:00) [33]> Вопрос - почему?
В коде компонента ошибка.
Как именно он отказывается разместиться на ВинКонтроле?
tesseract (2006-08-14 22:33:00) [34]> При помещении на форму он размещается только на форме, но
> не в контроле (TWinControl),
Нужен потомок TControl.