Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi PaintBox zeichnet trotz Invalidate/Update nicht (https://www.delphipraxis.net/159817-paintbox-zeichnet-trotz-invalidate-update-nicht.html)

MacGuyver 14. Apr 2011 06:51

PaintBox zeichnet trotz Invalidate/Update nicht
 
Moin Leute :hi:

Irgendwie erwische ich immer Fettnäpchen. :lol:

Ich habe eine PaintBox auf eine Form gepackt und onPaint ausprogrammiert. Über einen Timer prüfe ich, ob neu gezeichnet werden muss. Ist das der Fall, führe ich ein Invalidate auf der PaintBox aus.

Schön und gut.

Das Teil zeichnet sich nicht neu. Packe ich kurz ein anderes Fenster dadrüber und nehme es wieder weg, zeichnet er wie er soll.


Es ist zum Verzweifeln



Stefan

DeddyH 14. Apr 2011 07:19

AW: PaintBox zeichnet trotz Invalidate/Update nicht
 
Klappt es, wenn Du statt Invalidate Repaint verwendest?

Bummi 14. Apr 2011 08:18

AW: PaintBox zeichnet trotz Invalidate/Update nicht
 
invalidate sollte funktionieren, wie sieht der Code im Timer aus, ist der Timer aktiv, OnTimer zugeordnet...

Luckie 14. Apr 2011 08:29

AW: PaintBox zeichnet trotz Invalidate/Update nicht
 
Wozu einen Timer? Wenn das fenster neugezeichnet werden muss, wird doch automatisch ein OnPaint ausgelöst und das kannst du auch manuell bei Bedarf auslösen.

http://www.michael-puff.de/Programmi...enBitmap.shtml

EWeiss 14. Apr 2011 10:31

AW: PaintBox zeichnet trotz Invalidate/Update nicht
 
Wenn es nicht neuzeichnet stimmt dein Handle nicht.

Zitat:

Packe ich kurz ein anderes Fenster dadrüber und nehme es wieder weg, zeichnet er wie er soll.
Logisch dann arbeitet ja auch die Main Form und lößt das Repaint aus.
In dem Fall werden alle Kinder die sich auf der Form befinden neugezeichnet.

Setz mal den Clienten zum Screen hole dir dann den Record und führe ein
Invalidate auf der Mainform aus.
Dann zeichnet auch die PaintBox neu.

gruss

DeddyH 14. Apr 2011 10:32

AW: PaintBox zeichnet trotz Invalidate/Update nicht
 
Für PaintBox.Invalidate braucht man kein Handle, das kennt die Komponente ja schon selbst ;)

EWeiss 14. Apr 2011 10:41

AW: PaintBox zeichnet trotz Invalidate/Update nicht
 
Zitat:

Zitat von DeddyH (Beitrag 1095046)
Für PaintBox.Invalidate braucht man kein Handle, das kennt die Komponente ja schon selbst ;)

Kenne jetzt die zusammenhänge nicht kein Code. ;)
Mitunter ist es zwingend notwendig das Invalidate auf der Mainform auszuführen
da Paintbox ein Kind der Mainform ist muss diese Automatisch mit neuzeichnen oder?

gruss

shmia 14. Apr 2011 10:45

AW: PaintBox zeichnet trotz Invalidate/Update nicht
 
Zu jeder Paintbox gibt es ein Modell.
Ohne ein Modell ist es nicht möglich, die Anzeige einer Paintbox zu verändern!
Code:
Modell => Visualierung => Paintbox
Also muss der Code im Timer grundsätzlich so aussehen:
Delphi-Quellcode:
procedure TForm1.Timer1OnTimer(...);
begin
  AendereParameterImModell;
  Paintbox1.Invalidate;
end;
Und es gibt noch eine 2. Regel:
Grundsätzlich (ohne Ausnahme) darf man nur innerhalb des Events OnPaint
auf den Canvas der Paintbox zugreifen!
Es ist also verboten im Event OnShow der Formular oder aus einem Timer heraus auf
den Canvas der Paintbox zu zeichnen.

DeddyH 14. Apr 2011 10:46

AW: PaintBox zeichnet trotz Invalidate/Update nicht
 
Nein, TPaintbox empfängt als Nachkomme von TGraphicControl eigene WM_PAINT-Botschaften.

[edit] Post galt Emil, roter Kasten hatte mal wieder Pause. [/edit]

EWeiss 14. Apr 2011 10:48

AW: PaintBox zeichnet trotz Invalidate/Update nicht
 
Zitat:

Zitat von DeddyH (Beitrag 1095052)
Nein, TPaintbox empfängt als Nachkomme von TGraphicControl eigene WM_PAINT-Botschaften.

[edit] Post galt Emil, roter Kasten hatte mal wieder Pause. [/edit]

Ok Danke ;)

OT:
Jup so ein Edit Flag wäre nicht schlecht .. ;)
Anstelle von Geändert von ...

gruss

MacGuyver 14. Apr 2011 12:38

AW: PaintBox zeichnet trotz Invalidate/Update nicht
 
Mahlzeit,

ich habe das gerade noch einmal durchgespielt:
Invalidate auf der Form bringt nichts.
Ich habe ein Repaint ausgeführt, auch nichts.
Wie weiter oben schon beschrieben habe ich onPaint mal direkt aufgerufen, auch nichts.

Die Daten, die ich zeichne, ändern sich im Programmverlauf. Ich werde da mal nur eine Zeitausgabe einbauen und sehen, wo es hakt.

Ich pflücke das Ding heute Abend auseinander. Mal sehen, was ich aus meinem Code verbannen muss, damit das funktioniert.

Im Normalfall sollte ein Invalidate doch reichen, oder?

Schönen Dank schon mal für eure Unterstützung.

DeddyH 14. Apr 2011 12:56

AW: PaintBox zeichnet trotz Invalidate/Update nicht
 
Ich habe gerade ein kleines Testprogramm geschrieben, das funktioniert wie erwartet.
Delphi-Quellcode:
unit PaintTest;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TfrmTest = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    FPaintBox: TPaintBox;
    FTimer: TTimer;
    FColor: TColor;
    procedure DoOnPaint(Sender: TObject);
    procedure DoOnTimer(Sender: TObject);
  public
    { Public-Deklarationen }
  end;

var
  frmTest: TfrmTest;

implementation

{$R *.dfm}

{ TfrmTest }

function RandomColor: TColor;
begin
  Result := RGB(Random($ff), Random($ff), Random($ff));
end;

procedure TfrmTest.DoOnPaint(Sender: TObject);
begin
  FPaintBox.Canvas.Brush.Color := FColor;
  FPaintBox.Canvas.FillRect(Rect(0, 0, FPaintBox.Width, FPaintBox.Height));
end;

procedure TfrmTest.DoOnTimer(Sender: TObject);
begin
  FColor := RandomColor;
  FPaintBox.Invalidate;
end;

procedure TfrmTest.FormCreate(Sender: TObject);
begin
  FTimer := TTimer.Create(self);
  FTimer.OnTimer := DoOnTimer;
  FPaintBox := TPaintBox.Create(self);
  FPaintBox.Parent := self;
  FPaintBox.Align := alClient;
  FPaintBox.OnPaint := DoOnPaint;
  FColor := RandomColor;
end;

initialization
  Randomize;

end.

MacGuyver 14. Apr 2011 19:42

AW: PaintBox zeichnet trotz Invalidate/Update nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
N'abend,

so, ich habe alles rausgeschnissen, bis fast nichts mehr da ist. Nun habe ich oben links in der Ecke eine Uhrzeit, die läuft nur, wenn ich die Größe des Fensters veränder oder anders das onPaint erzwinge. Ich habe da Debugausgaben eingebaut, da sieht man schön, dass das Invalidate nichts bringt.

Aphton 14. Apr 2011 20:04

AW: PaintBox zeichnet trotz Invalidate/Update nicht
 
Klappt anscheinend nur dann, wenn du FormStyle auf fsNormal setzt

MacGuyver 14. Apr 2011 20:12

AW: PaintBox zeichnet trotz Invalidate/Update nicht
 
Oh nein! :wall:

Danke Aphton :cheers:

Wie ich oben schon geschrieben habe:
Zitat:

Irgendwie erwische ich immer Fettnäpchen.

Stefan

Aphton 14. Apr 2011 20:15

AW: PaintBox zeichnet trotz Invalidate/Update nicht
 
Np, yaw :roll:
Nur warum klappt das nicht, wenn FormStyle so gesetzt ist?

EWeiss 14. Apr 2011 21:09

AW: PaintBox zeichnet trotz Invalidate/Update nicht
 
Zitat:

Zitat von Aphton (Beitrag 1095217)
Np, yaw :roll:
Nur warum klappt das nicht, wenn FormStyle so gesetzt ist?

Hab mir das auch mal angeschaut und einige Experimente gemacht.
Verstehen tu ich das auch nicht.

Vielleicht weil die eigenschaft Autoredraw fehlt ?

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:23 Uhr.

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