AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Paint-Methode wird nicht verwendet.

Ein Thema von Captnemo · begonnen am 3. Aug 2015 · letzter Beitrag vom 3. Aug 2015
Antwort Antwort
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, 08: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
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Paint-Methode wird nicht verwendet.

  Alt 3. Aug 2015, 09:34
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

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

AW: Paint-Methode wird nicht verwendet.

  Alt 3. Aug 2015, 10:12
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.
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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:33 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