Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Brauche Hilfe beim Mainmenu (https://www.delphipraxis.net/88949-brauche-hilfe-beim-mainmenu.html)

CUBEstorm 23. Mär 2007 14:30


Brauche Hilfe beim Mainmenu
 
Servus, ich bin momentan etwas abseits der Schule mit delphi am Üben. Ich habe hier im forum trotz meiner suche nichts gefunden und werfe meine Frage deshalb hier mal in den Raum.

Ich habe ein Mainmenu erstellt mit mehreren Items.
Ich möchte aber nicht für jeden Eintrag im Menu eine eigene Procedure programieren da ich denke,dass die Übersicht mit der Zeit sehr drunter leidet. :?

Ich habe deshalb überlegt ein procedure zu erstellen die mithilfe eines Case .. of überprüft welches Item des Menues ich gedrückt habe und daraufhin eine entsprechende Aktion durchführe. Die Procedure soll also immer dann aktiviert werden wenn ich ein beliebes Item drücke.

Ich habe das bereits mit dem Sender etc probiert habe aber keine Lösung gefunden... kann mir jmd bitte helfen?

mfg CUBE

SirThornberry 23. Mär 2007 14:38

Re: Brauche Hilfe beim Mainmenu
 
du bist schon auf dem richtigen Weg. Du musst jedem Mainmenü-Item die gleiche Procedure(Methode genannt) im Objectinspektor zuweisen und dann anhand des Senders überprüfen welches Item die Methode aufgerufen hat.

Mit Case geht das jedoch nicht weil case einen Ordinalwert erwartet (und Sender ist ein Object). Zudem braucht Case konstante Vergleichswerte und MenuItem1, MenuItem2 etc. haben jedesmal eine andere Speicheradresse womit sie nicht konstant sind.

Du musst also mit If's das ganze prüfen
Delphi-Quellcode:
if (Sender = MenuItem1) then
begin

end
else if (Sender = MenuItem2) then
begin

end;

Klaus01 23. Mär 2007 14:38

Re: Brauche Hilfe beim Mainmenu
 
Nun, ich denke mit einer Procedure für alle MenüEinträge, das wird noch unübersichtlicher.

Hast Du dir als Alternative schon einmal die TActionList angeschaut.

Grüße
Klaus

CUBEstorm 23. Mär 2007 14:45

Re: Brauche Hilfe beim Mainmenu
 
Wie arbeite ich denn mit der Action List?^^

Klaus01 23. Mär 2007 14:54

Re: Brauche Hilfe beim Mainmenu
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das ist eigentlich recht simpel.

Die Komponente auf die Form ziehen, doppelt klicken, Action hinzfügen.
Dem Menüeitrag die erstellte Action zuweisen.

Aber ein Bild sagt mehr als tausend Worte, siehe Anhang.

Grüße
Klaus

marabu 23. Mär 2007 14:56

Re: Brauche Hilfe beim Mainmenu
 
Herzlich willkommen in der Delphi-PRAXiS, CUBEstorm.

Für Items mit ähnlicher Funktion kannst du sehr einfach einen gemeinsamen event handler bereit stellen. Im folgenden Beispiel wird angenommen, dass du die vier möglichen ViewStyles der tag-property der MenuItems zugeiwsen hast:

Delphi-Quellcode:
procedure TDemoForm.ViewStyleClick(Sender: TObject);
begin
  with Sender as TMenuItem do
    ListView.ViewStyle := TViewStyle(Tag);
end;
Genausogut könntest du die Eigenschaft Command des MenuItems als Diskriminator in einem CASE-Statement verwenden.

Noch professioneller ist der Einsatz von TActionList (Erste Palettenseite) und die Zuweisung der Actions an die MenuItems, wie ihn Klaus empfohlen hat. Das hat gleich mehrere Vorteile: So implementierst du (OnExecute) die Aktion nur einmal, egal über welche Schnittstelle (Tastatur, Maus) und welche Komponenten (TMenuItem, TButton, TToolButton) der Benutzer deines Programmes die Aktion auslöst. Darüber hinaus kannst du auch gleich die Verfügbarkeit der Befehle über das Event OnUpdate() komfortabel behandeln.

Freundliche Grüße vom marabu

CUBEstorm 23. Mär 2007 15:10

Re: Brauche Hilfe beim Mainmenu
 
So hab mich in die ActionList eigearbeitet.

Ich kann jetzt mit mehrern Buttons meines MainMenues zb. die Caption von einem Label ändern.
Kann ich jetzt damit zb mit 2 verschiedenen Buttons einem Image 2 verschiedene Bilder zuordnen?

Also beide Buttons sind in der gleichn kategorie der actionlist. Kann ich wenn ich ButtonA drücke der imagekomponete BildA und beim drücken von ButtonB der Imagekomponente BildB zuordnen?

DP-Maintenance 23. Mär 2007 16:11

DP-Maintenance
 
Dieses Thema wurde von "Phoenix" von "Programmieren allgemein" nach "VCL / WinForms / Controls" verschoben.
Komponentenfrage...

marabu 23. Mär 2007 18:30

Re: Brauche Hilfe beim Mainmenu
 
Na sicher kannst du - allerdings verwechselst du wohl einige Begriffe.

Ein MainMenu (TMainMenu) besteht aus MenuItems (TMenuItem) und nicht aus Buttons. Du hast eine ActionList mit einer Action angelegt, die du an zwei MenuItems zugewiesen hast. Wenn die OnExecute-Routine der Action die Kontrolle erhält, dann erfährst du über die property ActionComponent der Action, über welches MenuItem die Aktion angestoßen worden ist:

Delphi-Quellcode:
procedure TDemoForm.ActionExecute(Sender: TObject);
begin
  with Sender as TAction do
    if ActionComponent is TMenuItem then
      ShowMessage(TMenuItem(ActionComponent).Caption);
end;
Auf diese Weise kannst du natürlich auch zwei verschiedene Bilder an eine Image-Komponente zuweisen.

Freundliche Grüße

CUBEstorm 23. Mär 2007 18:39

Re: Brauche Hilfe beim Mainmenu
 
Super :bounce2:

Das hat wunderbar funktioniert!
Du hast meine Ferien gerettet^^ jetzt kann ich nämlich die Zeit über komplett durcharbeiten wenn ich langeweile hab :mrgreen:

Danke dann nochmal an alle die mir geholfen haben für die schnellen Antworten .

mfg CUBE

Edit: :( man ich hab hier probleme^^
Ich wollte ja eigentlich den Namen des MenuItems einer Variable zuordnen. Habe ich auch gemacht. Ich kann die Variable "vName" nachher ohne weiteres auf einem label wiedergeben. Das klappt soweit. Ich hatte ebenfalls vor "vName" von einem case of überprüfen zu lassen, damit ich wie ich vorhatte abhängig vom Namen des MenuItems, verschiedene Aktionen durchführen kann. Problem ist, dass ein Ordinaltyp erwartet wird. Kann es sein dass Case of nicht damit klarkommt dass vName eine Variable vom Typ String ist oder habe ich im Quellcode etwas vergessen?

Delphi-Quellcode:
procedure TForm1.Action1Execute(Sender: TObject);
var vName: String; //Variable die nachher vom Case of überprüft werden soll
begin
  with Sender as TAction do
    begin
      if ActionComponent is TMenuItem then
      vName := (TMenuItem(ActionComponent).name);
    end;
  case vName of //Case of Überprüfung
  MenuItem1 : Label1.Caption := vName; //und hier entsprechende folge Aktion sofern vName "menuItem1 alst inhalt hat
end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:39 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz