Цитата:
Сообщение от kolyan2288
посоветуйте мне как это реализовать более удобным способом, спасибо
|
Фреймы спасут отца русской демократии.
TFrame, это практически форма, но не может существовать самостоятельно. При переключении по узлам "убиваешь" существующий фрейм и создаешь соотв. текущему узлу и кладешь его на нужный контейнер. Вот пример из моего проекта:
Код:
type
TDialogMode = (dmNew, dmEdit);
TServerForm = class(TForm)
pnButtons: TPanel;
pnBody: TPanel;
btOK: TButton;
btCancel: TButton;
bvButtons: TBevel;
tvPages: TTreeView;
gbPage: TGroupBox;
ilPages: TImageList;
pnPage: TPanel;
procedure tvPagesCollapsing(Sender: TObject; Node: TTreeNode;
var AllowCollapse: Boolean);
procedure tvPagesChange(Sender: TObject; Node: TTreeNode);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure tvPagesChanging(Sender: TObject; Node: TTreeNode;
var AllowChange: Boolean);
procedure btOKClick(Sender: TObject);
private
{ Private declarations }
FItem : TModelItem;
FFrame : TServerBaseFrame;
FSelectedNode : TTreeNode;
procedure ClosePage;
procedure ShowPage;
public
{ Public declarations }
function Execute(ADialogMode : TDialogMode; var AItem : TModelItem) : Boolean;
end;
var
ServerForm: TServerForm;
implementation
{$R *.dfm}
{ TServerForm }
function TServerForm.Execute(ADialogMode: TDialogMode;
var AItem: TModelItem): Boolean;
var
I : Integer;
begin
For I := 0 To tvPages.Items.Count-1 Do
tvPages.Items[i].Expand(True);
Case ADialogMode Of
dmNew : Caption := 'New server';
dmEdit : Caption := 'Edit server';
End;
FItem.Assign(AItem);
tvPages.Selected := tvPages.Items[0];
Result := ShowModal = mrOK;
If Result Then
AItem.Assign(FItem);
end;
procedure TServerForm.tvPagesCollapsing(Sender: TObject; Node: TTreeNode;
var AllowCollapse: Boolean);
begin
AllowCollapse := False;
end;
procedure TServerForm.FormCreate(Sender: TObject);
begin
FItem := TModelItem.Create;
FFrame := Nil;
FSelectedNode := Nil;
end;
procedure TServerForm.FormDestroy(Sender: TObject);
begin
FreeAndNil(FItem);
end;
procedure TServerForm.tvPagesChange(Sender: TObject; Node: TTreeNode);
begin
If FSelectedNode <> tvPages.Selected Then
Begin
ClosePage;
FSelectedNode := tvPages.Selected;
ShowPage;
End;
end;
procedure TServerForm.ShowPage;
begin
// Open new frame
If FSelectedNode <> Nil Then
Begin
//gbPage.Caption := FSelectedNode.Text;
FFrame := CreateFrame(FSelectedNode.ImageIndex);
If FFrame <> Nil Then
Begin
FFrame.LoadServer(FItem);
FFrame.Parent := pnPage;
FFrame.Align := alClient;
End;
End;
end;
procedure TServerForm.ClosePage;
begin
// Save current values and destroy current frame
If FFrame <> Nil Then
Begin
FFrame.SaveServer(FItem);
FFrame.Align := alNone;
FFrame.Parent := Nil;
FreeAndNil(FFrame);
End;
end;
procedure TServerForm.tvPagesChanging(Sender: TObject; Node: TTreeNode;
var AllowChange: Boolean);
begin
AllowChange := True;
If FFrame <> Nil Then
AllowChange := FFrame.CanClose;
end;
procedure TServerForm.btOKClick(Sender: TObject);
begin
If FFrame = Nil
Then ModalResult := mrOK
Else
If FFrame.CanClose Then
Begin
FFrame.SaveServer(FItem);
ModalResult := mrOK;
End;
end;