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)