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/)
-   -   VCL-Paintbox: Wie komplett neu zeichnen lassen? (https://www.delphipraxis.net/189300-vcl-paintbox-wie-komplett-neu-zeichnen-lassen.html)

Der schöne Günther 27. Mai 2016 17:06

VCL-Paintbox: Wie komplett neu zeichnen lassen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich verstehe Folgendes nicht:

Ein leeres Formular. Man platziere eine
Delphi-Quellcode:
TPaintBox
und einen
Delphi-Quellcode:
TSplitView
:

Delphi-Quellcode:
  object PaintBox1: TPaintBox
   Left = 0
   Top = 0
   Width = 585
   Height = 299
   Align = alClient
   OnPaint = PaintBox1Paint
   ExplicitLeft = 272
   ExplicitTop = 120
   ExplicitWidth = 105
    ExplicitHeight = 105
  end
  object SplitView1: TSplitView
   Left = 435
   Top = 0
   Width = 200
   Height = 299
   CloseStyle = svcCompact
   DisplayMode = svmOverlay
   OpenedWidth = 200
   Placement = svpRight
   TabOrder = 0
  end
(Und in den SplitView noch einen Button zum Auf- und zuklappen)

Warum liefert folgender Code:

Delphi-Quellcode:
procedure TForm8.Button1Click(Sender: TObject);
begin
   SplitView1.Opened := not SplitView1.Opened;
end;

procedure TForm8.FormCreate(Sender: TObject);
begin
   PaintBox1.Canvas.Pen.Width := 3;
end;

procedure TForm8.PaintBox1Paint(Sender: TObject);
var
   paintRect:   TRect;
   newColor:   TColor;
begin
   paintRect := PaintBox1.ClientRect;
   PaintBox1.Canvas.Brush.Color := Random($FFFFFF);
   PaintBox1.Canvas.FillRect(paintRect);

   paintRect.Inflate(-10, -10);
   PaintBox1.Canvas.Pen.Color := Random($FFFFFF);
   PaintBox1.Canvas.Ellipse(paintRect);
end;
Ein Ergebnis wie das Video im Anhang?
  1. Die Paintbox wird komplett neu gezeichnet wenn ich das Fomular in der Größe ändere. So habe ich das erwartet
  2. Wenn man den SplitView auf und zu macht wird nur ein Teil der Paintbox neu gezeichnet, der Rest bleibt "alt".

Den zweiten Punkt möchte ich nicht. Ich möchte dass alles zusammenpasst. Ist die PaintBox die falsche Komponente für mich?

stahli 27. Mai 2016 17:17

AW: VCL-Paintbox: Wie komplett neu zeichnen lassen?
 
Zwei Ideen:

1) Die Paintbox auf ein Panel setzen und das auf alClient und auf Resize reagieren

2) Zum SplitView1.Opened noch ein Paintbox.Refresh (o.ä.) auslösen

Der schöne Günther 27. Mai 2016 17:25

AW: VCL-Paintbox: Wie komplett neu zeichnen lassen?
 
Das OnResize-Event wird leider nicht ausgelöst wenn sich der SplitView darüber legt. Aber Das OnOpened und OnClosed-Event für den SplitView sind schonmal ein Anfang. Dann kann man die Paintbox noch einmal komplett neu zeichnen lassen, dann stimmt alles wieder.

Danke schon mal :-)


// Update:
Ich habe jetzt statt der PaintBox ein TImage genommen, und alles läuft wie es soll.

Uwe Raabe 27. Mai 2016 18:08

AW: VCL-Paintbox: Wie komplett neu zeichnen lassen?
 
Du kannst auch im
Delphi-Quellcode:
TSplitView.OnClosed
ein
Delphi-Quellcode:
PaintBox1.Invalidate
aufrufen. Das hilft zwar nicht während der Animation, aber sorgt danach für ein Neuzeichnen.

Der schöne Günther 27. Mai 2016 18:19

AW: VCL-Paintbox: Wie komplett neu zeichnen lassen?
 
Ja, das war ja im Endeffekt was stahli vorgeschlagen hat.

Nur sollte das spezielle Teil mit der Paintbox eigentlich nichts von irgendwelchen SplitViews wissen, der hat mit dem nämlich gar nichts am Hut ;-)

Mit dem TImage bin ich jetzt eigentlich glücklich geworden. Da flackert auch nichts mehr wenn man den SplitView auf und zu macht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:06 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