![]() |
TAction ableiten?
Mahlzeit,
eigentlich wollte ich nur eine TAction mit unserer Übersetzung ableiten, bzw. urspünglich hoffte ich, dass es reicht die TActionList abzuleiten und es dort das in den Events zu machen, ABER * OnChange (TAction und TActionList) wird schwachsinniger Weise nur beim Ändern des Image ausgelöst * OnUpdate wird beim Ändern der Caption ausgelöst, * aber OnUpdate wird pervers oft bei allem möglichem ausgelöst, so dass es nicht benutzbar st z.B. bei einer sichtbaren ActionBar, millisekundenweise, sobald auch nur die Maus sich über die Form bewegt, oder auch nur regungslos drüber schwebt. Oder beim Anzeigen/Neumalen der Form, z.B wenn nach Haltepunkt schrittweise fortgesetzt wird, landet es sofort im EventCode. OK, nun hatte ich also das TAction abgeleitet, anstatt nur der TActionList. (seit 'ner Weile ist das SetCaption nun endlich virtual) Dafür über ein DesignPackage via RegisterActionsInFramework mein IDEActions gegistriert, und nun der Test: * TActionList auf die Form * den ActionListEditor geöffnet (Doppelklick) * dabei wird mein TMyIDEActions.BaseActionClass drei mal aufgerufen * und gibt "meine" TMyAction zurück * aber beim "Action hinzufügen" wird eine TAction erstellt, anstatt der TMyAction :wall: WARUM? |
AW: TAction ableiten?
Zitat:
![]() Zitat:
|
AW: TAction ableiten?
Liste der Anhänge anzeigen (Anzahl: 1)
Nja, erstmal dachte ich mir, ich bräuchte einfach nur die TActionList ableiten
und dort im Changed und Loaded die enthaltenen TActions übersetzen. Aber OnChange/Changed funktionierte halt nicht und OnUpdate war viel zu brutal. Also direkt in den einzelnen Actions, quasi
Delphi-Quellcode:
Und dann noch ein PropertyEditor dran, um im Designer die Texte auswählen zu können.
procedure TCimAction.SetCaption(const Value: string);
begin if not (csDesigning in ComponentState) and EnthältÜbersetzung(Value) then inherited SetCaption(Übersetzen(Value)) else inherited; end; Der PropertyEditor ist kein Problem und auch das SetCaption geht. (zumindest im D11 ... im XE nicht, aber egal) Würde es in der TActionList funktionieren, dann wäre eine Ableitung des TAction nicht unbedingt nötig. Leider erstellt die ActionList nicht ihre Actions, also sie stellt nicht diese Funktion dem ActionManager zur Verfügung, sondern der macht das für sich selbst. Dann wollte ich dem ActionManager in der IDE beibringen, dass er meine neue Ableitung benutzt, anstatt TAction (damit wir nicht z.B. ständig manuell in den DFMs rumpfuschen müssen) Bei den Popups haben wir was ähnliches, also eigene TMenuItem mit einer integrierten Übersetzung. Entweder in der DFM bestehende TMenuItem umbenennen oder über einen ComponentEditor-Link, da unterhalb des Objektinspektor, um im TPopupMenu ein neues TMyMenuItem einzufügen.
Delphi-Quellcode:
Eine Hilfe/Dokumentation gibt es nicht wirklich, abgesehn von Kommentaren und uraltem Code in Kommentaren, vom eigentlichen IDEEditor, dessen Unit aber nicht mitgeliefert wird.
type
TMyAction = class(TAction) protected procedure SetCaption(const Value: string); override; end; procedure TMyAction.SetCaption(const Value: string); begin if not (csDesigning in ComponentState) and not StartsText('XXX', Value) then inherited SetCaption('XXX ' + Value) else inherited; ShowMessage('SetCaption'); end; Hatte grade die Demo fertig und bemerke plötzlich, oh, da war ja noch eine Methode für diese Klasse und damit geht es jetzt. TMyIDEActions.BaseActionClass << nicht die TMyIDEActions.BaseActionListClass TMyIDEActions.DefaultActionClass << sondern die Diese Methode wird zwar auch übertrieben oft aufgerufen (die BaseActionClass nur 3 Mal, beim Öffnen des Editors), aber sie gibt es nur innerhalb des DesignTimePackages (nervt also nur innerhalb der IDE und da zu debuggen geht grade eh nicht, da sich dynamisch geladene Packages, also somit auch alle Runtime- und DesignTime-Packages keine Debuginfos laden) In Unit/Package 1 die erste geplante Variante und in Unit/Package 2 das Aktuelle, im dem IDEEditor. In der Demo wird (wenn 2 Installiert) beim ADD die TMyAction2 erstellt, anstatt einer TAction. (im Editor, siehe Edit-Menü bzw. Doppelklick auf die ActionList) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz