Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - TActionList - ersetzen von Aktionen zur Laufzeit
Petersen - Do 26.07.12 13:51
Titel: TActionList - ersetzen von Aktionen zur Laufzeit
Hallo!
Bei folgender Problemstellung stehe ich irgendwie auf dem Schlauch :(
Angenommen, in einem Projekt gibt es ein Formular (frmMain) - dieses besitzt einen TActionManager, eine TActionList (actlstMain) und eine TToolBar (tlbMain).
In frmMain.actlstMain sei eine TAction "actTest" definiert (ohne "OnExcecute" Event -> also sozusagen inaktiv) zu sehen auf frmMain.tlbMain.
frmMain lädt nun zur Laufzeit verschieden Frames (fraXYZ) - jeweils eines zur Zeit.
Einige dieser fraXYZ besitzen eine TActionList (actlstClient) - ebenfalls mit einer TAction actTest.
Wird so ein Frame geladen, so soll frmMain.actlstMain.actTest eigentlich auf fraXYZ.actlstClient.actTest zeigen.
Nun dachte ich, eine simple Zuweisung a la frmMain.actlstMain.actTest := fraXYZ.actlstClient.actTest und anschließendes frmMain.tlbMain.RecreateControls funktioniert - tut es aber nicht :shock:
Bitte sagt mir, wo mein Denkfehler liegt :oops:
Petersen
Moderiert von
Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 26.07.2012 um 13:53
jaenicke - Do 26.07.12 17:05
Nun ja, du änderst ja nur die Speicheradresse in frmMain.actlstMain.actTest. Wenn dieser Wert danach aber nirgends verwendet wird, bringt das nichts.
Wenn die Komponenten neu erzeugt werden, wird sicher auch die Action neu erzeugt, insofern bringt das nichts.
Wie wäre es, wenn du einfach das OnExecute aus der zweiten Action dem Event in der ersten zuweist?
Petersen - Do 26.07.12 17:37
Das "reinen Ausführen" der Aktion klappt so - da hast Du recht.
Allerdings muss ich irgendwie TActionLink ins Spiel bringen, damit der entsprechende ActionClient (also z.B. der ToolBarButton der frmMain.tblbarMain) auf Änderungen wie z.B. fraXYZ.actTest.Enabled := False reagieren kann.
Was soweit ganz vielversprechend aussieht, ist eine Zuweisung wie frmMain.acttlbMain.ActionClient.Items[x].Action := fraXYZ.actTest.
Hier scheitere ich noch am Image, welches weiterhin von einer TImageList aus frmMain gelesen werden soll ...
Und ob das da oben wirklich der "sauberste" Weg ist?!
Bin weiterhin für Ideen sehr dankbar!
Gruß
Sybok Factor - Fr 27.07.12 10:22
Also, irgendwie verstehe ich noch nicht so ganz, warum du es dir so komplizert machst. Der Actionmanager deaktiviert Items, die aus einer nicht vorhandenen Actionlist stammen, automatisch. Es wäre also eine Möglichkeit Formulare statt Frame zu nutzen (Docking z.B.), ist das Formular nicht erzeugt, gibt es auch die Aktion nicht.
Falls es nur um Buttons geht: Warum legst du auf den Frames nicht eine Toolbar mit den Aktionen und dockst die im Hauptformular an, wenn sie benötigt werden.
Bei mir habe ich das z.B. so gebaut, dass ich Dropdownmenüs habe, die auf den "Clients" liegen und dem jeweiligen Button auf dem Hauptformular zugeordnet werden, wenn der CLient aktiviert (oder bei Deaktivierung entfernt) wird.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!