AGB  ·  Datenschutz  ·  Impressum  







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

Aktionen zur Laufzeit einfügen?

Ein Thema von fortuneNext · begonnen am 9. Dez 2008 · letzter Beitrag vom 12. Dez 2008
Antwort Antwort
Seite 1 von 2  1 2      
fortuneNext

Registriert seit: 11. Aug 2007
Ort: Neuss
133 Beiträge
 
Delphi 7 Enterprise
 
#1

Aktionen zur Laufzeit einfügen?

  Alt 9. Dez 2008, 19:08
Hi,

ich habe mir nach diesem Tutorial eine MainMenuBar erstellt und mit dem ActionManager verknüpft. Nun möchte ich, dass die Menüpunkte in einem Submenu dynamisch zur Laufzeit erzeugt werden. Wie ist das anstellbar?

Ich denke, ich muss also eine TCustomAction erzeugen und diese in den ActionManager einfügen. Dazu habe ich den Befehl TActionManager.AddAction gefunden; er erwartet jedoch einen ActionClient - wozu brauche ich den? Wie regele ich das dann später mit der Kategorie? Wenn ich TCustomAction benutzen muss, wie schaffe ich es, dass die Anzahl dynamisch bleibt und dass ich möglichst die TCustumAction s nicht global erzeugen muss?

mfg
fortuneNext
Tim
"Hilfe & Support konnte nicht geöffnet werden. Bitte öffnen sie Hilfe & Support, um das Problem zu beheben."
"No Keyboard found. Press F1 to continue."
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Aktionen zur Laufzeit einfügen?

  Alt 9. Dez 2008, 20:02
Zitat von fortuneNext:
Hi,

ich habe mir nach diesem Tutorial eine MainMenuBar erstellt und mit dem ActionManager verknüpft. Nun möchte ich, dass die Menüpunkte in einem Submenu dynamisch zur Laufzeit erzeugt werden. Wie ist das anstellbar?
Tante Google liefert zu "TActionManager.AddAction" einige Treffer mit anscheinend brauchbarem Sourcecode. Einfach mal "Auf gut Glück" anklicken ...
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
fortuneNext

Registriert seit: 11. Aug 2007
Ort: Neuss
133 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Aktionen zur Laufzeit einfügen?

  Alt 9. Dez 2008, 20:42
Jep, das hatte ich auch schon probiert - hat mir leider aber nicht besonders weitergeholfen. Da ich Actions / Actionmanager das erste mal verwende, blicke ich da grundsätzlich noch relativ wenig durch... Mit den Google-Ergebnissen konnte ich daher leider relativ wenig anfangen, da ich nichtmal genau weiss, was eine Actionlist ist - werde ich noch nachschlagen, aber evtl. findet sich ja hier jemand, der mir allgemeiner weiterhelfen kann, evtl. durch ein anschauliches Codebeispiel
Was zB bei AddAction unklar bleibt: Wird die Action in den Manager kopiert, oder wird bloß ein Verweis gelegt, sodass ich tatsächlich für jede Action eine Variable brauche?
All diese Fragen sind noch relativ verworren bei mir, und Google spuckt leider kein klares Beispiel aus, nur mehrere Schnipsel, deren ich aber nicht vermag, sie passend zu meinen Zwecken zusammenzusetzen...
Tim
"Hilfe & Support konnte nicht geöffnet werden. Bitte öffnen sie Hilfe & Support, um das Problem zu beheben."
"No Keyboard found. Press F1 to continue."
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Aktionen zur Laufzeit einfügen?

  Alt 9. Dez 2008, 20:44
http://cc.codegear.com/item/26380
Markus Kinzler
  Mit Zitat antworten Zitat
fortuneNext

Registriert seit: 11. Aug 2007
Ort: Neuss
133 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Aktionen zur Laufzeit einfügen?

  Alt 9. Dez 2008, 22:56
Oh, ein super Link mkinzler, danke! Ich denke, nun habe ich das Prinzip von Actions soweit verstanden. Was aber leider nicht erwähnt wurde, ist, wie nun Aktionen zur Laufzeit erstellt werden...
Wenn ich das richtig verstanden habe:

TCustomAction createn und einstellen
In die Actionlist einfügen
TCustomAction destroyen (und evtl. den Variablenplatz wiederverwerten)

-> Action ist in der Liste. Wenn ichs richtig verstanden habe, speichert die Liste die Aktionen tatsächlich und enthält nicht nur verweise auf andere Objekte/Variablen.

Problem bleibt weiterhin bestehen: Was muss ich als TActionClient beim AddAction übergeben? Sind damit die Buttons gemeint? Ich benutze nämlich soetwas eigentlich garnicht, sondern nutze wie gesagt das Menü. Das wird allerdings als Client nicht akzeptiert.


mfg
fortuneNext
Tim
"Hilfe & Support konnte nicht geöffnet werden. Bitte öffnen sie Hilfe & Support, um das Problem zu beheben."
"No Keyboard found. Press F1 to continue."
  Mit Zitat antworten Zitat
fortuneNext

Registriert seit: 11. Aug 2007
Ort: Neuss
133 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Aktionen zur Laufzeit einfügen?

  Alt 10. Dez 2008, 14:00
Übrigens, ich hab grad nochmal TActionManager.AddAction in Google eingegeben und auf gut Glück gedrückt... ratet mal wo ich gelandet bin <>_<>
Tim
"Hilfe & Support konnte nicht geöffnet werden. Bitte öffnen sie Hilfe & Support, um das Problem zu beheben."
"No Keyboard found. Press F1 to continue."
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.735 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Aktionen zur Laufzeit einfügen?

  Alt 10. Dez 2008, 14:32
Ich mache das so:
Delphi-Quellcode:
function TEineForm.CreateAction(const AName, ACategory, ACaption: string;
  AShortCut: TShortCut; AOnExecute: TNotifyEvent; AOnUpdate: TNotifyEvent = nil): TAction;
begin
  Result := TAction.Create(Self);
  Result.Name := AName;
  Result.Category := ACategory;
  Result.Caption := ACaption;
  Result.ShortCut := AShortCut;
  Result.OnExecute := AOnExecute;
  Result.ActionList := EineActionList;
end;
Allerdings verwende ich ActionLists pur ohne ActionManager - k.A., ob das einen Unterschied macht.
Uli Gerhardt
  Mit Zitat antworten Zitat
fortuneNext

Registriert seit: 11. Aug 2007
Ort: Neuss
133 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Aktionen zur Laufzeit einfügen?

  Alt 10. Dez 2008, 20:20
Ok Danke erstmal, das scheint zu funktionieren
Allerdings bin ich etwas verwirrt. Wieso funktioniert dieser Code? Wie wird Result eigentlich nach dem Funktionsaufruf behandelt?
Würde man den Code einfach als Schnipsel so einfügen und result als Variable behandeln, würde sie ja schon beim nächsten Aufruf wieder überschrieben werden. Warum funktioniert das in einer separierten Funktion?

Funktioniert das Result so wie die Instanz bei Create ohne Variable, in die das gepackt wird - also irgendwo ins Nirvana geschossen ohne Zugriff? In diesem Fall bleibt der Zugriff natürlich über die Liste enthalten. Wenn ich das richtig verstehe, dann - würde man die Aktion nicht in die Liste eintragen, würde sie im Datennirvana verschwinden?
Wäre es nicht eleganter, das als Constructor einzubauen?

Nichts als Fragen...
Tim
"Hilfe & Support konnte nicht geöffnet werden. Bitte öffnen sie Hilfe & Support, um das Problem zu beheben."
"No Keyboard found. Press F1 to continue."
  Mit Zitat antworten Zitat
fortuneNext

Registriert seit: 11. Aug 2007
Ort: Neuss
133 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Aktionen zur Laufzeit einfügen?

  Alt 11. Dez 2008, 11:51
Ich habe mal rumexperimentiert und nun das gebastelt:

Delphi-Quellcode:
function TfMain.CreateLanguageAction(const AName, ACaption: string; AOnExecute: TNotifyEvent):TAction;
begin
  Result := TAction.Create(MainMenu_ActMan);
  Result.Name := AName;
  Result.Category := 'Language';
  Result.Caption := ACaption;
  Result.OnExecute := AOnExecute;
  Result.ActionList := MainMenu_ActMan;
end;


procedure TfMain.MainMenu_ActManBarClick(Sender: TObject);
var
  x:integer;
begin
  for x := 1 to length(FNAGBasicControl.Lg_LanguageFileList) - 1 do
  begin
    CreateLanguageAction(FNAGBasicControl.Lg_LanguageFileList[x], copy(FNAGBasicControl.Lg_LanguageFileList[x], 1, pos('.ini', FNAGBasicControl.Lg_LanguageFileList[x]) - 1), showmessage('test'));
  end;
end;
Wie genau muss ich nun TNotifyEvent übergeben? Wie kann ich OnExecute Ereignisse festlegen? Muss ich den Namen der Dynamisch erzeugten Aktion vorher schon kennen, um ein Name.OnExecute statisch festzulegen?

Zur Info: Lg_LanguageFileList ist ein Array aus String, der verschiedene Dateinamen enthält. Diese dateinamen sollen dann ohne '.ini' als Optionen im Menü erscheinen.

mfg
fortuneNext
Tim
"Hilfe & Support konnte nicht geöffnet werden. Bitte öffnen sie Hilfe & Support, um das Problem zu beheben."
"No Keyboard found. Press F1 to continue."
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.735 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Aktionen zur Laufzeit einfügen?

  Alt 11. Dez 2008, 12:20
Den OnExecute-Handler musst du manuell erstellen, etwas wie LanguageActionExecute hier:
Delphi-Quellcode:
procedure TfMain.LanguageActionExecute(Sender: TObject);
begin
  Assert(Sender is TAction);
  ShowMessage(TAction(Sender).Caption);
end;

procedure TfMain.MainMenu_ActManBarClick(Sender: TObject);
var
  i: Integer;
begin
  // Das Löschen musst du evtl. anpassen:
  for i := Pred(MainMenu_ActMan.ActionCount) downto 0 do
    MainMenu_ActMan.Actions[i].Free;

  for i := Low(Lg_LanguageFileList) to High(Lg_LanguageFileList) do
    CreateLanguageAction('LanguageAction' + IntToStr(i),
      ExtractFileName(Lg_LanguageFileList[i]),
      LanguageActionExecute);
end;
(Ungetestet, da ich mich mit dem ActionManager-Kram nicht auskenne.)
Uli Gerhardt
  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 21:04 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