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-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.


Страницы:   1 2

Наверх

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