Avatar billede whynot Nybegynder
21. juli 2004 - 22:26 Der er 4 kommentarer og
1 løsning

GTI version af: Tpopupmenu, dynamisk item.add()

Jeg har to forms: form1 og form2.

form1 creater form2 af typen Tform2.. dvs. at form1 kan lave et vilkårligt antal af form2.

på form2 har jeg en popupmenu som jeg gerne vil tillægge punkter i dynamisk.

lige gør jeg det med:

procedure TForm1.AddMenu(var popupmenu: Tpopupmenu);
var
  m1: TMenuItem;
begin
  m1 := TMenuItem.Create(self);
  m1.Caption := '1111';
  m1.OnClick := OnClickProcedure; //TNotifyEvent(trytry);
  popupmenu.Items.Add(m1);
end;

procedure TForm1.OnClickProcedure(sender: TObject);
begin
  showmessage('hjesa v1');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  child: TForm2;
begin
  child := TForm2.Create(Application);
  with child do
  begin
    Addmenu(child.PopupMenu1, OnClickProcedure);
  end;
end;

okey så langt så godt.!.. men denne fremgangsfacon har et kæmpe stort problem - hvis nu jeg gerne vil have en OnClickProcedure2 eller for den sags skyld OnClickProcedure3..4..5 osv.. så bliver jeg nød til at lave en addmenu til hvér enkelt procedure eller også et eller andet klyt med at lave en "case on"/if for at tjekke på en værdi for at finde den korrekte procedure der skal kaldes. Men det resulterer i at hver gang jeg laver et nyt punkt til popupmenuén så skal jeg lave rettelser flere steder for at få det til at fungere.

Kan det ikke gøre nemmere?

.. kan man f.eks. ikke parse navnet på proceduren som skal kaldes af addmenu? f.eks. ved
Addmenu(child.PopupMenu1, OnClickProcedure);

procedure TForm1.AddMenu(var popupmenu: Tpopupmenu; pressting: TProcedure);
var
  m1, m2: TMenuItem;
begin
  m1 := TMenuItem.Create(self);
  m1.Caption := '1111';
  m1.OnClick := pressting; //TNotifyEvent(trytry);
  popupmenu.Items.Add(m1);
end;

...eller er der et andet alternativ? plz help..
Avatar billede hrc Mester
26. juli 2004 - 08:49 #1
Umiddelbart kan jeg ikke se det ufornuftige i at bruge en AddMenu sådan som du har skitseret ovenfor. Min variant ser sådan ud:

procedure TfrmForm2.AddMenuItem(aParent: TMenuItem; const aCaption: string; aOnClickEvent: TNotifyEvent);
var
  NewMenuItem : TMenuItem;
begin
  if not assigned(aParent) then
    exit;

  NewMenuItem := TMenuItem.Create(aParent);
  aParent.Add(NewMenuItem);
  with NewMenuItem do begin
    Caption := aCaption;
    OnClick := aOnClickEvent;
  end;
end;

.. og der er jo ikke den store forskel.
Avatar billede hrc Mester
26. juli 2004 - 09:08 #2
I min kaldende form ser det således ud:

procedure TfrmMain.Button1Click(Sender: TObject);
begin
  with TfrmForm2.Create(self) do begin
    AddMenuItem(miRubbish,'Hello World 1',HelloWorld1);
    AddMenuItem(miRubbish,'Hello World 2',HelloWorld2);
    AddMenuItem(miRubbish,'Hello World 3',HelloWorld3);
    Show;
  end;
end;

procedure TfrmMain.HelloWorld1(Sender: TObject);
begin
  lbLog.Items.Add('Hello world 1');
end;

procedure TfrmMain.HelloWorld2(Sender: TObject);
begin
  lbLog.Items.Add('Hello world 2');
end;

procedure TfrmMain.HelloWorld3(Sender: TObject);
begin
  lbLog.Items.Add('Hello world 3');
end;

(har husket at sætte Action := caFree i form2's OnClose-event)

I eksemplet skriver alle tre procedurer en besked i en TListBox - og der er ingen hensyntagen til om procedure-kaldene "taler" i munden på hinanden (hvilket kunne løses med en mutex).
Avatar billede hrc Mester
26. juli 2004 - 09:09 #3
(miRubbish er det TMenuItem som de nye items skal kobles på)
Avatar billede hrc Mester
30. juli 2004 - 21:39 #4
Sker der noget her??
Avatar billede whynot Nybegynder
31. juli 2004 - 21:33 #5
sorry.. at jeg har været fraværende.!

Jeg har siddet og testet dine forslag og blevet inspireret til en løsning midt i mellem din og min løsning :)

thx!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester