Gelişmiş TreeView
Forum kuralları
Bu forum sadece yapacağınız işle alakalı doğru bileşeni bulmak içindir. Şöyle bir şey yapmam lazım, hangi bileşeni kullanıyım diyorsanız, doğru yerdesiniz.
Bu forum sadece yapacağınız işle alakalı doğru bileşeni bulmak içindir. Şöyle bir şey yapmam lazım, hangi bileşeni kullanıyım diyorsanız, doğru yerdesiniz.
Gelişmiş TreeView
S.A.
Kullanımı normal treeview gibi olan ama biraz daha gelişmiş bir treeview arıyorum.Mesela normal treeviewde bir node a sadece bir değer atayabiliyorum bunu ikiye çıkartmanın bir yolu var mı?Ayrıca savetofile yaptığımda sadece karakterler çıkıyor imageindex selectedindex gibi şeyleri kaydetmiyor.
Bu özelliklere ve fazlasına sahip olan bi Virtual Treeview var fakat oda çok zor bişey anlamadım.
Bu özelliklere sahip bildiğiniz bedava bir bileşen var mı?
Kullanımı normal treeview gibi olan ama biraz daha gelişmiş bir treeview arıyorum.Mesela normal treeviewde bir node a sadece bir değer atayabiliyorum bunu ikiye çıkartmanın bir yolu var mı?Ayrıca savetofile yaptığımda sadece karakterler çıkıyor imageindex selectedindex gibi şeyleri kaydetmiyor.
Bu özelliklere ve fazlasına sahip olan bi Virtual Treeview var fakat oda çok zor bişey anlamadım.
Bu özelliklere sahip bildiğiniz bedava bir bileşen var mı?
Allah herkesin sırtına kaldırabileceği kadar yük koyar
Her Node'un Data diye propertysi var. Bu özelliği kullanarak her node'a bir data bağlayabilirsiniz ve bu data'da istediğiniz kadar değer saklayabilirsiniz. Delphi Help'de bu tür kullanım için örnek mevcut.normal treeviewde bir node a sadece bir değer atayabiliyorum bunu ikiye çıkartmanın bir yolu var mı?
Eğer sorun oluşturmayacaksa SelectedIndex gibi değerleri ayrı bir dosyaya kaydedebilirsiniz. Eğer tek dosyaya kaydetmek istiyorsanız SaveToFile metodu yerine SaveToStream metodunu kullanıp, bu streamdeki ve selectedindex + diğer istediğiniz bilgileri kaydedebilirsiniz.Ayrıca savetofile yaptığımda sadece karakterler çıkıyor imageindex selectedindex gibi şeyleri kaydetmiyor.
Buna katılmıyorum, ilk bakışta çok karışık gibi geliyor ama bunun sebebi alıştığımız TTreeViewden çalışma prensibi olarak farklı olması. Takıldığınız konularda yardımcı olabilirim.Bu özelliklere ve fazlasına sahip olan bi Virtual Treeview var fakat oda çok zor bişey anlamadım.
İyi çalışmalar.
- sadettinpolat
- Moderator
- Mesajlar: 2131
- Kayıt: 07 Ara 2003 02:51
- Konum: Ankara
- İletişim:
Öncelikle cevaplarınız için teşekkürler.
Mesela ali6 ya tıkladığım zaman bana göstermesi gereken veli6 yerine veli$ mesajını gösteriyor.Pointerlar hakkında hiç tecrübem yok sizin dikkatinizi çeken bişey var mı?
Mesela master-detail olarak ilişkilendirilmiş iki tabloyu treeview'e eklemek istediğimde:
şeklinde bir kod yazıyorum,bunun basitçe Virtual Treeview karşılığı nedir?
http://www.marcocantu.com/md7/md7code.zip
İkinizede tekrar teşekkür ederim.
Data propertysi pointer tipinde. şöyle bir deneme yaptığımdaHer Node'un Data diye propertysi var. Bu özelliği kullanarak her node'a bir data bağlayabilirsiniz ve bu data'da istediğiniz kadar değer saklayabilirsiniz. Delphi Help'de bu tür kullanım için örnek mevcut.
Kod: Tümünü seç
procedure TForm1.Button1Click(Sender: TObject);
var
a:TTreeNode;
b:integer;
begin
for b:=0 to 10 do
begin
with TreeView1.Items.Add(nil,'ali'+IntToStr(b)) do
begin
Data:=pchar('veli'+inttostr(b));
end;
end;
end;
Kod: Tümünü seç
ShowMessage(pchar(TreeView1.Selected.data));
Takıldığım konu çok basit.Node eklemek.Buna katılmıyorum, ilk bakışta çok karışık gibi geliyor ama bunun sebebi alıştığımız TTreeViewden çalışma prensibi olarak farklı olması. Takıldığınız konularda yardımcı olabilirim.

Mesela master-detail olarak ilişkilendirilmiş iki tabloyu treeview'e eklemek istediğimde:
Kod: Tümünü seç
var
a:node;
begin
tblmaster.first;
tbldetail.first;
while not tblmaster.eof do
begin
a:=treeview1.items.add(nil,tblmasterISIM.Asstring);
a.imageindex:=3;
a.selectedindex:=3;
while not tbldetail.eof do
begin
treeview1.items.addchild(a,tbldetailSoyad.AsString);
tbldetail.next;
end;
tbldetail.next;
end;
Bahsettiğiniz örneği buldum.Eğer Marco Cantu'nun kitabı olmayan varsa bahsedilen örnek kendi sitesinde var(05\CustomNodes)delphi 7 de varolan node sınıfından yeni bir sınıf üreterek buna istediğiniz özellikleri verebilirsiniz. daha sonrada bu yeni nodeyi treeviewe ekleyebilirsiniz. marco cantu delphi 7 de vardı örneği.
http://www.marcocantu.com/md7/md7code.zip
İkinizede tekrar teşekkür ederim.
Allah herkesin sırtına kaldırabileceği kadar yük koyar
Nodelara data eklerken PChar kullanmayın çünkü her node'da datanın aynı boyutta olması lazım. onun yerine
buna benzer bir sınıf tanımlayın. Daha sonra
gibi bir kodla data bağlayabilirsiniz. hatta alan sayısını istediğiniz kadar artturabilirsiniz. Yalnız bu yarattığınız sınıfları hafızadan silmeyi atlamamnız lazım. Bunu da TreeView'in OnDelete olayını kullanarak yapabilirsiniz.
Virtual Tree Viewde verdiğiniz örnektekine benzer AddChild fonksiyonu var.
ama bu kullanım önerilen yöntem değil. Onun yerine OnInitNode, OnInitChildren olaylarına kod yazarak bu işin yapılması isteniyor.
Mesela, master tablodaki kadar kayıt eklemek için
kullanabilirsiniz. Bu durumda master tabloda kaç kayıt varsa onun kadar node eklenecek ve hemen onInitNode olayına yazdığınız kod çağrılacak. Örneğin
yazın ve açıldıkça açıldığını görün 
Kod: Tümünü seç
type
TNodeData = class
Adi :String;
Soyadi : String;
end;
Kod: Tümünü seç
node.Data := TNodeData.Create;
with TNodeData(node.Data) do begin
Adi := 'adi';
Soyadi := 'soyadi';
end;
Kod: Tümünü seç
procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
if assigned(Node.Data) then begin
TNodeData(Node.Data).Free;
Node.Data:=nil;
end;
end;
Kod: Tümünü seç
VAR
VTNode : PVirtualNode;
begin
VTNode := VirtualStringTree1.AddChild(VirtualStringTree1.RootNode);
VirtualStringTree1.AddChild(VTNode);
end;
Mesela, master tablodaki kadar kayıt eklemek için
Kod: Tümünü seç
VirtualStringTree1.RootNodeCount := tblMaster.RecordCount;
Kod: Tümünü seç
procedure TForm1.VirtualStringTree1InitNode(Sender: TBaseVirtualTree;
ParentNode, Node: PVirtualNode;
var InitialStates: TVirtualNodeInitStates);
begin
// bu node'un childnode'u olduğunu berlitmek için
InitialStates := InitialStates + [ivsHasChildren];
end;
procedure TForm1.VirtualStringTree1InitChildren(Sender: TBaseVirtualTree;
Node: PVirtualNode; var ChildCount: Cardinal);
begin
ChildCount := 5;
end;

Hocam node.data örneği için teşekkürler.İşimi gördüt-hex yazdı:Nodelara data eklerken PChar kullanmayın çünkü her node'da datanın aynı boyutta olması lazım. onun yerinebuna benzer bir sınıf tanımlayın. Daha sonraKod: Tümünü seç
type TNodeData = class Adi :String; Soyadi : String; end;
gibi bir kodla data bağlayabilirsiniz. hatta alan sayısını istediğiniz kadar artturabilirsiniz. Yalnız bu yarattığınız sınıfları hafızadan silmeyi atlamamnız lazım. Bunu da TreeView'in OnDelete olayını kullanarak yapabilirsiniz.Kod: Tümünü seç
node.Data := TNodeData.Create; with TNodeData(node.Data) do begin Adi := 'adi'; Soyadi := 'soyadi'; end;
Kod: Tümünü seç
procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode); begin if assigned(Node.Data) then begin TNodeData(Node.Data).Free; Node.Data:=nil; end; end;

Lakin önceden tavsiye ettiğiniz stream nesnesiyle uğraşırken TStream'de savetofile gibi bir metodunu göremedim.Helpten baktığımda savetofile metodu olan bi TMemoryStream vardı bende
Kod: Tümünü seç
var
a:TMemoryStream;
begin
a:=tMemoryStrem.create;
Treeview1.SaveToStream(a);
a.SaveToFile('c:\stream.txt');
a.free;
Hocam göremedimVirtual Tree Viewde verdiğiniz örnektekine benzer AddChild fonksiyonu var.ama bu kullanım önerilen yöntem değil. Onun yerine OnInitNode, OnInitChildren olaylarına kod yazarak bu işin yapılması isteniyor.Kod: Tümünü seç
VAR VTNode : PVirtualNode; begin VTNode := VirtualStringTree1.AddChild(VirtualStringTree1.RootNode); VirtualStringTree1.AddChild(VTNode); end;
Mesela, master tablodaki kadar kayıt eklemek içinkullanabilirsiniz. Bu durumda master tabloda kaç kayıt varsa onun kadar node eklenecek ve hemen onInitNode olayına yazdığınız kod çağrılacak. ÖrneğinKod: Tümünü seç
VirtualStringTree1.RootNodeCount := tblMaster.RecordCount;
yazın ve açıldıkça açıldığını görünKod: Tümünü seç
procedure TForm1.VirtualStringTree1InitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); begin // bu node'un childnode'u olduğunu berlitmek için InitialStates := InitialStates + [ivsHasChildren]; end; procedure TForm1.VirtualStringTree1InitChildren(Sender: TBaseVirtualTree; Node: PVirtualNode; var ChildCount: Cardinal); begin ChildCount := 5; end;
![]()

Tekrar teşekkürler hocam.
Not:Bu arada Virtual Treeview baya gelişmiş bir bileşen.Delphi'de olmayan birçok bileşenin(Object inspector,Quantumgrid tarzı grid vs..) yerine geçebilecek kadar ayrıntılı.
Allah herkesin sırtına kaldırabileceği kadar yük koyar
TStream sınıfı TFileStream,TMemoryStream,TStringStream gibi sınıfların atasıdır ve abstract metodlar içerir, o yüzden direk TStream kullanamazsınız. Bu durumda sizin kullanmanız gereken TMemoryStream.
Ama sizin sorununuz TreeView'in her şeyi kaydetmemesi. Zaten help içerisinde de SaveToFile veya SaveToStream metodlarını kullandığınızda kaydedilenin sadece text olacağı, bağladığınız data ve benzeri bilgilerin kaydedilmeyeceği yazıyor. Bu yüzden en mantıklısı bu kaydetme işini yapacak kodu sizin yazmanızdır.
bu yapıdaki bir kodla TreeViewdeki bütün nodelara ulaşabilirsiniz.
Kolay gelsin.
Ama sizin sorununuz TreeView'in her şeyi kaydetmemesi. Zaten help içerisinde de SaveToFile veya SaveToStream metodlarını kullandığınızda kaydedilenin sadece text olacağı, bağladığınız data ve benzeri bilgilerin kaydedilmeyeceği yazıyor. Bu yüzden en mantıklısı bu kaydetme işini yapacak kodu sizin yazmanızdır.
Kod: Tümünü seç
var
node : TTreeNode;
begin
node := TreeView1.Items.GetFirstNode;
while node <> nil do begin
NodeKaydet(Node); // bu prosedür nasıl kaydetcekseniz öyle yazılmalı.
node := node.GetNext;
end;
Kolay gelsin.