`or (FCaption = EmptyStr)` <-- Dat zou ik zelfs weglaten. Als je de caption leeg wilt maken moet dat toch ook kunnen? De eerste keer zijn de caption en de name beide leeg, dus zal de caption al mee veranderen als je de name zet.
Overigens zit dit gedrag al ingebouwd in TControl (en dus ook in jouw TCustomControl-afgeleide):
Je vindt in TControl de Caption property, die ook GetText en SetText gebruikt. Caption is dus inderdaad een alias voor Text, en aangezien beide protected zijn, kan je in je eigen afgeleide zelf bepalen welke je public of published maakt.
Delphi Code:
property Caption: TCaption read GetText write SetText stored IsCaptionStored;
Daarbij heeft SetName al een hele berg logica om te bepalen of al dan niet de text (en dus de caption) gezet moet worden:
Delphi Code:
procedure TControl.SetName(const Value: TComponentName);
var
ChangeText: Boolean;
begin
ChangeText := (csSetCaption in ControlStyle) and
not (csLoading in ComponentState) and (Name = Text) and
((Owner = nil) or not (Owner is TControl) or
not (csLoading in TControl(Owner).ComponentState));
inherited SetName(Value);
if ChangeText then Text := Value;
end;
Een heel verhaal dus, maar het komt er in ieder geval op neer dat je al een Caption property hebt, dat je geen eigen FCaption (en Caption) nodig hebt, en dat je eigenlijk ook de override van SetName niet nodig hebt. Het enige dat je moet doen, is ervoor zorgen dat je de ingestelde caption tekent, en volgens mij is dat alles.
Nog een andere tip trouwens. Als je wilt dat je button reageert als een button, dan zou ik niet beginnen met TCustomControl. Er zit heel veel logica in buttons, in de verschillende click- en hover-states, het tab-gedrag, de relatie met andere buttons, reactie op toetsaanslagen, modalresult e.a. Verschillende buttons uit component-sets (inclusief DevExpress) doen dit ook niet helemaal goed, al is m'n ervaring met DevExpress wel 10 jaar oud.
Als je een button met een plaatje wilt, dus zoals een TBitButton, maar dan beter, dan zou ik afleiden van TButton, of zijn voorouders, TCustomButton of TButtonControl. TButton is een complete button, waar je dus heel simpel een beetje aan kan toevoegen. TCustomButton bevat bijna alles dat TButton heeft, maar het meeste is protected, en de ondersteuning voor styles zit er volgens mij nog niet in. TButtonControl bevat alleen de elementaire functionaliteit van een button-achtig control, maar is ook de basis voor radiobuttons en checkboxen.
Ik heb zelf ooit een ImageButton gemaakt door een TImage op een TButton-afgeleide te zetten. Het enige dat je dan zelf moet programmeren is het maken van de TImage en zorgen dat deze de button als parent heeft, en het beschikbaar maken van een property (bijvoorbeeld een TPicture, of een TImageList + ImageIndex) om een plaatje mee in te stellen.
Bookmarks