AGB  ·  Datenschutz  ·  Impressum  







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

Ewige Wiederholung von Paint

Ein Thema von Leo · begonnen am 7. Mai 2003 · letzter Beitrag vom 7. Mai 2003
Antwort Antwort
Seite 1 von 2  1 2      
Leo

Registriert seit: 10. Apr 2003
Ort: Berlin
32 Beiträge
 
#1

Ewige Wiederholung von Paint

  Alt 7. Mai 2003, 02:53
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.
Manchmal ist die Sicherheitskopie der einzige trost.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2
  Alt 7. Mai 2003, 05: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
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3
  Alt 7. Mai 2003, 07: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]
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4
  Alt 7. Mai 2003, 07:44
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Leo

Registriert seit: 10. Apr 2003
Ort: Berlin
32 Beiträge
 
#5

Panel

  Alt 7. Mai 2003, 14:02
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]
Manchmal ist die Sicherheitskopie der einzige trost.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#6
  Alt 7. Mai 2003, 14:18
Grob gesagt, poste mal den Inhalt der Paint-Methode und(!) nutze die [delphi]-Tags.

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Leo

Registriert seit: 10. Apr 2003
Ort: Berlin
32 Beiträge
 
#7
  Alt 7. Mai 2003, 14: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;
Manchmal ist die Sicherheitskopie der einzige trost.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8
  Alt 7. Mai 2003, 14:52
Also ich würde da jetzt sagen, dass da BeginPaint und EndPaint fehlt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Leo

Registriert seit: 10. Apr 2003
Ort: Berlin
32 Beiträge
 
#9

Hmm?

  Alt 7. Mai 2003, 15:04
gut habe jetzt

Delphi-Quellcode:
  TPS : TPaintStruct;
begin
beginPaint(handle,TPS);
....
endPaint(handle,TPS);
end
eingefügt. Funktioniert trozdem nicht.
Manchmal ist die Sicherheitskopie der einzige trost.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10
  Alt 7. Mai 2003, 15:16
Eine Variable vom Typ TPaintStruct.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 15:53 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