Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.53 MB
Время: 0.059 c
15-1157577798
не ББаба
2006-09-07 01:23
2006.09.24
Закрыть тему Прочее(Потрепаться)


2-1157438380
nstur
2006-09-05 10:39
2006.09.24
Как определить размер текста в TMemo


3-1153908793
Fishka
2006-07-26 14:13
2006.09.24
Interbase и кодировка при первой записи


2-1157371407
Ефимыч
2006-09-04 16:03
2006.09.24
Подскажите, как сделать, чтоб jpeg не компилировался в exe-шник?


1-1154450022
Tanya
2006-08-01 20:33
2006.09.24
Вытащить текст из дочернего окна





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский