AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Brauche Hilfe beim Mainmenu

Ein Thema von CUBEstorm · begonnen am 23. Mär 2007 · letzter Beitrag vom 24. Mär 2007
Antwort Antwort
Seite 1 von 2  1 2      
CUBEstorm

Registriert seit: 8. Sep 2006
12 Beiträge
 
Turbo Delphi für Win32
 
#1

Brauche Hilfe beim Mainmenu

  Alt 23. Mär 2007, 14:30
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Brauche Hilfe beim Mainmenu

  Alt 23. Mär 2007, 14:38
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Brauche Hilfe beim Mainmenu

  Alt 23. Mär 2007, 14:38
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
Klaus
  Mit Zitat antworten Zitat
CUBEstorm

Registriert seit: 8. Sep 2006
12 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Brauche Hilfe beim Mainmenu

  Alt 23. Mär 2007, 14:45
Wie arbeite ich denn mit der Action List?^^
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Brauche Hilfe beim Mainmenu

  Alt 23. Mär 2007, 14:54
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
Miniaturansicht angehängter Grafiken
tactionlist_316.jpg  
Klaus
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Brauche Hilfe beim Mainmenu

  Alt 23. Mär 2007, 14:56
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
  Mit Zitat antworten Zitat
CUBEstorm

Registriert seit: 8. Sep 2006
12 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Brauche Hilfe beim Mainmenu

  Alt 23. Mär 2007, 15:10
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?
  Mit Zitat antworten Zitat
23. Mär 2007, 16:11
Dieses Thema wurde von "Phoenix" von "Programmieren allgemein" nach "VCL / WinForms / Controls" verschoben.
Komponentenfrage...
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: Brauche Hilfe beim Mainmenu

  Alt 23. Mär 2007, 18:30
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
  Mit Zitat antworten Zitat
CUBEstorm

Registriert seit: 8. Sep 2006
12 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Brauche Hilfe beim Mainmenu

  Alt 23. Mär 2007, 18:39
Super

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

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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:44 Uhr.
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