Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.24;
Скачать: CL | DM;

Вниз

Компонент на основе 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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.032 c
2-1157114544
VitV
2006-09-01 16:42
2006.09.24
FastReport-подсчёт количества строк


4-1148470794
Nostradamus
2006-05-24 15:39
2006.09.24
моя DLL подгружается другими приложениями


3-1153900271
miammiam
2006-07-26 11:51
2006.09.24
Нужно перенести данные из одной DBF в другую DBF таблицу


15-1156922134
Змей
2006-08-30 11:15
2006.09.24
литература по апи


2-1157620454
Павлуха
2006-09-07 13:14
2006.09.24
не могу разобраться