Gegeben sei
Delphi-Quellcode:
type
TFirstComp = class
protected
FTest: string;
procedure SetTest(Value: string);
published
property TestProp: string read FTest write SetTest;
end;
Da kann man nun die Property-Deklaration überschreiben/ändern:
Delphi-Quellcode:
type
TSecondComp = class(TFirstComp)
protected
function StoredTest(Index: Integer): Boolean;
published
property TestProp index 1 stored StoredTest;
end;
Viele nutzen dass, um den Getter/Setter zu ändern, wenn sich keine Getter/Setter-Methode überschreiben (override) lässt.
Sehr bekannt ist sowas auch für das Ändern des Defaultwertes. Oder zum Verschieben der Sichtbarkeit.
Nur knallt das jetzt, wenn z.B. das Property aus der DFM gelesen wird,
denn Delphi ruft SetTest nun freudig mit zwei Parametern auf, obwohl es nur einen Parameter gibt.
Schon, bissl blöd, dass TReader den "INDEX" aus der aktuellen Implementation verwendet, obwohl es in der Basisklasse garkeinen Index gibt.
Aber OK, dann wäre es zumindestens gut, wenn der Compiler hier wenigstens einen Hinweis oder besser noch einen Fehler mir entgegen werfen täte.
(fast 2 Tage lang gesucht)
Eine Lösung wäre jetzt auch den Setter zu überschreiben:
Delphi-Quellcode:
type
TSecondBugfixComp = class(TFirstComp)
protected
procedure SetTest(Index: Integer; Value: string);
function StoredTest(Index: Integer): Boolean;
published
property TestProp index 1 write SetTest stored StoredTest;
end;
So geht es erstmal, bis irgendwann TFirstComp auch einen Getter bekommt und es wieder knallt.
Alles überschreiben oder besser noch gleich das alte Property verdecken und durch eine Neudeklaration ersetzen:
Delphi-Quellcode:
type
TSecondBugfix2Comp = class(TFirstComp)
protected
function GetTest(Index: Integer): string;
procedure SetTest(Index: Integer; Value: string);
function StoredTest(Index: Integer): Boolean;
published
property TestProp: string index 1 read GetTest write SetTest stored StoredTest;
end;
Eigentlich wollte ich mir Arbeit ersparen und den Code kürzer/übersichtlicher halten, indem ich für mehrere Property nur eine StoredProc verwende, anstatt jeweils eine Eigene.