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:
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;
Und dann noch ein PropertyEditor dran, um im Designer die Texte auswählen zu können.
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:
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;
Eine Hilfe/Dokumentation gibt es nicht wirklich, abgesehn von Kommentaren und uraltem Code in Kommentaren, vom eigentlichen IDEEditor, dessen
Unit aber nicht mitgeliefert wird.
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)