Я пытаюсь создать невизуальный компонент Delphi, который может содержать некоторые визуальные компоненты.
Во время разработки я создаю собственный TPanel, чтобы я мог поместить в него свои визуальные компоненты, а затем я пытаюсь получить эти элементы управления из TPanel и сохранить их в другом компоненте.
Это моя пользовательская панель
TDesignTimePanel = class(TPanel)
private
FPanel: TPanelDialogo;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
function GetChildOwner: TComponent; override;
end
Метод GetChildren ничего не делает, так как я не хочу писать эту панель традиционным способом в файле DFM. Метод GetChildOwner возвращает TPanelDialogo, где я хочу сохранить визуальные элементы управления.
И это компонент, в котором я хочу сохранить элементы управления из TDesignTimePanel
TPanelDialogo = class(TComponent)
private
FDesignPanel: TDesignTimePanel;
procedure VolcarFrameEnLista();
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function CrearPanel(AOwner: TComponent): TPanel;
procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
function GetChildOwner: TComponent; override;
end;
Я создаю пользовательскую панель таким образом
function TPanelDialogo.CrearPanel(AOwner: TComponent): TPanel;
var
i: integer;
Componente : TControl;
begin
if FDesignPanel = nil then
begin
FDesignPanel := TDesignTimePanel.Create(self);
FDesignPanel.AsociarPanel( self );
end;
FDesignPanel.Name := Name + '_frame';
FDesignPanel.Left := FX;
// some other config
FDesignPanel.Parent := Owner as TWinControl;
FDesignPanel.Show;
Result := FDesignPanel;
end;
Итак, мой метод GetChildren делает следующее, где VolcarFrameEnLista - это метод, в котором я беру элементы управления из объекта TDesignTimePanel и сохраняю их в TPanelDialogo (FListaComponentes - это TComponentList)
procedure TPanelDialogo.GetChildren(Proc: TGetChildProc; Root: TComponent);
var
i: integer;
OwnedComponent: TComponent;
begin
if FDesignPanel <> nil then
begin
VolcarFrameEnLista();
if Root = Self then
for i := 0 to self.FListaComponentes.Count - 1 do
begin
OwnedComponent := FListaComponentes.Items[i];
Proc(OwnedComponent);
end;
end;
end;
procedure TPanelDialogo.VolcarFrameEnLista( );
var
i: integer;
Componente: TControl;
begin
for i := FDesignPanel.ControlCount - 1 downto 0 do
begin
Componente := FDesignPanel.Controls[i];
if Pos( self.Name + '_', Componente.Name ) = 0 then
begin
Componente.Name := self.Name + '_' + Componente.Name;
end;
Componente.Parent := nil;
if FListaComponentes.IndexOf(Componente) < 0 then
begin
FListaComponentes.Add( Componente );
end;
end;
end;
Я хочу, чтобы у моего DFM было что-то вроде этого:
object Form1: TForm1
object PanelDialogo1: TPanelDialogo
Left = 712
// ...
object PanelDialogo1_Label1: TLabel
Left = 88
// ..
end
object PanelDialogo1_Label2: TLabel
Left = 40
// ..
end
end
end
Но я получаю что-то вроде этого
object Form1: TForm1
object PanelDialogo1: TPanelDialogo
Left = 712
// ...
end
object PanelDialogo1_Label1: TLabel
Left = 88
// ..
end
object PanelDialogo1_Label2: TLabel
Left = 40
// ..
end
end
Что я должен сделать, чтобы TPanelDialogo стал «владельцем» компонентов, нарисованных на TDesignTimePanel.