Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Navigation mit TreeView (https://www.delphipraxis.net/106635-navigation-mit-treeview.html)

rayj 14. Jan 2008 10:52


Navigation mit TreeView
 
Guten Tag!
Ich hätte eine Anfängerfrage als neuer Programmierer.
Und zwar sieht man ja sehr oft, dass TreeViews als Navigation eingesetzt werden, z.B. sehr oft in Einstellung-Forms oder bei Verwaltungen von vielen Objekten etc.

Ich frage mich nur, wie man das am besten anstellt, dass sich dann beim klicken in der TreeView ein neuer Inhalt lädt.

Angenommen, die TreeView sieht so aus:

Zitat:

-Einstellungen
---Drucker
---Datenbank
-Status
-Sonstiges
Welche Komponente soll ich nun sozusagen als Content verwenden?
Dass man z.B. für jedes TreeView Item ein Panel/GroupBox macht und dann immer nur dieses einblendet welches man gerade anklickt ist ja nicht sehr sauber :gruebel:

Kann mir jemand helfen?

Freundliche Grüsse
Kevin

Aurelius 14. Jan 2008 10:57

Re: Navigation mit TreeView
 
Entweder mit Frames die du dann jeweils in ein Panel lädst oder du nutzt ein Pagecontrol mit unsichtbaren Tabsheets.

rayj 14. Jan 2008 11:00

Re: Navigation mit TreeView
 
Zitat:

Zitat von xX0815Xx
Entweder mit Frames die du dann jeweils in ein Panel lädst oder du nutzt ein Pagecontrol mit unsichtbaren Tabsheets.

Grüss Dich
Danke, die Idee kam mir auch schon. Allerdings finde ich keine Option um die TabSheet Anzeige oben ausblenden zu lassen.
MFG Kevin

Aurelius 14. Jan 2008 11:02

Re: Navigation mit TreeView
 
Bei den Eigenschaften des Tabsheets steht irgendwo "TabVisible" (oder so ähnlich). Das einfach auf false setzen.

moonwhaler 14. Jan 2008 11:30

Re: Navigation mit TreeView
 
Liste der Anhänge anzeigen (Anzahl: 1)
Um so etwas zu lösen, habe ich die Komponente "TNotebook" in Verbindung mit einem normalen "TTreeView" verwendet. Wird eine neue Seite hinzugefügt, dann wird dies in eine Eigenschaft "Pages" (vom Typ "TStrings") hinterlegt, d.h. der "Count" wird entsprechend erhöht. Eine super Sache, wenn man dies mit einem "OnChange" bei dem TreeView verknüpft:

Delphi-Quellcode:
procedure TfrmSettings.tv_configChange(Sender: TObject; Node: TTreeNode);
begin
  // Automatically select the correct "tab" by using the (image) state-index
  // from the tree-element
  nb_config.PageIndex := tv_config.Selected.StateIndex;
end;
Ist ein wenig Gewurstel, da ich als "PageIndex" (im Notebook) den "StateIndex" des aktuell gewählten Tree-Items verwende. Was aber eigentlich super funktioniert, nur vorher zugewiesen werden muss:

Delphi-Quellcode:
procedure TfrmSettings.BuildConfigurationTree( Tree: TTntTreeView );
var
  ParentNode: TTntTreeNode;
  Owner: TTntTreeNodes;

  function AddNewConfigItem( Parent: TTntTreeNode;
                             Text: WideString;
                             StateIndex: Integer ): TTntTreeNode;
  var
    Owner: TTntTreeNodes;
  begin
    Owner := tv_config.Items;

    result := Owner.AddChild( Parent, Text );
    result.ImageIndex := -1;
    result.SelectedIndex := -1;
    result.StateIndex := StateIndex;
  end;

begin
  Owner := Tree.Items;
  Owner.BeginUpdate;

  try
    try
      // Delete all current tree items
      Owner.Clear;

      //General
      ParentNode := AddNewConfigItem( nil, _( 'General' ), -1 );
      AddNewConfigItem( ParentNode, _( 'Workstation' ), 0 );
      AddNewConfigItem( ParentNode, _( 'Display' ), 1 );
      AddNewConfigItem( ParentNode, _( 'Sound effects' ), 2 );
      AddNewConfigItem( ParentNode, _( 'Logging' ), 3 );

      // Interfaces
      ParentNode := AddNewConfigItem( nil, _( 'Interfaces' ), -1 );
      AddNewConfigItem( ParentNode, _( 'Scanner' ), 4 );

      // OIP
      ParentNode := AddNewConfigItem( nil, _( 'OIP' ), -1 );
      AddNewConfigItem( ParentNode, _( 'Directories' ), 5 );
      AddNewConfigItem( ParentNode, _( 'Printer' ), 6 );
    finally
      Owner.EndUpdate;
    end;
  except
    Owner.Owner.Invalidate; // force repaint on exception
    raise;
  end;
end;
Is ne feine Sache (siehe Anhang), aber ich weiß nicht, ob das der Königsweg ist...

rayj 14. Jan 2008 11:36

Re: Navigation mit TreeView
 
Vielen Dank euch beiden!
Ich werde beides mal versuchen.

MfG Kevin

raiguen 14. Jan 2008 11:45

Re: Navigation mit TreeView
 
:gruebel:
Zitat:

Zitat von moonwhlaer
die Komponente "TNotebook"

Meine, irgendwo mal geslesen zu haben, dass diese Komponente nur noch aus Abwärtskompabilitätsgründen verwendet werden soll?? :gruebel: oder ist das etwa schon wieder veraltet???

Also, mit TPageControl kann man das auch gut hinbekommen, vorzugsweise im FormCreate oder FormActivate :
Delphi-Quellcode:
//--alle Tabs verbergen
for i := 0 to PageControl1.PageCount -1 do
  PageControl1.Pages[i].TabVisible := false;
WICHTIG!! --> die Eigenschaft TabVisible NICHT im OI setzen, da sonst im Entwurfsmodus die TabSheets nicht mehr zu sehen sind ;)

Anzeigen des entsprechenden TabSheets
Delphi-Quellcode:
PageControl1.ActivePageIndex := ...

rayj 14. Jan 2008 11:47

Re: Navigation mit TreeView
 
Zitat:

Zitat von raiguen
]WICHTIG!! --> die Eigenschaft TabVisible NICHT im OI setzen, da sonst im Entwurfsmodus die TabSheets nicht mehr zu sehen sind ;)

Der Hinweis war klasse, habe mich schon darüber aufgeregt da dies sonst etwas unpraktisch wäre ohne der Übersicht im OI :)

Werde die Notebook Variante trotzdem auch mal versuchen.

:dp:

rayj 14. Jan 2008 12:12

Re: Navigation mit TreeView
 
Ok hab es mit beidem hinbekommen :thumb:
Vielen Dank!


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz