Delphi Dynamique Des Éléments De Menu
J'ai un menu déroulant qui a quelques éléments qu'il contient.
Option 1 - Sub1 - Sub2 Option 2 - Sub1 - Sub2 Option 3 - Sub1 - Sub2
Je veux être en mesure d'ajouter un sous-Sous-menu de l'Option 3, sub2 de sorte qu'il pourrait ressembler:
Option 1 - Sub1 - Sub2 Option 2 - Sub1 - Sub2 Option 3 - Sub1 - Sub2 - Dynamique Item1 - Dynamique Item2 - Dynamique Item3
J'ai essayé de travailler avec le code suivant à comprendre, je peux le faire "SI" l'option de menu n'est pas déjà là (Option 3), mais je ne peux pas le faire si l'Option 3 est déjà là (Il crée une copie de l'option de menu)
Comment puis-je faire?
Merci
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls;
type
TForm2 = class(TForm)
popMenu: TPopupMenu;
gbDynamic: TGroupBox;
gbMain: TGroupBox;
popDynamic: TPopupMenu;
Option11: TMenuItem;
Option21: TMenuItem;
Option31: TMenuItem;
Sub11: TMenuItem;
Sub21: TMenuItem;
Item11: TMenuItem;
Item21: TMenuItem;
Item31: TMenuItem;
Item41: TMenuItem;
Sub12: TMenuItem;
Sub22: TMenuItem;
Sub13: TMenuItem;
Sub23: TMenuItem;
Option12: TMenuItem;
Sub24: TMenuItem;
Sub14: TMenuItem;
Option22: TMenuItem;
Sub25: TMenuItem;
Sub15: TMenuItem;
Option32: TMenuItem;
Sub26: TMenuItem;
Sub16: TMenuItem;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Procedure PopupItemClick ( Sender : TObject );
end;
var
Form2: TForm2;
stlist: TStrings;
implementation
{$R *.dfm}
procedure TForm2.FormCreate(Sender: TObject);
Var
menuItem,SubItem : TMenuItem;
I, N : Integer;
s : String;
begin
//This will be a downloaded list from a server.
stlist := TStringList.Create;
stlist.Add ( 'Item 1' );
stlist.Add ( 'Item 2' );
stlist.Add ( 'Item 3' );
SubItem := TMenuItem.Create(popDynamic);
SubItem.Caption := 'Option 3';
popDynamic.Items.Add(SubItem);
MenuItem := TMenuItem.Create(popDynamic);
MenuItem.Caption := 'Sub 1';
SubItem.Add(MenuItem);
//This would work if Option 3 menu item was not aleady a menu item.
For I := 0 To stlist.Count - 1 Do
Begin
SubItem := TMenuItem.Create ( popDynamic );
SubItem.Caption := stlist [i];
SubItem.OnClick := PopupItemClick;
//assign it a custom integer value..
SubItem.Tag := i;
MenuItem.Add(SubItem);
End;
end;
Procedure TForm2.PopupItemClick ( Sender : TObject );
Var
menuItem : TMenuItem;
Begin
menuItem := TMenuItem ( sender );
label1.caption := stlist.Strings [menuItem.Tag];
End;
end.
Forme:
object Form2: TForm2
Left = 0
Top = 0
Caption = 'Form2'
ClientHeight = 247
ClientWidth = 480
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object gbDynamic: TGroupBox
Left = 0
Top = 0
Width = 217
Height = 247
Align = alLeft
Caption = 'Dynamic'
PopupMenu = popDynamic
TabOrder = 0
object Label1: TLabel
Left = 48
Top = 32
Width = 31
Height = 13
Caption = 'Label1'
end
end
object gbMain: TGroupBox
Left = 217
Top = 0
Width = 263
Height = 247
Align = alClient
Caption = 'What I Want Dynamically Created'
PopupMenu = popMenu
TabOrder = 1
ExplicitLeft = 336
ExplicitTop = 72
ExplicitWidth = 185
ExplicitHeight = 105
end
object popDynamic: TPopupMenu
Left = 136
Top = 96
object Option12: TMenuItem
Caption = 'Option 1'
object Sub14: TMenuItem
Caption = 'Sub 1'
end
object Sub24: TMenuItem
Caption = 'Sub 2'
end
end
object Option22: TMenuItem
Caption = 'Option 2'
object Sub15: TMenuItem
Caption = 'Sub 1'
end
object Sub25: TMenuItem
Caption = 'Sub 2'
end
end
object Option32: TMenuItem
Caption = 'Option 3'
object Sub16: TMenuItem
Caption = 'Sub 1'
end
object Sub26: TMenuItem
Caption = 'Sub 2'
end
end
end
object popMenu: TPopupMenu
Left = 256
Top = 112
object Option11: TMenuItem
Caption = 'Option 1'
object Sub13: TMenuItem
Caption = 'Sub 1'
end
object Sub23: TMenuItem
Caption = 'Sub 2'
end
end
object Option21: TMenuItem
Caption = 'Option 2'
object Sub12: TMenuItem
Caption = 'Sub 1'
end
object Sub22: TMenuItem
Caption = 'Sub 2'
end
end
object Option31: TMenuItem
Caption = 'Option 3'
object Sub11: TMenuItem
Caption = 'Sub 1'
object Item11: TMenuItem
Caption = 'Item 1'
end
object Item21: TMenuItem
Caption = 'Item 2'
end
object Item31: TMenuItem
Caption = 'Item 3'
end
object Item41: TMenuItem
Caption = 'Item 4'
end
end
object Sub21: TMenuItem
Caption = 'Sub 2'
end
end
end
end
OriginalL'auteur Brad | 2010-02-26
Vous devez vous connecter pour publier un commentaire.
La façon la plus simple de le faire est de donner Option3 un nom et vérifiez ensuite dans une boucle:
De cette façon, votre pas la création d'un nouveau point si elle existe déjà.
Merci pour l'exemple de code!
OriginalL'auteur skamradt
Tout ce que vous devez faire pour créer un nouveau sous-menu est de prendre votre référence à l'actuel point de menu - si c'est la même chose à chaque fois, tout simplement se référer directement à l'objet, sinon, trouvez en quelque sorte - et appeler ensuite Ajouter la TMenuItem vous souhaitez ajouter. J'utilise quelque chose de semblable dans une de mes applications récursive de construire un menu à partir d'un fichier XML.
Cela devrait servir comme un condensé de ce que je fais.
...où Set1 est l'élément de menu que je suis en train de construire des éléments de menu. Dans votre cas, je suppose que ce serait Sub26 (et Sub23 pour l'une dans le menu pop-up). Il suffit d'utiliser cette approche de base, en remplaçant le code XML des trucs avec ce que vous avez besoin pour lire votre fichier.
OriginalL'auteur Michael Madsen