Показать сообщение отдельно
  #2  
Старый 06.03.2013, 23:21
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от 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;
Ответить с цитированием