Einzelnen Beitrag anzeigen

Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#1

Paint-Methode wird nicht verwendet.

  Alt 3. Aug 2015, 09:50
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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat