Ağaç yapısı, treeview ve popup menu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
serbek_tr
Üye
Mesajlar: 362
Kayıt: 16 Ağu 2004 12:54

Ağaç yapısı, treeview ve popup menu

Mesaj gönderen serbek_tr »

S.A.
Arkadaşlar konu başlığı biraz tuhaf görünebilir kusura bakmayın ama tam konuya göre başlık.

treeview kullanarak bir ağaç yapısı görüntülüyorum. bu ağaç yapısı database kayıtlarından geliyor. uzun zaman uğraştım ama kendi açımdan mükemmeli yakaladım diyebilirim. Ancak şöyle birşeye ihtiyaç oldu bu treeview de ağaç yapısı aynen bir popup menuye yansıyacak. günlerdir uğraşıyorum ama tıkandım arkadaşlar bazen beyin durur ya düşünemez oluruz konuyu düşündüğümde düşünce olarak ileri gidemiyorum gerçekten düşünemyiorum yorumlayamıyorum artık. Yardımızı rica ediyorum lütfen mantıklı bir yol gösterin bu ağaç yapısı sabit birşey değil heran değişebilir yeni ağaç ve onunda altına başka bir kayıt eklenebilir.


Şöyle bir örnek verebilirim

Kod: Tümünü seç

  ID      KLASOR        MS     UPINDEX
 ---      ----------      -----    ----------
1         A                 0        1
2         B                 0        2
3         C                 0        3
4         D                 0        4
5         E                 1       1-5
6         F                 1       1-6
13       G                 1       1-13
14       H                 5       1-5-14 
15       I                  6       1-6-15
16       J                  5       1-5-16
17       K                 13     1-13-17
18       L                 1       1-18

Açıklamak gerekirse MS değeri 0 olan kayıtlar ana ağaç kaydıdır yani root ta yer alır MS değeri 0 dan farklı olan kayırlar ise
MS değeri ne ise ID aynı olan kayıtın altında bir ağaçtır. UpIndex ise örnek : 17 Id li kayıt UpIndexi 1-13-17 yani sondan bakacak olursak 17 kaydı 13 altında 13 kaydı 1 altındadır demek istiyor yani sonuç A içinde G onunda içinde K var demek ve bunu treeview gayet rahat bir şekilde gösteriyorum bu yapıyı popup menuye nasıl aktarabilirm yani A submenu olacak onun içinde G submenu olacak onunda içinde K sadece menu item olacak.
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Kullanıcı avatarı
serbek_tr
Üye
Mesajlar: 362
Kayıt: 16 Ağu 2004 12:54

Re: Ağaç yapısı, treeview ve popup menu

Mesaj gönderen serbek_tr »

Arkadaşlar ben yardım istediğim olayımı anlatamadım yoksa bu konuda yol gösterebilecek biri yokmu, belkide istediğim şeyin oluru yoktur eğer öyleyse söyleyin bari uğraşmayayım hala uğraşıyorum üzerinde
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Ağaç yapısı, treeview ve popup menu

Mesaj gönderen aslangeri »

s.a.
tree view için yazdığın kodların aynısını birde popupmenu için yapacaksın.

Kod: Tümünü seç

procedure TForm1.FormCreate(Sender: TObject);
var
pm:tpopupmenu;
item:TMenuItem;
begin
  pm:=TPopupMenu.Create(self);
  item:=TMenuItem.Create(pm);
  item.Caption:='ana menu';
  pm.Items.Add(item);
  item:=TMenuItem.Create(pm);
  item.Caption:='alt menu';
  pm.items[0].Add(item);
  PopupMenu:=pm;
end;
örnek üzerinden yola çıkarak yaparsın artık :wink:
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
serbek_tr
Üye
Mesajlar: 362
Kayıt: 16 Ağu 2004 12:54

Re: Ağaç yapısı, treeview ve popup menu

Mesaj gönderen serbek_tr »

Aslangeri, ilgine teşekkür ederim, açıkçası ben problemimi anlatmakta zorluk çekiyorum. Kodlamada sorunum yok popup menuyü nasıl create edeceğimi itemleri nasıl ekleyeceğimi biliyorum sorumu senin verdiğin örnek üzerinden bir daha sormak istiyorum belki daha net sorarım

Kod: Tümünü seç

procedure TForm1.FormCreate(Sender: TObject);
var
pm:tpopupmenu;
item:TMenuItem;
begin
  pm:=TPopupMenu.Create(self);
  item:=TMenuItem.Create(pm);
  item.Caption:='ana menu';
  pm.Items.Add(item);
  item:=TMenuItem.Create(pm);
  item.Caption:='alt menu';
  pm.items[0].Add(item); /////// burası
  PopupMenu:=pm;
end;
verdiğin örnekte ////// burası diye gösterdiğim yer varya işte bu örnekte ekleyeceğin alt menü sayısı belli olduğu için rahatlıkla

Kod: Tümünü seç

pm.items[0].Add(item); 
diye belirtmişsin. Ancak benim en yukarıda verdiğim listeyi incelersen o listede popup menudeki ana itemler ve subitemler saysısı belli olmayan bir liste, ve ben o listedeki kayıtların hangisinin ana item hangisinin sub item olduğunu ve popupmenu de kaçıncı seviyeye yerleşeceğini zaten biliyorum. benim sıkıntım
senin verdiğin örnek üzerinde konuşalım

Kod: Tümünü seç

pm.items[0].Items[0].Add(item);
şeklinde yada

Kod: Tümünü seç

pm.items[0].Items[1].items[0].items[2].Add(item);
şeklinde de olabilirdi. yani öyle bir tanımlama yada döngü kurmalıyımki listedeki elemanları seviyelerine göreyerleştirmeliyim. En üstteki listemden örnekliyeyim bu defa ID si 17 olan kayıta bakacak olursak bu kaydın upindexindeki son rakam 17 ondan sonra başka rakam gelmediği için kendisi artık bir subitem değil normal item olacak ama bu item upindexte 17 den önce gelen 13 id li kayıt için oluşturulmuş sub itemde yer alacak tabi 13 te doğal olarak 1 nolu id ye sahip ilk kayıt için oluşturulmuş ilk subitemde yer alacak.

dediğim gibi neyi nerden alacağımı biliyorum popup menu treeview gibi tek eleaman içinde işlem görmüyor popup menuyü oluşturu ikende sadece ilk anamenu elemanlarını oluşturabiliyorum alt elemanların nereye ait olacağını bulamıyorum yani önceden oluşturduğum anamenu elemanlarını bulamıyorum.
biraz uzunca oldu ama hoş görün
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Ağaç yapısı, treeview ve popup menu

Mesaj gönderen aslangeri »

s.a.
treeviewi nasıl oluşturuyorsanız popupmenuyude aynı şekilde oluşturacaksınız ozaman.

ben olsam recursive bir fonksiyon hazırlar onu kullanarak eklerdim.

item ları create etmesini biliyorsun.
Ağaç yapısının oluşturulmasının mantığınıda biliyorsun(treeviewda halletmişsin.)
bildiğin şeyleri birleştirmek kalmış geriye.

kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
serbek_tr
Üye
Mesajlar: 362
Kayıt: 16 Ağu 2004 12:54

Re: Ağaç yapısı, treeview ve popup menu

Mesaj gönderen serbek_tr »

Önerin için teşekkür ederim, Uğraşacağım biraz daha ama söylediğin gibi treview mantığı ile yanı değil daha doğrusu treeviewde bir nodu arayıp buluyorum en azından bir döngü içinde tüm noda bakıyorum aradığım özelliktedi nod oysa hemen noda ekliyorum. peki popup menu itemlerini nasıl arayacağım

Kod: Tümünü seç

procedure TForm1.FormCreate(Sender: TObject);
var
pm:tpopupmenu;
item:TMenuItem;
begin
  pm:=TPopupMenu.Create(self);
  item:=TMenuItem.Create(pm);
  item.Caption:='ana menu';
  pm.Items.Add(item);
  item:=TMenuItem.Create(pm);
  item.Caption:='alt menu';
  pm.items[0].Add(item); /////// burası
  PopupMenu:=pm;
end;
burası dediğim yer orası bir subitem . şimdi pm itemlerini aramak kolay itemcount ile aranır ama itemcoun sadece pm altındakilerinin sayısını verir peki bunlardan biri yada bir kaçı subitem ise ki bunlar sonradan oluşturulan itemler bunları nasıl bulacağım. işte asıl problemim bu. yinede teşekkürler eğer bunun için bir yol gösterebilirseniz minnettar kalırım.
Zaman ayırdığınız ve paylaştığınız için teşekkür ederim. Saygılar
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Ağaç yapısı, treeview ve popup menu

Mesaj gönderen aslangeri »

o zaman kendini çağıran bir fonksiyon ile menuitemları tek tek oluşturacaksın.
kod şöyle bişey olacak.

Kod: Tümünü seç

procedure menuolustur(amenu:tmenuitem; austid:integer);
var
newitem:tmenuitem;İ
begin
  veritabanından ustidisi gönderilen parametre olan kayıtlar seçilir.
  while eof do
  begin
      newitem:=tmenuitem.create();
      newitemin özelliklerini ayarla.
      amenu.items.add(newitem);
      menuolustur(newitem,newitem in ustidsi);
      bir sonraki kaydı seç.
  end;
end;
ilk önce bir tane pm oluşturup ona ilk elemanı atıyacaksaın.(root olacak yani) sonra bu procedureyi çağıracaksın.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
serbek_tr
Üye
Mesajlar: 362
Kayıt: 16 Ağu 2004 12:54

Re: Ağaç yapısı, treeview ve popup menu

Mesaj gönderen serbek_tr »

Aslangeri teşekkür ederim. emeğine sağlık verdiğin fikir ve kod üzerinde çalışıyorum umarım rayına oturturum. ve buraya sonucu yazarım tekrar teşekkürler.
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Kullanıcı avatarı
serbek_tr
Üye
Mesajlar: 362
Kayıt: 16 Ağu 2004 12:54

Re: Ağaç yapısı, treeview ve popup menu

Mesaj gönderen serbek_tr »

malesef arkadaşlar popupmenu yü istediğim gibi oluşturamadım. başka çözüm arayacağım artık herkese teşekkürler
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Cevapla