Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Ewige Wiederholung von Paint (https://www.delphipraxis.net/4633-ewige-wiederholung-von-paint.html)

Leo 7. Mai 2003 01:53


Ewige Wiederholung von Paint
 
Hallo,

wodurch kann es kommen, das eine Paintfunktion einer Komponente unentwegt aufgerufen wird, ohne dass die Komponennte veränder, bewegt oder überdeckt wird. Normaler weise sollte die Paint funktion doch nur bei Veränderungen aufgerufen werden.

Luckie 7. Mai 2003 04:36

Was meinst du mit PaintFunktion? Die gibt es in dem Sinne nicht. Ein Fenster bekommt von Windows ein WM_PAINT geschickt, wenn es neu gezeichnet werden muß. Dies entspricht dem OnPaint-Ereignis einer VCL-Komponente. An dieser Stelle werden dann alle nötigen "Paint-Maßnahmen" durchgeführt. Greift man an dieser Stelle nicht ein übernimmt Windows alles, weil dann die Nachricht an die Standardfensterprozedur weitergereicht wird.

Noch mal zu WM_PAINT:
Delphi-Quellcode:
WM_PAINT:
begin
  dc := BeginPaint(ps);
  { Punkt, Punkt, Komma, Strich, fertig ist das Mondgesicht }
  EndPaint(ps);
end;
Wichtig ist hier das EndPaint. Denn dies sagt Windows, dass alle nötigen Paint-Aktionen durchgeführt wurden und das Fenster wieder aktuell ist. Läßt man das EndPaint weg, bekommt Windows keine Bestätigung, dass alle Paint-Aktionen durchgeführt wurden und denkt, das Fenster wäre noch ungültig, so dass es die nächste WM_PAINT-Nachricht schickt. Und dann geht alles von vorne los. Es kann also passieren, dass dein Fenster von Windows mit WM_PAINT-Nachrichten zu geballert wird und nur damit beschäftigt ist seinen Fensterinhalt neu zu zeichnen und zu gar nichts anderem mehr kommt.

Mehr dazu und ein Beispiel gibt es hier: Grundlagen der GDI

jbg 7. Mai 2003 06:19

Die VCL erledigt das Vor und Nach dem OnPaint Ereignis automatisch.
Delphi-Quellcode:
WM_PAINT:
  begin
    Canvas.Handle := BeginPaint(ps);

    Paint; // -> OnPaint aufrufen

    EndPaint(dc);
  end;
[edit=Daniel B]Delphi-Tags eingefügt. MfG Daniel B.[/edit]

Luckie 7. Mai 2003 06:44

Zitat:

Zitat von jbg
Die VCL erledigt das Vor und Nach dem OnPaint Ereignis

Ob du es glaubst oder nicht, aber das habe ich jetzt einfach erwartet. :mrgreen:

Leo 7. Mai 2003 13:02

Panel
 
Grob gesagt, ich habe eine neue Klasse auf der Basis von TPanel erstellt und folgendes getan

Delphi-Quellcode:
type
  TBox = class(TPanel)    
    ...
  public
    procedure paint; override;
    ...
  end

procedure TBox.Paint;
begin
...
end
Tja???

[Edit=Sakura]DELPHI-Tags eingefügt[/Edit]

sakura 7. Mai 2003 13:18

Grob gesagt, poste mal den Inhalt der Paint-Methode und(!) nutze die [delphi]-Tags.

...:cat:...

Leo 7. Mai 2003 13:35

Delphi-Quellcode:
type
  TBox = class(TPanel)
  private
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
    AusgabeBereich : TImage;  
  public
    { Public-Deklarationen }

    procedure paint; override;

    constructor create(AOwner: TComponent); override;
    destructor destroy; override;
  published
    { Published-Deklarationen }
  end;

...

Procedure TBox.Paint;
var
  Bitmap : TBitmap;
begin
Bitmap := AusgabeBereich.Picture.Bitmap;
Bitmap.Width := AusgabeBereich.Width;
Bitmap.Height := AusgabeBereich.Height;
Bitmap.Canvas.Brush.style := bsSolid;
Bitmap.Canvas.Brush.color := clWhite;
Bitmap.Canvas.Rectangle(0,0,Bitmap.Width,Bitmap.Height);
end;

Luckie 7. Mai 2003 13:52

Also ich würde da jetzt sagen, dass da BeginPaint und EndPaint fehlt.

Leo 7. Mai 2003 14:04

Hmm?
 
gut habe jetzt

Delphi-Quellcode:
  TPS   : TPaintStruct;
begin
beginPaint(handle,TPS);
....
endPaint(handle,TPS);
end
eingefügt. Funktioniert trozdem nicht. :cry:

Luckie 7. Mai 2003 14:16

Eine Variable vom Typ TPaintStruct.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:53 Uhr.
Seite 1 von 2  1 2      

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