TreeView mit Kontrollkästchen und Optionsfeldern

Die TTreeView Delphi-Komponente (auf der Registerkarte "Win32" -Komponentenpalette) stellt ein Fenster dar, in dem a angezeigt wird hierarchische Liste von Elementen, z. B. die Überschriften in einem Dokument, die Einträge in einem Index oder die Dateien und Verzeichnisse in eine Festplatte.

Baumknoten mit Kontrollkästchen oder Optionsfeld?

Delphis TTreeview unterstützt keine Kontrollkästchen von Haus aus, das zugrunde liegende WC_TREEVIEW-Steuerelement jedoch. Sie können dem Kontrollkästchen hinzufügen Baumsicht durch Überschreiben der CreateParams-Prozedur von TTreeView und Angeben des TVS_CHECKBOXES-Stils für das Steuerelement. Das Ergebnis ist das alles Knoten In der Baumansicht sind Kontrollkästchen angehängt. Darüber hinaus kann die StateImages-Eigenschaft nicht mehr verwendet werden, da WC_TREEVIEW diese Imageliste intern verwendet, um Kontrollkästchen zu implementieren. Wenn Sie die Kontrollkästchen umschalten möchten, müssen Sie dies mit tun Nachricht senden oder der TreeView_SetItem / TreeView_GetItem-Makros

instagram viewer
von CommCtrl.pas. Das WC_TREEVIEW unterstützt nur Kontrollkästchen, keine Optionsfelder.

Der Ansatz, den Sie in diesem Artikel entdecken, ist viel flexibler: Sie können Kontrollkästchen und haben Optionsfelder werden beliebig mit anderen Knoten gemischt, ohne die TTreeview zu ändern oder eine neue zu erstellen Klasse davon, um diese Arbeit zu machen. Außerdem entscheiden Sie selbst, welche Bilder für die Kontrollkästchen / Radiobuttons verwendet werden sollen, indem Sie der StateImages-Imageliste die richtigen Bilder hinzufügen.

Fügen Sie ein Kontrollkästchen oder ein Optionsfeld hinzu

Im Gegensatz zu dem, was Sie vielleicht glauben, ist dies recht einfach zu erreichen Delphi. Hier sind die Schritte, damit es funktioniert:

  1. Richten Sie eine Bildliste (TImageList-Komponente auf der Registerkarte "Win32" -Komponentenpalette) für TTreeview ein. StateImages-Eigenschaft, die die Bilder für die aktivierten und nicht aktivierten Status für Kontrollkästchen und / oder Optionsfelder enthält.
  2. Rufen Sie die Prozedur ToggleTreeViewCheckBoxes (siehe unten) in den Ereignissen OnClick und OnKeyDown der Baumansicht auf. Die Prozedur ToggleTreeViewCheckBoxes ändert den StateIndex des ausgewählten Knotens, um den aktuell aktivierten / nicht aktivierten Status wiederzugeben.

Um Ihre Baumansicht noch professioneller zu gestalten, sollten Sie überprüfen, wo auf einen Knoten geklickt wird, bevor Sie die Statusbilder umschalten: Indem Sie den Knoten nur umschalten, wenn auf das tatsächliche Bild geklickt wird, können Ihre Benutzer den Knoten weiterhin auswählen, ohne ihn zu ändern Zustand.

Wenn Sie nicht möchten, dass Ihre Benutzer die Baumansicht erweitern / reduzieren, rufen Sie die FullExpand-Prozedur im OnShow-Ereignis des Formulars auf und setzen Sie AllowCollapse im OnCollapsing-Ereignis der Baumansicht auf false.

Hier ist die Implementierung der ToggleTreeViewCheckBoxes-Prozedur:

Verfahren ToggleTreeViewCheckBoxes (
Knoten: TTreeNode;
cUnChecked,
Geprüft,
cRadioUnchecked,
cRadioChecked: Ganzzahl);
var
tmp: TTreeNode;
beginif Zugewiesen (Knoten) thenbeginif Knoten. StateIndex = cUnChecked dann
Knoten. StateIndex: = cChecked
sonstwenn Knoten. StateIndex = cChecked dann
Knoten. StateIndex: = cUnChecked
sonst wenn Knoten. StateIndex = cRadioUnChecked dann fang an
tmp: = Knoten. Elternteil;
wenn nicht Zugewiesen (tmp) dann
tmp: = TTreeView (Knoten. TreeView) .Items.getFirstNode
sonst
tmp: = tmp.getFirstChild;
während Zugewiesen (tmp) Dobeginif (tmp. StateIndex im
[cRadioUnChecked, cRadioChecked]) dann
tmp. StateIndex: = cRadioUnChecked;
tmp: = tmp.getNextSibling;
Ende;
Knoten. StateIndex: = cRadioChecked;
Ende; // wenn StateIndex = cRadioUnCheckedEnde; // falls zugewiesen (Knoten)
Ende; (* ToggleTreeViewCheckBoxes *)

Wie Sie dem obigen Code entnehmen können, beginnt die Prozedur damit, alle Kontrollkästchenknoten zu finden und sie einfach ein- oder auszuschalten. Wenn der Knoten ein deaktiviertes Optionsfeld ist, wird die Prozedur zum ersten Knoten auf der aktuellen Ebene verschoben und alle Knoten festgelegt auf dieser Ebene auf cRadioUnchecked (wenn es sich um cRadioUnChecked- oder cRadioChecked-Knoten handelt) und schaltet schließlich Node auf um cRadioChecked.

Beachten Sie, wie bereits aktivierte Optionsfelder ignoriert werden. Dies liegt offensichtlich daran, dass ein bereits markiertes Optionsfeld deaktiviert wird, wodurch die Knoten in einem undefinierten Zustand belassen werden. Kaum was Sie die meiste Zeit wollen würden.

So machen Sie den Code noch professioneller: Schreiben Sie im OnClick-Ereignis der Baumansicht den folgenden Code, um nur den Code umzuschalten Kontrollkästchen, wenn auf das Statusbild geklickt wurde (die Konstanten cFlatUnCheck, cFlatChecked usw. werden an anderer Stelle als Indizes in den StateImages definiert Bildliste):

Verfahren TForm1.TreeView1Click (Absender: TObject);
var
P: TPoint;
Start
GetCursorPos (P);
P: = TreeView1.ScreenToClient (P);
wenn (htOnStateIcon im
TreeView1.GetHitTestInfoAt (P.X, P.Y)) dann
ToggleTreeViewCheckBoxes (
TreeView1.Selected,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadioChecked);
Ende; (* TreeView1Click *)

Der Code erhält die aktuelle Mausposition, konvertiert in Baumansichtskoordinaten und überprüft durch Aufrufen der Funktion GetHitTestInfoAt, ob auf das StateIcon geklickt wurde. Wenn dies der Fall ist, wird das Umschaltverfahren aufgerufen.

Meistens würde man erwarten, dass die Leertaste Kontrollkästchen oder Optionsfelder umschaltet. So schreiben Sie das TreeView OnKeyDown-Ereignis mit diesem Standard:

Verfahren TForm1.TreeView1KeyDown (
Absender: TObject;
var Schlüssel: Wort;
Shift: TShiftState);
beginif (Schlüssel = VK_SPACE) und
Zugewiesen (TreeView1.Selected) dann
ToggleTreeViewCheckBoxes (
TreeView1.Selected,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadioChecked);
Ende; (* TreeView1KeyDown *)

Schließlich sehen Sie, wie die OnShow- und OnChanging-Ereignisse des Formulars aussehen könnten, wenn Sie das Zusammenfallen der Knoten der Baumansicht verhindern möchten:

Verfahren TForm1.FormCreate (Absender: TObject);
Start
TreeView1.FullExpand;
Ende; (* FormCreate *)
Verfahren TForm1.TreeView1Collapsing (
Absender: TObject;
Knoten: TTreeNode;
var AllowCollapse: Boolean);
Start
AllowCollapse: = false;
Ende; (* TreeView1Collapsing *)

Um zu überprüfen, ob ein Knoten überprüft wurde, führen Sie einfach den folgenden Vergleich durch (z. B. im OnClick-Ereignishandler eines Buttons):

Verfahren TForm1.Button1Click (Absender: TObject);
var
BoolResult: boolean;
tn: TTreeNode;
beginif Zugewiesen (TreeView1.Selected) dann fang an
tn: = TreeView1.Selected;
BoolResult: = tn. StateIndex im
[cFlatChecked, cFlatRadioChecked];
Memo1.Text: = tn. Text +
#13#10 +
'Ausgewählt:' +
BoolToStr (BoolResult, True);
Ende;
Ende; (* Button1Click *)

Obwohl diese Art der Codierung nicht als geschäftskritisch angesehen werden kann, kann sie Ihren Anwendungen ein professionelleres und flüssigeres Aussehen verleihen. Wenn Sie die Kontrollkästchen und Optionsfelder mit Bedacht verwenden, können Sie die Verwendung Ihrer Anwendung vereinfachen. Sie werden sicher gut aussehen!

Dieses Bild unten wurde aus einer Test-App mit dem in diesem Artikel beschriebenen Code aufgenommen. Wie Sie sehen können, können Sie Knoten mit Kontrollkästchen oder Optionsfeldern frei mit Knoten ohne Kontrollkästchen mischen, obwohl Sie "leere" Knoten nicht mit "mischen sollten.Kontrollkästchen"Knoten (sehen Sie sich die Optionsfelder im Bild an), da dies es sehr schwierig macht zu erkennen, welche Knoten zusammenhängen.