Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#3

AW: TAction ableiten?

  Alt 16. Sep 2024, 15:56
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)
Angehängte Dateien
Dateityp: 7z ActionEditTest.7z (89,1 KB, 2x aufgerufen)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (16. Sep 2024 um 18:24 Uhr)
  Mit Zitat antworten Zitat