![]() |
|
treeview den popup menuye aktarım - Baskı Önizleme +- Delphi Can (https://www.delphican.com) +-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3) +--- Forum: Genel Programlama (https://www.delphican.com/forumdisplay.php?fid=6) +--- Konu Başlığı: treeview den popup menuye aktarım (/showthread.php?tid=7409) Sayfalar:
1
2
|
treeview den popup menuye aktarım - shooterman - 31-08-2023 Arkadaşlar selamlar, Tablodan aldığım verilerle, Treeview menüyü oluşturuyorum. [attachment=2398] Daha sonra, bir arkadaşımın yazmış olduğu koda istinaden, bu yapıyı popup menüye aktarıyorum. Buraya kadar problem yok. Ancak aşağıdaki resimden gördüğünüz üzere, treeview menü yapısının aynısını popup menüye aktarıyor. Aslında istediğim, sadece nodelar ve noda tıklayınca sağ tarafa menü açılsın. Ancak bu yapıda, hem node ları hem childları da popupa aktarıyor. Bu sefer popup menüde aynı bilgiler altalta node olarak ta görünüyor. [attachment=2399] Sadece node lar ve node lara tıklayınca sağ tarafa subchildları nasıl gösterebilirim? Kod bloğum aşağıdadır. Yardımlarınızı rica ederim. Treeview oluşturma kodum: procedure TForm1.BtntreeolusturClick(Sender: TObject); var MyTreeNode1, MyTreeNode2: TTreeNode; begin with TreeView1.Items do begin Clear; MyTreeNode1 := Add(nil, 'RootTreeNode1'); AddChild(MyTreeNode1,'ChildNode1'); MyTreeNode2 := Add(MyTreeNode1, 'RootTreeNode2'); AddChild(MyTreeNode2,'ChildNode2'); MyTreeNode2 := TreeView1.Items[3]; AddChild(MyTreeNode2,'ChildNode2a'); AddChild(MyTreeNode2,'ChildNode2b'); Add(MyTreeNode1, 'RootTreeNode3'); end; end; popupmenu olusturma kodum: procedure TForm1.PopulatePopupMenu2(Menu: TMenuItem; ParentNode: TTreeNode); var Node: TTreeNode; SubMenuItem: TMenuItem; begin Menu.Clear; for Node in treeview1.Items do begin if (ParentNode = nil) or (Node.Parent = ParentNode) then begin SubMenuItem := TMenuItem.Create(Self); SubMenuItem.Caption := Node.Text; ; Menu.Add(SubMenuItem); PopulatePopupMenu2(SubMenuItem, node); end; procedure TForm1.PopupMenu1Popup(Sender: TObject); begin PopulatePopupMenu2(popupmenu1.Items, nil); end; treeview den popup menuye aktarım - mrmarman - 31-08-2023 Şöyle TreeView'i node by node dolaşarak denemek isteyebilirsiniz. * Seçeceğiniz ilk TreeNode hangi seviyede ise aynı seviyedeki diğer kardeş ve alt node'ları tek tek sonuna kadar dolaşır. procedure TForm1.TreeViewToMenu(aTreeNode: TTreeNode; aMenuItem: TMenuItem); var LNewMenuItem: TMenuItem; begin while aTreeNode <> nil do begin LNewMenuItem := TMenuItem.Create(nil); LNewMenuItem.Caption := aTreeNode.Text; aMenuItem.Add(LNewMenuItem); if aTreeNode.HasChildren then // recursive... TreeViewToMenu(aTreeNode.GetFirstChild, LNewMenuItem); aTreeNode := aTreeNode.GetNextSibling; end; end; Kullanımı : procedure TForm1.BitBtn2Click(Sender: TObject); begin PopupMenu1.Items.Clear; TreeViewToMenu(TreeView1.Items[0], PopupMenu1.Items); end; Cvp: treeview den popup menuye aktarım - veteran - 31-08-2023 (31-08-2023, Saat: 16:24)shooterman Adlı Kullanıcıdan Alıntı: Arkadaşlar selamlar, TTreeNode Level özelliğini göz ardı etmemelisin (bkz: https://docwiki.embarcadero.com/Libraries/Sydney/en/Vcl.ComCtrls.TTreeNode.Level). Cvp: treeview den popup menuye aktarım - shooterman - 31-08-2023 (31-08-2023, Saat: 21:04)veteran Adlı Kullanıcıdan Alıntı:Baktım ama çözemedşm yine de(31-08-2023, Saat: 16:24)shooterman Adlı Kullanıcıdan Alıntı: Arkadaşlar selamlar,
Cvp: treeview den popup menuye aktarım - shooterman - 01-09-2023 (31-08-2023, Saat: 17:11)mrmarman Adlı Kullanıcıdan Alıntı: Şöyle TreeView'i node by node dolaşarak denemek isteyebilirsiniz. @mrmarman hocam elinize sağlık. Yine yardımımıma koştunuz. Çalıştı. Çok teşekkürl ederim. Cvp: treeview den popup menuye aktarım - shooterman - 01-09-2023 (31-08-2023, Saat: 17:11)mrmarman Adlı Kullanıcıdan Alıntı: Şöyle TreeView'i node by node dolaşarak denemek isteyebilirsiniz. @mrmarman hocam, burada hangi popup menüye tıkladığımzda onun başlığını alabilmek için kod ne olmalı? şu anda şöyle bir prosedür ekledim. procedure TForm1.HandlePopupItem(Sender: TObject); begin if (Tmenuitem(sender).count <1) then ShowMessage(TMenuItem(Sender).Caption); end; yazdığınız kodda da şu şekilde ekledim. procedure TreeViewToMenu(aTreeNode: TTreeNode; aMenuItem: TMenuItem); var LNewMenuItem: TMenuItem; begin while aTreeNode <> nil do begin LNewMenuItem := TMenuItem.Create(nil); LNewMenuItem.Caption := aTreeNode.Text; aMenuItem.Add(LNewMenuItem); LNewMenuItem.OnClick := form1.HandlePopupItem; if aTreeNode.HasChildren then // recursive... TreeViewToMenu(aTreeNode.GetFirstChild, LNewMenuItem); aTreeNode := aTreeNode.GetNextSibling; end; end; ancak, sadece en son node a tıklanınca başlık veriyor. ilk node tıkladığımda vermiyor. Yani sağ tarafa açılan en son childda veriyor başlığı. treeview den popup menuye aktarım - mrmarman - 01-09-2023 Bir satır üstte olsun çalışır. Menuye eklemeden önce OnClick ataması yapmalısınız. Bir de eğer Child yoksa atama yapın ki alt menü açılırken tetikleme yapmasın. Alt menü yoksa OnClick ataması yapılsın. Cvp: treeview den popup menuye aktarım - shooterman - 04-09-2023 (01-09-2023, Saat: 17:38)mrmarman Adlı Kullanıcıdan Alıntı: Bir satır üstte olsun çalışır. procedure TForm16.HandlePopupItem(Sender: TObject); begin if (Tmenuitem(sender).HasParent) then // if (Tmenuitem(sender).count <1) then ShowMessage(TMenuItem(Sender).Caption); end; @mrmarman hocam alttaki şekli ile denedim, evet mouse daha ilk menü üzerine gelince tetikledi. Child yoksa yapısını bir türlü oluşturamadım.
treeview den popup menuye aktarım - mrmarman - 04-09-2023 sıralama şu şekilde olabilir... ... if not aTreeNode.HasChildren then LNewMenuItem.OnClick := form1.HandlePopupItem; aMenuItem.Add(LNewMenuItem); ... Cvp: treeview den popup menuye aktarım - shooterman - 04-09-2023 (04-09-2023, Saat: 10:59)mrmarman Adlı Kullanıcıdan Alıntı: sıralama şu şekilde olabilir...Hocam ekledim kodu, ancak yine aynı şekilde, son child de sıkıntı yok. Ancak, resimdeki menüye tıkladığımda caption alamıyorum. ![]() [attachment=2412] |