Hi, mein Problem ist etwas komplizierter.
Ich entwickele gerade mehrere Komponenten, die allesamt auf TGraphicControl basieren. Bisher ist aber nur eine dieser Komponenten fertig gestellt.
Diese Komponenten sind für sich allein verwendbar und erscheinen in der Palette.
Da die Komponenten ab sinngemäß miteinander zusammenarbeiten können, was später über den
OI einstellbar ist, will ich noch eine weiter Komponente (TWinControl) dazu verwenden, als Container zu fungieren, um so alle zusammengehörigen Komponente mit innerhalb dieses Containers auf die Form zu bringen, und automatisch gegeneinander auszurichten.
So weit, so gut.
Als erstelle ich mir die Containerkomponente, in dessen Create ich die Komponenten, die automatisch drin vorhanden sein sollen, erstelle. Ich nenne die Containerkomponente mal TDWContPanel und die Komponente, die da rein soll, TDWScale.
Die TDWScale wir auch erwartungsgemäß erzeugt, und ich kann auf sie ohne Probleme zugreifen. Was leider nicht passiert ist, wie der Threadtitel schon sagt, dass die Paint-Methode der TDWScale ausgeführt wird.
Also habe ich mir mal auf die Schnelle eine neue Komponente erstellt TDemoClient ebenfalls basierend auf TGraphicControl mit einem einfachen Canvas.Textout in der Paint-Methode.
Und bei der wird die Paint-Methode ausgeführt, bei der ersten nicht. Beide werden auf die gleich weise erzeugt. In beiden wird die Paint-Methode protected überschrieben.
Interessant ist vielleicht, das bei der TDWScale auch Nachricht scheinbar nicht ankommt WM_PAINT nicht ankommt. Denn die in der
Vcl.Controls wurde TGraphicControl.WMPaint nie ausgelöst. D.h. sie wird schon einmal ausgelöst, aber leider nur für die Komponente TDemoClient, die ja nur zum Testen geschrieben wurde. Ohne die TDemoClient wird sie gar nicht ausgelöst.
Natürlich umfasst die TDWScale um einige mehr Funktionen, Objekte und Properties, und auch die Paint-Methode ist um einiges umfangreicher. Allein läuft die TDWScale einwandfrei.
Jetzt meine Frage: Woran könnte sowas liegen. Ich habe schon in der TDWScale alles soweit auskommentiert, dass im Grund nur noch das Create und das Paint drin war. Ich fange auch in der TDWScale keine Messages ab, auch nicht in der Containerkomponente.
TDWScale:
Delphi-Quellcode:
unit DwScales;
interface
uses System.Classes,
Vcl.Controls;
Type
TDWScale=class(TGraphicControl)
private
FUnitString:
string;
//Skalenbezeichner
procedure SetUnitString(
const Value:
string);
protected
procedure Paint;
override;
public
constructor Create(AOwner: TComponent);
override;
published
property UnitString:
string read FUnitString
write SetUnitString;
end;
procedure Register;
implementation
{$R HixScales.dcr}
procedure Register;
begin
RegisterComponents('
Test',[TDWScale]);
end;
constructor TDWScale.Create(AOwner: TComponent);
begin
inherited;
self.Left:=20;
self.Top:=20;
end;
procedure TDWScale.Paint;
begin
inherited;
Canvas.TextOut(10,10, '
DwScales');
end;
procedure TDWScale.SetUnitString(
const Value:
string);
begin
FUnitString := Value;
Repaint;
end;
end.
TDemoClient:
Delphi-Quellcode:
unit DemoClient;
interface
uses Vcl.Controls, System.Classes;
Type
TDemoClient=class(TGraphicControl)
private
FText:
string;
procedure SetText(
const Value:
string);
public
constructor Create(AOwner: TComponent);
override;
protected
procedure Paint;
override;
published
property Text:
string read FText
write SetText;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('
Test', [TDemoClient]);
end;
{ TDemoClient }
constructor TDemoClient.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
self.Width:=100;
self.Height:=50;
self.FText:='
Text';
self.Parent:=AOwner
as TWinControl;
end;
procedure TDemoClient.Paint;
begin
inherited;
Canvas.TextOut(10,10,self.FText);
end;
procedure TDemoClient.SetText(
const Value:
string);
begin
FText := Value;
Repaint;
end;
end.
Und die ContainerKomponente:
Delphi-Quellcode:
unit DWContPanel;
interface
uses System.Classes,
Vcl.Controls, DWScales, DemoClient;
type
TDWContPanel=class(TWinControl)
private
FScaleX: TDWScale;
// FDClient: TDemoClient;
procedure SetScaleX(
const Value: TDWScale);
// procedure SetDClient(const Value: TDemoClient);
public
constructor Create(AOwner: TComponent);
override;
published
property ScaleX: THixScale
read FScaleX
write SetScaleX;
// property DClient: TDemoClient read FDClient write SetDClient;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('
Test',[TDWContPanel]);
end;
{ TDWContPanel}
constructor TDWContPanel.Create(AOwner: TComponent);
begin
inherited;
self.ControlStyle:=[csFramed, csAcceptsControls];
self.Width:=640;
self.Height:=480;
Self.FScaleX:=TDWScale.Create(Self);
// self.FDClient:=TDemoClient.Create(self);
end;
//procedure TDWContPanel.SetDClient(const Value: TDemoClient);
//begin
// FDClient := Value;
//end;
//
procedure TDWContPanel.SetScaleX(
const Value: TDWScale);
begin
FScaleX := Value;
end;
end.