AGB  ·  Datenschutz  ·  Impressum  







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

TAction ableiten?

Ein Thema von himitsu · begonnen am 13. Sep 2024 · letzter Beitrag vom 16. Sep 2024
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

TAction ableiten?

  Alt 13. Sep 2024, 15:55
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

WARUM?
$2B or not $2B

Geändert von himitsu (13. Sep 2024 um 15:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

AW: TAction ableiten?

  Alt 13. Sep 2024, 16:08
* 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.
Das könnte man mit einem passenden Eintrag bei Application.ActionUpdateDelay im Zaum halten.

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

WARUM?
Mach doch mal ein Beispielprojekt, damit wir wissen um was es ganeu geht.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 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)
$2B or not $2B

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


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 20:21 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