Hallo,
Ik heb een component gemaakt die ik vanaf het componentpalette op mijn form kan plaatsen. Direct bij plaatsen wordt de Paint method aangeroepen zonder dat ik dat expliciet moet opgeven in de code.(Dat is ook de bedoeling).
Als ik hetzelfde component aanmaak met code in runtime dan moet ik in de CreateWnd de paint method aanroepen, anders wordt er niets zichtbaar, ook al heb ik de parent goed ingesteld.
Ik denk dat ik iets verkeerd doe, want paint wordt al aangeroepen als het component uit de componentpalette komt, en dan is het dubbelop.
Ik wil dat het gedrag hetzelfde is als bij een TButton, namelijk zodra je de parent insteld is hij zichtbaar wordt ongeacht of hij wel of niet op het form gesleept is.
Hoe los ik dit op een goede manier op zonder overbodige Paint aanroepen te doen?
Dit is de aanroep om het component te tonen in runtime, werkt goed als de // voor Paint; weer weggehaald worden in CreateWnd:
Code:
procedure TForm1.btnToonTekstClick(Sender: TObject);
var
Tekst: TTekst;
begin
Tekst := TTekst.Create(Self);
Tekst.Parent := Form1;
end;
Dit is de code voor de component:
Code:
unit unitTekst;
interface
uses
Classes, Vcl.Controls, Vcl.Graphics, System.Types;
type
TTekst = class(TCustomControl)
private
FTekst: string;
protected
function getTekst: string; virtual;
procedure setTekst(oTekst: string);
public
constructor Create(Owner: TComponent); override;
destructor Destroy; override;
procedure Paint; override;
procedure CreateWnd; override;
published
property Color;
property Tekst:string read getTekst write setTekst;
end;
procedure Register;
implementation
constructor TTekst.Create(Owner: TComponent);
begin
inherited Create(Owner);
Color := clGreen;
FTekst:='Tekst';
end;
procedure TTekst.CreateWnd;
begin
inherited;
// Paint; //Dit is niet nodig als het een VCL Component is uit het palette
//maar is wel nodig als ik deze component in runtime aanmaak
end;
destructor TTekst.Destroy;
begin
inherited Destroy;
end;
function TTekst.getTekst: string;
begin
Result := FTekst;
end;
procedure TTekst.setTekst(oTekst: string);
begin
FTekst := oTekst;
Invalidate;
end;
procedure TTekst.Paint;
begin
Width := Canvas.TextWidth(Tekst) + 20;
Height := Canvas.TextHeight(Tekst) + 20;
Canvas.TextOut(10, 10, Tekst);
end;
procedure Register;
begin
RegisterComponents('Tekst', [TTekst]);
end;
end.
Bookmarks