Ttreeview ImageIndex sorunu????

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
delphiibo
Üye
Mesajlar: 72
Kayıt: 27 Eki 2005 04:55
Konum: istanbul
İletişim:

Ttreeview ImageIndex sorunu????

Mesaj gönderen delphiibo »

:bravo: İyi çalışmalar herkese. Benim bir sorunum var. Treeviewde alt klasör ve dosyaları aşağıdaki kodla ekliyorum. Ama bir türlü klasörlere klasör simgesi dosyalara dosya simgesi koyamıyorum. Hata veriyor. Nedenini bulamıyorum. Yardım eden arkadaşlara şimdiden çok teşekkürler. :bravo:

Kod: Tümünü seç

procedure TForm1.GetDirectories(Tree: TTreeView; Directory: string; Item: TTreeNode; IncludeFiles: Boolean);
var
  SearchRec: TSearchRec;
  ItemTemp: TTreeNode;
begin
  Tree.Items.BeginUpdate;
  if Directory[Length(Directory)] <> '\' then Directory := Directory + '\';
  if FindFirst(Directory + '*.*', faDirectory, SearchRec) = 0 then
  begin
    repeat
      if (SearchRec.Attr and faDirectory = faDirectory) and (SearchRec.Name[1] <> '.') then
      begin
        if (SearchRec.Attr and faDirectory > 0) then
          Item := Tree.Items.AddChild(Item, SearchRec.Name);

        ItemTemp := Item.Parent;
item.imageindex:=0;  // hata veriyor.
itemtemp.imageindex:=1; //hata veriyor.
        GetDirectories(Tree, Directory + SearchRec.Name, Item, IncludeFiles);
        Itemtemp.ImageIndex:=0;
        Item := ItemTemp;
      end
      else if IncludeFiles then
        if SearchRec.Name[1] <> '.' then
          Tree.Items.AddChild(Item, SearchRec.Name);
    until FindNext(SearchRec) <> 0;
    FindClose(SearchRec);
  end;
  Tree.Items.EndUpdate;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  Node: TTreeNode;
  Path: string;
  Dir: string;
begin
  Dir := 'c:\windows';
  Screen.Cursor := crHourGlass;
  TreeView1.Items.BeginUpdate;
  try
    TreeView1.Items.Clear;
    GetDirectories(TreeView1, Dir, nil, True);
  finally
    Screen.Cursor := crDefault;
    TreeView1.Items.EndUpdate;
  end;
end;
Onun tek dostu Allah
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Mesaj gönderen Opt2000 »

Selam,

Sorun ImageIndex'de değil. Kodu dikkatli trace edersen eğer, şu kısımdaki sorunları göreceksin.

Kod: Tümünü seç

        if (SearchRec.Attr and faDirectory > 0) then
          Item := Tree.Items.AddChild(Item, SearchRec.Name);

        ItemTemp := Item.Parent;
        item.imageindex:=0;  // hata veriyor.
        itemtemp.imageindex:=1; //hata veriyor.
        GetDirectories(Tree, Directory + SearchRec.Name, Item, IncludeFiles);
        Itemtemp.ImageIndex:=0;
        Item := ItemTemp; 
1. Eğer faDirectory > 0 şartı geçersiz ise, Item eski değerinde kalacak. Aslında bir önceki satırda zaten Directory olup olmadığını kontrol ediyorsun.

Kod: Tümünü seç

if (SearchRec.Attr and faDirectory = faDirectory) and (SearchRec.Name[1] <> '.') then
İkinci if satırına aslında gerek yok. Boşa programı yavaşlatacak.

2. Item olarak kullanılan ilk değer, fonksiyona parametre olarak gönderdiğin değer, ama daha sonradan item'ın ne olduğunu değiştiriyorsun. Üstelik fonksiyonu çağırırken de item'ın initial değerini nil olarak göndermişsin. Dolayısıyla ilk item değeri nil olduğu için, ilk eklemeden sonra

Kod: Tümünü seç

    ItemTemp := Item.Parent;
satırında ItemTemp = nil oluyor. Zaten asıl sorun da buradan çıkıyor.

Kodda bir iki değişiklik yaptım ve kontrol ettim. Şu an problemsiz çalışıyor olması lazım. Ama sadece senin sorduğun kısımlara baktım. O yüzden başka yerlerinde problem var mı kontrol etmedim.

Kod: Tümünü seç

procedure TForm1.GetDirectories(Tree: TTreeView; Directory: string; RootItem: TTreeNode; IncludeFiles: Boolean);
var
  SearchRec: TSearchRec;
  Item:TTreeNode;
  ItemTemp: TTreeNode;
begin
  Tree.Items.BeginUpdate;
  if Directory[Length(Directory)] <> '\' then Directory := Directory + '\';
  if FindFirst(Directory + '*.*', faDirectory, SearchRec) = 0 then
  begin
    repeat
      if (SearchRec.Attr and faDirectory = faDirectory) and (SearchRec.Name[1] <> '.') then
      begin
        if (SearchRec.Attr and faDirectory > 0) then
          Item := Tree.Items.AddChild(RootItem, SearchRec.Name);

        ItemTemp := Item.Parent;
        Item.imageindex:=0;  // hata veriyor.

        if Assigned(ItemTemp) then
          Itemtemp.imageindex:=1; //hata veriyor.
        GetDirectories(Tree, Directory + SearchRec.Name, Item, IncludeFiles);

        if Assigned(ItemTemp) then
          Itemtemp.ImageIndex:=0;
        Item := ItemTemp;
      end
      else if IncludeFiles then
        if SearchRec.Name[1] <> '.' then
          Tree.Items.AddChild(Item, SearchRec.Name);
    until FindNext(SearchRec) <> 0;
    FindClose(SearchRec);
  end;
  Tree.Items.EndUpdate;
end;

Kolay gelsin,
Bahadır Alkaç
Cevapla