Delphi Can

Orjinalini görmek için tıklayınız: treeview den popup menuye aktarım
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Sayfalar: 1 2
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;
Şö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;



eaoco2gutkswd5dpz2ur.png
(31-08-2023, Saat: 16:24)shooterman Adlı Kullanıcıdan Alıntı: [ -> ]Arkadaşlar selamlar,
Tablodan aldığım verilerle, Treeview menüyü oluşturuyorum.

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.

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;

TTreeNode Level özelliğini göz ardı etmemelisin (bkz: https://docwiki.embarcadero.com/Librarie...Node.Level).
(31-08-2023, Saat: 21:04)veteran Adlı Kullanıcıdan Alıntı: [ -> ]
(31-08-2023, Saat: 16:24)shooterman Adlı Kullanıcıdan Alıntı: [ -> ]Arkadaşlar selamlar,
Tablodan aldığım verilerle, Treeview menüyü oluşturuyorum.

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.

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;

TTreeNode Level özelliğini göz ardı etmemelisin (bkz: https://docwiki.embarcadero.com/Librarie...Node.Level).
Baktım ama çözemedşm yine de Sad
(31-08-2023, Saat: 17:11)mrmarman Adlı Kullanıcıdan Alıntı: [ -> ]Şö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;



eaoco2gutkswd5dpz2ur.png

@mrmarman  hocam elinize sağlık. Yine yardımımıma koştunuz. Çalıştı. Çok teşekkürl ederim.
(31-08-2023, Saat: 17:11)mrmarman Adlı Kullanıcıdan Alıntı: [ -> ]Şö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;



eaoco2gutkswd5dpz2ur.png

@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ığı.
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.
(01-09-2023, Saat: 17:38)mrmarman Adlı Kullanıcıdan Alıntı: [ -> ]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.

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. Sad
sıralama şu şekilde olabilir...


...

  if not aTreeNode.HasChildren
    then 
        LNewMenuItem.OnClick := form1.HandlePopupItem;


    aMenuItem.Add(LNewMenuItem);

...


(04-09-2023, Saat: 10:59)mrmarman Adlı Kullanıcıdan Alıntı: [ -> ]sıralama şu şekilde olabilir...


...

  if not aTreeNode.HasChildren
    then 
        LNewMenuItem.OnClick := form1.HandlePopupItem;


    aMenuItem.Add(LNewMenuItem);

...


Hocam ekledim kodu, ancak yine aynı şekilde, son child de sıkıntı yok. Ancak, resimdeki menüye tıkladığımda caption alamıyorum. Sad
[attachment=2412]
Sayfalar: 1 2