TreeView Agaç yapısı +Db ye gore olusturma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
otherside
Üye
Mesajlar: 65
Kayıt: 11 Mar 2005 02:48
Konum: istanbul

TreeView Agaç yapısı +Db ye gore olusturma

Mesaj gönderen otherside »

arkadaşlar forum dakı TreeView orneklerine bakarak bişiler yapmaya çalıstım ama tam basarılı olamadım
Benim yapmak istedigim db den gelen bilgileri TreeView e işletmek

Db yapım
Id SubId Menu adi
1 0 Ana1
2 0 Ana2
3 0 Ana3
4 1 Ana1 alatında
5 4 XXXXXXXXXX
Gibi bir db tasarımım var
burada çektıgım sıkıntı program ilk açılırken 2 inci alttan sonrakini olusturamıyorum
Kodlar

Kod: Tümünü seç

type
    adrestype=array[0..7]of word;

Var
MyNode,Buraya: ttreenode;
adresT : ^adresType; 



TreeView1.Items.Clear;
AnaKayitlar.SQL.Text:='Select * From MenuTbl Where SubCatId=0 ';
AnaKayitlar.Open;
 //U/case hangisi of
   //0://ana kayıtlar
     // begin

        for i:=0 to AnaKayitlar.RecordCount-1 do begin
        begin
          MyNode := TreeView1.items.add (Nil, AnaKayitlarMenAck.AsString);
          mynode.ImageIndex:=hangisi;
          new (adrest);
          fillchar (adrest^, sizeof (adrest^), 0);
          adresT^ [0] := AnaKayitlarCatId.asinteger;
          MyNode.Data := adrest;  //dispose yapmak yok
          mynode.ImageIndex:=hangisi;
          mynode.StateIndex:=-1;


         Alt.SQL.Text:='Select * From MenuTbl Where SubCatId='+IntToStr(AnaKayitlarCatId.Value)+' ';
         Alt.Open;
                   for j:=0 to Alt.RecordCount-1 do begin
          Buraya := TreeView1.items.AddChild(Mynode, trim(AltMenAck.Value));
          new (adrest);
          fillchar (adrest^, sizeof (adrest^), 0);
          adresT^ [0] := AnaKayitlarCatId.Value;
          adresT^ [1] := AltSubCatId.Value;
          Buraya.Data := adrest;
          Buraya.ImageIndex:=hangisi;
          Buraya.StateIndex:=-1;

                 alt.Next;
            end;
          anakayitlar.Next;
      End;
yardımlarınızı beklıyorum db tasarımında sıkıntı varsa db yide dgiştirebilirim
Kullanıcı avatarı
utrade
Üye
Mesajlar: 22
Kayıt: 02 Nis 2006 11:41

Mesaj gönderen utrade »

Kardeş aşağıdaki upload ettiğim örneği bi incele. Bende çok çekmiştim dbtreeview lerden.

http://mihd.net/yjxsko
Kullanıcı avatarı
otherside
Üye
Mesajlar: 65
Kayıt: 11 Mar 2005 02:48
Konum: istanbul

Mesaj gönderen otherside »

arkadaşım link tam olarak çalısmıyo
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

Bu kodlarla 2 seviyeden sonra eklemesi zaten olanaksız.
Recursive yapıda bir fonksiyon yazarsan bu işi halledebilirsin.
Ayrıca tablondaki SubID yerine, MasterID yazarsan daha mantıklı olur diye düşünüyorum.
Kullanıcı avatarı
otherside
Üye
Mesajlar: 65
Kayıt: 11 Mar 2005 02:48
Konum: istanbul

Mesaj gönderen otherside »

Recursive functıon konusunda yardımcı olurmusunuz nasıl bir yapısı olacagı hakkında mantık olusturamadım kod olarak yardımcı olursanız sevınırım
Kullanıcı avatarı
utrade
Üye
Mesajlar: 22
Kayıt: 02 Nis 2006 11:41

Mesaj gönderen utrade »

link çalışıyor kardeş.. Request Download link e tıkla link gelir.
Kullanıcı avatarı
otherside
Üye
Mesajlar: 65
Kayıt: 11 Mar 2005 02:48
Konum: istanbul

Mesaj gönderen otherside »

malesef bu bana uygun birşey degil
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

otherside yazdı:Recursive functıon konusunda yardımcı olurmusunuz nasıl bir yapısı olacagı hakkında mantık olusturamadım kod olarak yardımcı olursanız sevınırım
Bir fonksiyon düşün, parametre olarak Master TtreeNode ve ID (sen subID diyorsun) alacak. Fonksiyonun adı AgacaEkle olsun.

Fonksiyon içerdiği kodların yapacağı şey ilk önce ID nin bilgilerini query nesnesinden alıp, parametreyle gelen Master TtreeNode parent alacak şekilde bir Node daha ekleyecek. Bunun adı Mynode olsun.

Sonra query ile parametreyle gelen ID'nin child'ı varmı ona bakacak eğer varsa querynin sonuç kümesinin hepsi için ID lerini döngü ile teker teker AgacaEke(Mynode, Queryden alınan ID) şeklinde kendisini tekrar çağırtacak. Bu şekilde bu fonskiyon kendini en alt dala gelene kadar çağartmış olacak.

Senin yapacağın şey bu fonksiyonu sadece query'nin ilk seviyedeki elemanların herbiri için AgacaEkle(nil, ID) şeklinde çağırtmak.

Benim kod yazmamı beklediğini biliyorum, ama birkaç engelimiz var. Aynı Queryi her fonksiyonun kendini çağırışında birdaha kullanmamız gerekecek buda Querynin yapısının bozulması demek.
Bunu engellemek için her fonksiyon çağırımında birdaha Queryi yaratıp sorgu çalıştırmak demekki buda acayip kasar. Bunun için ihtiyacımız olan satırları tek sorguda çekip, locate ile querynin sonuç seti üzerinde dolaşılması gerekir buda yeni bir yapı kurman lazım.

Zor bir konu, umarım anlaşılmıştır...
Cevapla