Onay kutuları ve radyo düğmeleri ile TreeView

TTreeView Delphi bileşeni ("Win32" bileşen paleti sekmesinde bulunur), bir belgedeki başlıklar, bir dizindeki girdiler veya dosya ve dizinler gibi hiyerarşik öğe listesi bir disk.

Onay kutusu veya radyo düğmesi ile ağaç düğümü?

Delphi'nin TTeğerlendirmesi yerel olarak onay kutularını desteklemez ancak temeldeki WC_TREEVIEW kontrolü bunu destekler. İçin onay kutuları ekleyebilirsiniz. ağaç görünümü TTreeView öğesinin CreateParams prosedürünü geçersiz kılarak, kontrol için TVS_CHECKBOXES stilini belirterek. Sonuç şudur: düğümleri ağaç görünümünde onlara ekli onay kutuları olacaktır. Ayrıca, WC_TREEVIEW bu imagelist'i onay kutularını uygulamak için dahili olarak kullandığından StateImages özelliği artık kullanılamaz. Onay kutularını değiştirmek istiyorsanız, bunu kullanarak Mesaj gönder ya da TreeView_SetItem / TreeView_GetItem makroları itibaren CommCtrl.pas. WC_TREEVIEW, radyo düğmelerini değil, yalnızca onay kutularını destekler.

Bu makalede keşfedeceğiniz yaklaşım çok daha esnektir: onay kutularınız olabilir ve TTGörünümü değiştirmeden veya yeni bir tane oluşturmadan diğer düğümlerle istediğiniz şekilde karıştırılan radyo düğmeleri

instagram viewer
sınıf bu işi yapmak için. Ayrıca, StateImages görüntüleyicisine uygun görüntüleri ekleyerek onay kutuları / radyo düğmeleri için hangi görüntüleri kullanacağınıza kendiniz karar verirsiniz.

Onay Kutusu veya Radyo Düğmesi Ekleme

İnanabileceğinizin aksine, bunu başarmak oldukça basit Delphi. İşte çalışması için adımlar:

  1. TTreeview için bir görüntü listesi ("Win32" bileşen paleti sekmesindeki TImageList bileşeni) ayarlayın. Onay kutuları ve / veya radyo düğmeleri için işaretli ve denetlenmemiş durum (lar) için görüntüleri içeren StateImages özelliği.
  2. Ağaç görünümünde OnClick ve OnKeyDown olaylarında ToggleTreeViewCheckBoxes prosedürünü (aşağıya bakın) çağırın. ToggleTreeViewCheckBoxes yordamı, seçili düğümün StateIndex öğesini geçerli denetlenen / denetlenmeyen durumu yansıtacak şekilde değiştirir.

Ağaç görüşünüzü daha da profesyonel hale getirmek için durum görüntülerini değiştirmeden önce bir düğümün nereye tıklandığını kontrol etmelisiniz: yalnızca gerçek görüntü tıklandığında düğümü değiştirerek, kullanıcılarınız düğümü değiştirmeden yine de seçebilir durum.

Ayrıca, kullanıcılarınızın ağaç görünümünü genişletmesini / daralmasını istemiyorsanız, form OnShow olayında FullExpand yordamını çağırın ve ağaç görünümündeki OnCollapsing olayında AllowCollapse öğesini false olarak ayarlayın.

ToggleTreeViewCheckBoxes prosedürünün uygulanması şunlardır:

prosedür ToggleTreeViewCheckBoxes (
Düğüm: TTreeNode;
cUnChecked,
cChecked,
cRadioUnchecked,
cRadioChecked: integer);
var
tmp: TTreeNode;
beginif Atanmış (Düğüm) thenbeginif Düğüm. StateIndex = cUnChecked sonra
Düğüm. StateIndex: = cChecked
BaşkaEğer Düğüm. StateIndex = cChecked sonra
Düğüm. StateIndex: = cUnChecked
başka eğer Düğüm. StateIndex = cRadioUnChecked thenbegin
tmp: = Düğüm. Veli;
değilse Atandı (tmp) sonra
tmp: = TTreeView (Düğüm. TreeView) .Items.getFirstNode
Başka
tmp: = tmp.getFirstChild;
süre Atandı (tmp) dobeginif (Tmp. stateindex içinde
[cRadioUnChecked, cRadioChecked]) sonra
tmp. StateIndex: = cRadioUnChecked;
tmp: = tmp.getNextSibling;
son;
Düğüm. StateIndex: = cRadioChecked;
son; // StateIndex = cRadioUnChecked iseson; // Atandıysa (Düğüm)
son; (* ToggleTreeViewCheckBoxes *)

Yukarıdaki koddan da görebileceğiniz gibi, herhangi bir onay kutusu düğümünü bularak ve sadece açıp kapatarak prosedür başlar. Ardından, düğüm denetlenmeyen bir radyo düğmesiyse, yordam geçerli düzeydeki ilk düğüme gider, tüm düğümleri ayarlar bu düzeyde cRadioUnchecked (cRadioUnChecked veya cRadioChecked düğümleri ise) ve son olarak Düğümü cRadioChecked.

Önceden kontrol edilen radyo düğmelerinin nasıl göz ardı edildiğine dikkat edin. Açıkçası, bunun nedeni zaten kontrol edilmiş bir radyo düğmesinin işaretsiz hale getirilmesi ve düğümlerin tanımlanmamış bir durumda kalmasıdır. Çoğu zaman ne istersiniz.

Kodu nasıl daha profesyonel hale getirebileceğiniz aşağıda açıklanmıştır: Treeview'ün OnClick etkinliğinde, aşağıdaki kodu yalnızca durum görüntüsü tıklanmışsa onay kutuları (cFlatUnCheck, cFlatChecked vb sabitleri başka bir yerde StateImages dizinleri olarak tanımlanır resim listesi):

prosedür TForm1.TreeView1Click (Gönderen: TObject);
var
P: TPoint;
başla
GetCursorPos (P);
P: = TreeView1.ScreenToClient (P);
Eğer (htOnStateIcon içinde
TreeView1.GetHitTestInfoAt (P.X, P.Y)) sonra
ToggleTreeViewCheckBoxes (
TreeView1.Selected,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
) CFlatRadioChecked;
son; (* TreeView1Click *)

Kod geçerli fare konumunu alır, ağaç görünümü koordinatlarına dönüştürür ve GetHitTestInfoAt işlevini çağırarak StateIcon öğesinin tıklanıp tıklanmadığını denetler. Eğer öyleyse, geçiş prosedürü çağrılır.

Çoğunlukla, boşluk çubuğunun onay kutularını veya radyo düğmelerini değiştirmesini beklersiniz, bu nedenle TreeView OnKeyDown olayını bu standardı kullanarak nasıl yazabilirsiniz:

prosedür TForm1.TreeView1KeyDown (
Gönderen: TObject;
var Anahtar: Kelime;
Shift: TShiftState);
beginif (Anahtar = VK_SPACE) ve
Atandı (TreeView1.Selected) sonra
ToggleTreeViewCheckBoxes (
TreeView1.Selected,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
) CFlatRadioChecked;
son; (* TreeView1KeyDown *)

Son olarak, treeview düğümlerinin çökmesini önlemek istiyorsanız formun OnShow ve Treeview's OnChanging olayları şöyle görünebilir:

prosedür TForm1.FormCreate (Gönderen: TObject);
başla
TreeView1.FullExpand;
son; (* FormCreate *)
prosedür TForm1.TreeView1Collapsing (
Gönderen: TObject;
Düğüm: TTreeNode;
var AllowCollapse: Boolean);
başla
AllowCollapse: = yanlış;
son; (* TreeView1Collapsing *)

Son olarak, bir düğümün kontrol edilip edilmediğini kontrol etmek için aşağıdaki karşılaştırmayı yapmanız yeterlidir (örneğin, bir Button'ın OnClick olay işleyicisinde):

prosedür TForm1.Button1Click (Gönderen: TObject);
var
BoolResult: boolean;
tn: TTreeNode;
beginif Atandı (TreeView1.Selected) thenbegin
tn: = TreeView1.Selected;
BoolResult: = tn. stateindex içinde
[cFlatChecked, cFlatRadioChecked];
Not: Metin: = tn. Metin +
#13#10 +
'Seçili:' +
BoolToStr (BoolResult, True);
son;
son; (* Button1Click *)

Bu tür kodlama kritik görev olarak görülmemesine rağmen, uygulamalarınıza daha profesyonel ve daha pürüzsüz bir görünüm kazandırabilir. Ayrıca, onay kutularını ve radyo düğmelerini akıllıca kullanarak uygulamanızın kullanımını kolaylaştırabilirler. Kesinlikle iyi görünecekler!

Aşağıdaki resim, bu makalede açıklanan kod kullanılarak bir test uygulamasından alınmıştır. Gördüğünüz gibi, "boş" düğümleri "ile karıştırmamalısınız, ancak onay kutularına veya radyo düğmelerine sahip düğümleri, hiçbiri olmayanlarla serbestçe karıştırabilirsiniz.Onay kutusu"düğümler (görüntüdeki radyo düğmelerine bir göz atın), çünkü bu hangi düğümlerin ilişkili olduğunu görmeyi zorlaştırır.