Results 1 to 10 of 10

Thread: MainMenu item vraag

  1. #1

    MainMenu item vraag

    Een vraag over het afhandelen van OnClick events bij het dynamisch toevoegen van menu items.

    Graag zou ik het volgende willen maken: In een database bestaan er tabellen. Na verloop van tijd worden er dat mogelijk meerdere. Als een tabel bestaat, dan zou dat een menu item moeten worden. Want door dan op dat menu item te klikken wil ik de inhoud van die tabel zichtbaar maken.
    Dynamisch menu items toevoegen, dat lukt wel. Zie onderstaande. (e.e.a is een voorbeeld om het eenvoudig te houden)
    Maar ik krijg het niet voor elkaar om het bijbehorende menu click event af te handelen. Wat ik maakte met Henk1Click werkt niet.

    Nu heb ik 2 vragen.
    - Hoe kan ik het menu item OnClick event afhandelen in het gegeven voorbeeld?
    - Zelfs als dat af te handelen is, hoe gaat dat dan als het menu item nog niet bekend is. Dan zou er eigenlijk al een procedure voor de afhandeling bestaan terwijl dat niet kan.


    Delphi Code:
    1. unit Main;
    2.  
    3. interface
    4.  
    5. uses
    6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, System.UITypes, Vcl.StdCtrls;
    8.  
    9. type
    10.   TForm1 = class(TForm)
    11.     MainMenu1: TMainMenu;
    12.     Links1: TMenuItem;
    13.     procedure FormActivate(Sender: TObject);
    14.     procedure Henk1Click(Sender: TObject);
    15.   private
    16.     { Private declarations }
    17.   public
    18.     { Public declarations }
    19.   end;
    20.  
    21. var
    22.   Form1: TForm1;
    23.  
    24. implementation
    25.  
    26. {$R *.dfm}
    27.  
    28.  
    29. procedure TForm1.FormActivate(Sender: TObject);
    30. var NewItem : TmenuItem;
    31. begin
    32.   NewItem := TMenuItem.Create(MainMenu1);
    33.   NewItem.Caption := 'Henk';
    34.   MainMenu1.Items[0].Insert(0, NewItem);
    35.  
    36.   NewItem := TMenuItem.Create(MainMenu1);
    37.   NewItem.Caption := 'Piet';
    38.   MainMenu1.Items[0].Insert(1, NewItem);
    39.  
    40.   NewItem := TMenuItem.Create(MainMenu1);
    41.   NewItem.Caption := 'Kees';
    42.   MainMenu1.Items[0].Insert(2, NewItem);
    43. end;
    44.  
    45. procedure TForm1.Henk1Click(Sender: TObject);
    46. begin
    47.   //System.UITypes toevoegen in USES
    48.   MessageDlg('Er is op Henk geklikt.', mtInformation, [mbOK], 0, mbOK);
    49. end;
    50.  
    51. end.

  2. #2
    Je kunt toch dit doen voor alle items:
    Code:
    NewItem.OnClick := @Self.AllItemClick;
    Je kunt daarna in TForm1.AllItemClick aan de hand van (Sender as TMenuItem).Caption bepalen welk menuitem geklikt is.

  3. #3
    Wow, dat is een snel antwoord. Ik ga er mee aan de gang.

  4. #4
    Of (Sender as TMenuItem).Tag voor controle i.v.m. vertalingen.

    Is dit bewust gedaan?

    Code:
    NewItem.OnClick := @Self.AllItemClick;
    
    // Dacht dat meer C++ is adres @ verwijzingen. 
    NewItem.OnClick := Self.AllItemClick;
    Zomaar een vraag hoor...

  5. #5
    Quote Originally Posted by DragonFly View Post
    Is dit bewust gedaan?
    Code:
    NewItem.OnClick := @Self.AllItemClick;
    // Dacht dat meer C++ is adres @ verwijzingen. 
    NewItem.OnClick := Self.AllItemClick;
    Ik heb geantwoord op mijn mobiel en wist het niet zeker meer
    In FPC (in fpc-mode) moet er wel een @ voor.

  6. #6

  7. #7
    Is ook wel logisch. De compiler kan anders alleen afleiden of het een verwijzing is naar die method of het resultaat ervan door naar het type te kijken. Altijd heel verwarrend gevonden dat dat zo ambigu is.
    1+1=b

  8. #8
    Yep, ik ben er uit. Dat wil zeggen, ik heb een oplossing. Zie onderstaande.

    Delphi Code:
    1. unit Main;
    2.  
    3. interface
    4.  
    5. uses
    6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, System.UITypes, Vcl.StdCtrls;
    8.  
    9. type
    10.   TForm1 = class(TForm)
    11.     MainMenu1: TMainMenu;
    12.     Links1: TMenuItem;
    13.     procedure HenkItemClick(Sender: TObject);
    14.     procedure PietItemClick(Sender: TObject);
    15.     procedure KeesItemClick(Sender: TObject);
    16.     procedure FormCreate(Sender: TObject);
    17.   private
    18.     { Private declarations }
    19.   public
    20.     { Public declarations }
    21.   end;
    22.  
    23. var
    24.   Form1: TForm1;
    25.   NewItem : TmenuItem;
    26.  
    27. implementation
    28.  
    29. {$R *.dfm}
    30.  
    31. procedure TForm1.HenkItemClick(Sender: TObject);
    32. begin
    33.   MessageDlg('Er is op Henk geklikt.', mtInformation, [mbOK], 0, mbOK);
    34. end;
    35.  
    36. procedure TForm1.PietItemClick(Sender: TObject);
    37. begin
    38.   MessageDlg('Er is op Piet geklikt.', mtInformation, [mbOK], 0, mbOK);
    39. end;
    40.  
    41. procedure TForm1.KeesItemClick(Sender: TObject);
    42. begin
    43.   MessageDlg('Er is op Kees geklikt.', mtInformation, [mbOK], 0, mbOK);
    44. end;
    45.  
    46. procedure TForm1.FormCreate(Sender: TObject);
    47. begin
    48.   NewItem := TMenuItem.Create(MainMenu1);
    49.   NewItem.OnClick := HenkItemClick;
    50.   NewItem.Caption := 'Henk';
    51.   MainMenu1.Items[0].Insert(0, NewItem);
    52.  
    53.   NewItem := TMenuItem.Create(MainMenu1);
    54.   NewItem.OnClick := PietItemClick;
    55.   NewItem.Caption := 'Piet';
    56.   MainMenu1.Items[0].Insert(1, NewItem);
    57.  
    58.   NewItem := TMenuItem.Create(MainMenu1);
    59.   NewItem.OnClick := KeesItemClick;
    60.   NewItem.Caption := 'Kees';
    61.   MainMenu1.Items[0].Insert(2, NewItem);
    62. end;
    63.  
    64.  
    65.  
    66.  
    67. end.

    Ook als de MenuItems (nog) niet bestaan is het allemaal geen probleem. Maar ik ben nog niet tevreden. Want het allemaal veel te statisch.

    Liever zou ik 1 OnClick procedure willen zien. En daarin uitvissen wie er nu geClickt heeft. Maar hoe doe ik dat?

  9. #9
    Dat heb ik toch al laten zien?
    Je maakt gewoon één onclick.

    Code:
    procedure TForm1.AllItemClick(Sender: TObject);
    var
      ItemStr: String;
    begin
      ItemStr := (Sender as TMenuItem).Caption;
      MessageDlg('Er is op ' + ItemStr + ' geklikt.', mtInformation, [mbOK], 0, mbOK);
    end;
    (Weer op mobiel getikt dus typefouten voorbehouden)

  10. #10
    Jawel, maar voor mij is het allemaal nog niet zo eenvoudig. In ieder geval ben ik nu weer een stapje verder. rvk, bedankt!. En de anderen die geholpen hebben natuurlijk ook.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •