Комбинированный визуальный компонент
Модератор: Модераторы
Комбинированный визуальный компонент
Хотелось бы создать комбинированный визуальный компонент который может иметь потомков, но что бы родителем потомков становился не сам компонент, а встроенная в него для этих целей панель.
То есть допустим я наследую свой компонент от TCustomControl, далее внутри этого компонента объявляю кнопку, заголовок и встроенную панель, их я создаю в конструкторе своего компонента и располагаю на нём.
Если я определю свойство своего компонента иметь потомков ControlStyle:=[csAcceptsControls], эти потомки будут ложиться именно на мой компонент а не на встроенную панель, смогут перекрывать кнопку и заголовок...
Как сделать так что бы потомки ложились на встроенную панель не знаю. Подскажите пожалуйста как подойти к решению этой задачи.
Прилагаю пример:
То есть допустим я наследую свой компонент от TCustomControl, далее внутри этого компонента объявляю кнопку, заголовок и встроенную панель, их я создаю в конструкторе своего компонента и располагаю на нём.
Если я определю свойство своего компонента иметь потомков ControlStyle:=[csAcceptsControls], эти потомки будут ложиться именно на мой компонент а не на встроенную панель, смогут перекрывать кнопку и заголовок...
Как сделать так что бы потомки ложились на встроенную панель не знаю. Подскажите пожалуйста как подойти к решению этой задачи.
Прилагаю пример:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
свойство Parent.
Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Panel1: TPanel;
procedure Button1Click(Sender: TObject);
private
tstButton: TButton;
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
tstButton:=TButton.Create(Self); //< кто владелей сомпанента (чье удаление приведет к уничтожению tstButton)
tstButton.Parent:=Panel1; //< "на ком лежим"
end;
end.iN0k писал(а):свойство Parent.
Нет, ты меня не понял. Я создаю компонент, который компилирую и устанавливаю в Лазарус, потом перенашу мышкой его на форму, и хочу на него помещать другие компоненты, но что бы они оказывались не на самом компоненте, а на встроенной в него панели. Как это сделать?
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
qivi, тебе же сказали -- свойство Parent.
Ну тогда я не понял, можно поразвёрнутее?
Нет, не понял что имеется в виду на счёт парента, практически уверен что Вы не поняли сути вопроса. Откройте мой пример, откомпилируйте, вот он комбинированный компонент в сборе (TMKPanelSvitok), ложим его в режиме дизайнера на форму, в нём (если заглянете в код) есть панель которая может иметь потомков... как теперь на эту встроенную панель в режиме дизайнера положить любые другие контролы?
Нет, не понял что имеется в виду на счёт парента, практически уверен что Вы не поняли сути вопроса. Откройте мой пример, откомпилируйте, вот он комбинированный компонент в сборе (TMKPanelSvitok), ложим его в режиме дизайнера на форму, в нём (если заглянете в код) есть панель которая может иметь потомков... как теперь на эту встроенную панель в режиме дизайнера положить любые другие контролы?
Последний раз редактировалось qivi 20.01.2015 12:45:42, всего редактировалось 1 раз.
Лекс Айрин писал(а): тебе же сказали -- свойство Parent
ну это то понятно ...
вот прикрутил ...
Код: Выделить всё
procedure TMKPanelSvitok.ChildHandlesCreated; //override;// called after children handles are created
var i:integer;
begin
for i:=self.ControlCount-1 downto 0 do begin
if (self.Controls[i]<>Z) and (self.Controls[i]<>SB) and (self.Controls[i]<>P) then begin
self.Controls[i].Parent:=p;
end;
end;
end;но эта фигня работает при запуске, но не работает в дизайнере ...
методы связанные со вставкой "детей" для overrid я чет не нашел ...
iN0k спасибо за совет. Это уже интересно.
Я пытался чего ни будь подглядеть в табах и групбоксе...
но ничего не разобрал...
Кто ни будь ещё может подсказать как это довести доконца?
Я пытался чего ни будь подглядеть в табах и групбоксе...
Кто ни будь ещё может подсказать как это довести доконца?
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
qivi, в дизайнере есть, в подручном меню, пункт "Сменить родителя".
Я не знаю, в чем трабла, но у меня совершенно спокойно отрабатывает код:
Все прекрасно перемещается!!! Единственное, что чекбокс располагается не в том месте где я хотел, но не думаю, что это сильно затруднительно решить.
Тем более, что имя панели Вам известно при использовании Вашего компонента.
Я не знаю, в чем трабла, но у меня совершенно спокойно отрабатывает код:
Код: Выделить всё
FontItalic.Parent:=Panel4;Все прекрасно перемещается!!! Единственное, что чекбокс располагается не в том месте где я хотел, но не думаю, что это сильно затруднительно решить.
Тем более, что имя панели Вам известно при использовании Вашего компонента.
Лекс Айрин, вы загляните в мой пример и компильните его, вы совсем не о том говорите.
кстати ... таки нашел:
procedure TWinControl.InsertControl(AControl: TControl; Index: integer); virtual;
сделал его аналогично примеру выше ...
ну ... оно работает ... и в редакторе и в рантайме
но опять косяк (проясняющий причины и направления) ... в дизайнТайме, Object Inspektor, Companents tree ... кароче, он НЕ отображает внутреннюю структуру вашего компонента, и ВСЕ что лежит на внутренней панели тоже не покажет
то есть наверно два варианта:
1. как в табах с дополнительным компонентом аля tPage
2. ручная отрисовка гарницы, заголовка и кнопки как в ГроупБох
procedure TWinControl.InsertControl(AControl: TControl; Index: integer); virtual;
сделал его аналогично примеру выше ...
ну ... оно работает ... и в редакторе и в рантайме
но опять косяк (проясняющий причины и направления) ... в дизайнТайме, Object Inspektor, Companents tree ... кароче, он НЕ отображает внутреннюю структуру вашего компонента, и ВСЕ что лежит на внутренней панели тоже не покажет
то есть наверно два варианта:
1. как в табах с дополнительным компонентом аля tPage
2. ручная отрисовка гарницы, заголовка и кнопки как в ГроупБох
iN0k огромное тебе спасибо. Сам так глубоко ЛЦЛ не знаю.
Что то не даётся желаемый вариант, попробую по другому, немного попроще сделать.
Что то не даётся желаемый вариант, попробую по другому, немного попроще сделать.
