Yorumları: 687
Konuları: 73
Kayıt Tarihi: 20-12-2018
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 1.587 Programcı
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.
Yorumları: 1.823
Konuları: 21
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 20.453 Üstad
31-08-2023, Saat: 17:11
(Son Düzenleme: 31-08-2023, Saat: 17:12, Düzenleyen: mrmarman.)
Şö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;
Saygılarımla
Muharrem ARMAN
Yorumları: 17
Konuları: 0
Kayıt Tarihi: 24-08-2023
Aktif Kullandığınız Delphi Sürümü:
- Delphi 10.3
- Lazarus / FPC
Rep Puanı: 148 Başlangıç
(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).
.
Yorumları: 687
Konuları: 73
Kayıt Tarihi: 20-12-2018
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 1.587 Programcı
(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
Yazılımcı, kahveyi koda çeviren bir organizmadır.
Yorumları: 687
Konuları: 73
Kayıt Tarihi: 20-12-2018
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 1.587 Programcı
(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;
@ 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.
Yorumları: 687
Konuları: 73
Kayıt Tarihi: 20-12-2018
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 1.587 Programcı
01-09-2023, Saat: 16:28
(Son Düzenleme: 01-09-2023, Saat: 16:29, Düzenleyen: shooterman.
Sebep: yanlış
)
(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;
@ 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.
Yorumları: 1.823
Konuları: 21
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 20.453 Üstad
01-09-2023, Saat: 17:38
(Son Düzenleme: 01-09-2023, Saat: 17:40, Düzenleyen: mrmarman.)
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
Yorumları: 687
Konuları: 73
Kayıt Tarihi: 20-12-2018
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 1.587 Programcı
(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.
Yazılımcı, kahveyi koda çeviren bir organizmadır.
Yorumları: 1.823
Konuları: 21
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 20.453 Üstad
sıralama şu şekilde olabilir...
...
if not aTreeNode.HasChildren
then
LNewMenuItem.OnClick := form1.HandlePopupItem;
aMenuItem.Add(LNewMenuItem);
...
Saygılarımla
Muharrem ARMAN
Yorumları: 687
Konuları: 73
Kayıt Tarihi: 20-12-2018
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 1.587 Programcı
(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.
Yazılımcı, kahveyi koda çeviren bir organizmadır.
|