Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
treeview den popup menuye aktarım
#1
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;
Yazılımcı, kahveyi koda çeviren bir organizmadır.
Cevapla
#2
Şö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
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#3
(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).
.
Cevapla
#4
(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
Yazılımcı, kahveyi koda çeviren bir organizmadır.
Cevapla
#5
(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.
Yazılımcı, kahveyi koda çeviren bir organizmadır.
Cevapla
#6
(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ığı.
Yazılımcı, kahveyi koda çeviren bir organizmadır.
Cevapla
#7
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.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#8
(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
Yazılımcı, kahveyi koda çeviren bir organizmadır.
Cevapla
#9
sıralama şu şekilde olabilir...


...

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


    aMenuItem.Add(LNewMenuItem);

...


Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#10
(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
   
Yazılımcı, kahveyi koda çeviren bir organizmadır.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Excel Aktarım OZCANK 2 599 21-08-2023, Saat: 12:57
Son Yorum: frmman
Question Treeview ile iç içe sonsuz gösterim YILDIRIMBEY 1 756 17-03-2022, Saat: 10:57
Son Yorum: RAD Coder
  Webbrowser üzerinde Açılan Sayfanın Popup Sayfasındaki Linkler COMMANDX 2 1.128 03-08-2021, Saat: 23:59
Son Yorum: COMMANDX
  POPUP MENÜ KAPATMA CesuR 3 1.773 01-06-2021, Saat: 08:29
Son Yorum: bydelphi
  StringList en hızlı aktarım Veritabanı info@guzelceker.com 20 10.911 16-06-2020, Saat: 14:35
Son Yorum: ismailkocacan



Konuyu Okuyanlar: 1 Ziyaretçi