Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: TMS AdvEdit OnChange

  Alt 27. Jan 2020, 16:55
PS: Das ist auch der Grund, warum sich viele Entwickler alle Komponenten nochmal ableiten, selbst wenn sie (noch) nichts geändert haben.

Später kann man dann Problemlos in dieser Ableitung rumfummeln und es ist überall drin.



Beim ClassHelper, wenn du eine Methode überdeckst, dann muß der Scope überall stimmen.
Besser dort die Methode/Property anders benennen, damit wird dann überall definitiv deine Überladung verwendet,
auch wenn man hier dann erstmal alle Stellen finden und ebenfalls anpassen muß, aber wenn der Helper fehlt, dann knallt der Compiler dort,
anstatt still und heimlich doch die Originalmethode aufzurufen.



ClassHelper oder Ableitung (egal ob gleicher ClassName oder ein Neuer) wären die einzigen wirklich praktikablen Lösungen.
Leider kann der TVirtualMethodInterceptor nur alle virtuellen Methoden überschreiben, anstatt nur eine Gewünschte (was dann schon etwas langsam wird), aber im Notfall gibt es auch andere Methoden eine Methode zu hooken.

PS: Nimm dir mal eine neue Form, mit einem Edit drauf und weise in einem Button-OnClick dessen .Text etwas zu.
Und nun pack diese Klasse vor deine TForm1-Implementation. (oder in eine Unit und diese als Letzte ins USES)
Delphi-Quellcode:
type
  TEdit = class(StdCtrls.TEdit)
    function GetText: TCaption;
    procedure SetText(const Value: TCaption);
  public
    property Text read GetText write SetText; // überdecken, weil nicht Virtual die blöden Getter und Setter
  end;

{
//uses StrUtils;

function TEdit.GetText: TCaption;
begin
  Result := ReverseString(inherited Text);
end;

procedure TEdit.SetText(const Value: TCaption);
begin
  inherited Text := ReverseString(Value);
end;
}
Hier muß die neue Klasse für einen Bugfix nicht in der IDE registriert sein (DesignTimePackage) und auch nicht in allen Forms ersetzt werden, sondern der DFM-Loader ersetzt erst zur Laufzeit diese Komponente. (der verwendet zum Erstellen die Deklatation, bzw. den Typ der Komponenten, welche er in seiner Form-Deklaration findet)


In deinem Fall also den Setter von FloatValue überschreiben oder überdecken und dort dann OnChange aufrufen, bzw. die Methode ausführen, in der OnChange aufgerufen wird (z.B. beim TEdit siehe TCustomEdit.Change).



Eventuell könntest du dich auch an Events wie WM_SETTEXT hängen, auf eine Änderung readieren und OnChange aufrufen (aber du erwischst hier eventuell auch andere Stellen, wo bereits OnChange ausgelöst wird, womit das dann doppelt wäre)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (27. Jan 2020 um 17:08 Uhr)
  Mit Zitat antworten Zitat