Avatar billede hugopedersen Nybegynder
20. januar 2011 - 09:24 Der er 6 kommentarer og
1 løsning

Dynamisk menu

Jeg har en ganske simpel TMainMenu i mit program hvor jeg gerne vil kunne tilføje nogle menupunkter i runtime.

Jeg har en funktion der finder oplysninger om menupunkterne i en tabel hvor de er valgt ud fra hvilket leve den indloggede bruger har.
Det fungerer helt fint, men jeg har problemer med at finde ud af hvordan jeg tilføjer de oprettede menupunkter til min menu under et bestemt menupunkt. I mit tilfælde under det menupunkt der hedder 'Konti' (mnuMainAccounts)

Jeg ved at koden til at oprette menupunkterne virker da jeg bruger den samme kode til at tilføje menupunkter til en popupmenu i et andet program.
Avatar billede hrc Mester
20. januar 2011 - 10:28 #1
Hej Hugo

Det er lettest hvis der er et menuitem at hægte dem på:

procedure TfrmMain.btnTestClick(Sender: TObject);
var
  mi: TMenuItem;
begin
  mi := TMenuItem.Create(mmTest); // så skal mmTest nok rydde op
  miFiler.Add(mi);
end;
Avatar billede hrc Mester
20. januar 2011 - 10:29 #2
... men at tilføje til mainmenu er nu heller ikke svært:

procedure TfrmMain.btnTestClick(Sender: TObject);
var
  mi: TMenuItem;
begin
  mi := TMenuItem.Create(mmTest);
  mi.Caption := 'hello';
  mmTest.Items.Add(mi);
end;
Avatar billede hugopedersen Nybegynder
20. januar 2011 - 11:07 #3
Det hjalp mig at jeg prøvede programmet her på arbejde :-)
Jeg har nu fået det til at køre næsten 100%
Jeg mangler dog at kunne fange index på det menupunkt hvor de punkter jeg opretter skal ligge som underpunkter.
mnuMain.Items[1] - der skal jeg bruge index på mnuMain.mnuMainAccounts. Det burde man jo nok også kunne gøre.
Næst efter skal jeg så finde ud af hvordan jeg sletter alle menupunkter på mnuMain.mnuMainAccounts

procedure TfrmMain.MenuCreate;
var
  Query: TUniQuery;
  MenuItemEx: TMenuItemExtended;
begin
  AccountsCleanup;
  Query := TUniQuery.Create(Nil);
  Query.Connection := frmDBConn.conDBserver;
  try
    Query.SQL.Clear;
    Query.SQL.Add('SELECT * FROM ' + TableAccounts);
    Query.Execute;
    try
      while not Query.Eof do
        begin
          MenuItemEx := TMenuItemExtended.Create(mnuMain);
          MenuItemEx.GUID := Query.FieldByName('fldaccount_guid').AsString;
          MenuItemEx.Caption := Query.FieldByName('fldaccount_text').AsString;
          MenuItemEx.Account := Query.FieldByName('fldaccount_bank').AsString + '-' + Query.FieldByName('fldaccount_number').AsString;
          MenuItemEx.Header := Query.FieldByName('fldaccount_text').AsString;
          MenuItemEx.OnClick := AccountItemClick;
          mnuMain.Items[1].Add(MenuItemEx);
          Query.Next;
        end;
    except
      on E:exception do
        begin
          Logfile.Error(E.Message);
          Query.Next;
        end;
    end;
  finally
    Query.Free;
  end;
end;
Avatar billede hrc Mester
20. januar 2011 - 11:19 #4
Hvad med mnuMain.mnuMainAccounts.Clear???
Avatar billede hrc Mester
20. januar 2011 - 11:22 #5
Du kan altid tilgå ejeren af det pågældende menupunkt via: (mi.Parent as TMenuItemExtended).EtEllerAndet
Er det dig der extender TMenuItem eller er det noget købenoget?
Avatar billede hugopedersen Nybegynder
20. januar 2011 - 11:27 #6
Det er noget jeg har brygget sammen efter megen søgen rundt om.

type
  TMenuItemExtended = class(TMenuItem)
  private
    fGUID: string;
    fAccount: string;
    fHeader: string;
  published
    property GUID: string read fGUID write fGUID;
    property Account: string read fAccount write fAccount;
    property Header: string read fHeader write fHeader;
  end;

Jeg tror det er på plads nu det hele så smidt lige et svar.
Avatar billede hrc Mester
20. januar 2011 - 12:08 #7
Jubii, så kommer jeg endelig over 30000 points (ikke at det betyder noget for mig, osv, osv)
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