Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Paint-Methode wird nicht verwendet. (https://www.delphipraxis.net/186093-paint-methode-wird-nicht-verwendet.html)

Captnemo 3. Aug 2015 08:50

Paint-Methode wird nicht verwendet.
 
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.

DeddyH 3. Aug 2015 09:34

AW: Paint-Methode wird nicht verwendet.
 
Und wenn Du DWScale mal im Konstruktor eine intiale Breite und Höhe spendierst? AFAIK wird etwas, das eh nicht zu sehen ist, von Windows auch nicht gezeichnet.

Captnemo 3. Aug 2015 10:12

AW: Paint-Methode wird nicht verwendet.
 
:wall::wall::wall: You made my Day ;)

Warum ich das bei TDWScale nicht gemacht habe, entzieht sich meiner Kenntnis. Vermutlich weil, wenn ich die Komponente direkt auf einer Form verwende, wird ihre Defaultgröße von TForm auf einen Standardwert gesetzt. Deswegen ist mir das wohl nicht mehr aufgefallen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz