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/)
-   -   FillRect mit weißer Farbe funktioniert nicht! (https://www.delphipraxis.net/195693-fillrect-mit-weisser-farbe-funktioniert-nicht.html)

sko1 19. Mär 2018 06:42

FillRect mit weißer Farbe funktioniert nicht!
 
Hallo,
in einer eigenen Komponente (von TSpeedButton abgeleitet) möchte ich einen blauen Rahmen mit weißem Inhalt haben.

Also habe ich im Paint der Komponente folgendes stehen:

Delphi-Quellcode:
procedure TTerminButton.Paint;
var
  b, h: single;
begin
  inherited;
  b := Width;
  h := Height;
  canvas.BeginScene;
  canvas.Fill.Kind := TBrushKind.Solid;
  canvas.Stroke.Kind := TBrushKind.Solid;
  canvas.ClearRect(RectF(0, 0, b, h), TAlphaColors.White);
  canvas.Fill.Color := TAlphaColors.Blue;
  canvas.Stroke.Color := TAlphaColors.Blue;
  canvas.FillRect(RectF(1, 1, b - 1, h - 1), 0, 0, AllCorners, 100);
//innen
  canvas.Fill.Color := TAlphaColors.White;
  canvas.Stroke.Color := TAlphaColors.White;
  canvas.FillRect(RectF(2, 2, b - 2, h - 2), 0, 0, AllCorners, 100);
  canvas.EndScene;
aber der Hintergrund ist so grau wie das darunterliegende Panel mit einem GridPanelLayout, auf dem meine Buttons sitzen.
Nehme ich für innen eine andere Farbe (gelb, rot, etc.) funktioniert das korrekt!

Warum zum teufel funktioniert weiß nicht?

Ciao
Stefan

bytecook 19. Mär 2018 08:51

AW: FillRect mit weißer Farbe funktioniert nicht!
 
Zitat:

Zitat von sko1 (Beitrag 1396564)
Hallo,
in einer eigenen Komponente (von TSpeedButton abgeleitet) möchte ich einen blauen Rahmen mit weißem Inhalt haben.

Also habe ich im Paint der Komponente folgendes stehen:

Delphi-Quellcode:
procedure TTerminButton.Paint;
var
  b, h: single;
begin
  inherited;
  b := Width;
  h := Height;
  canvas.BeginScene;
  canvas.Fill.Kind := TBrushKind.Solid;
  canvas.Stroke.Kind := TBrushKind.Solid;
  canvas.ClearRect(RectF(0, 0, b, h), TAlphaColors.White);
  canvas.Fill.Color := TAlphaColors.Blue;
  canvas.Stroke.Color := TAlphaColors.Blue;
  canvas.FillRect(RectF(1, 1, b - 1, h - 1), 0, 0, AllCorners, 100);
//innen
  canvas.Fill.Color := TAlphaColors.White;
  canvas.Stroke.Color := TAlphaColors.White;
  canvas.FillRect(RectF(2, 2, b - 2, h - 2), 0, 0, AllCorners, 100);
  canvas.EndScene;
aber der Hintergrund ist so grau wie das darunterliegende Panel mit einem GridPanelLayout, auf dem meine Buttons sitzen.
Nehme ich für innen eine andere Farbe (gelb, rot, etc.) funktioniert das korrekt!

Warum zum teufel funktioniert weiß nicht?

Ciao
Stefan

Hi Stefan,

füll das Weiß mit Fillrect, oder nimm als Füllfarbe mal $FFFFFFFF statt TAlphaColors.White ...

Gruß,

Peter

KodeZwerg 19. Mär 2018 09:26

AW: FillRect mit weißer Farbe funktioniert nicht!
 
Hier findest Du bestimmt eine Lösung, da wird zwar TButton genommen aber das Prinzip müssste das gleiche sein.

sko1 19. Mär 2018 09:35

AW: FillRect mit weißer Farbe funktioniert nicht!
 
Hallo Peter,

nein, hilft nicht!

Was mir aber nun bei 'zig Versuchen aufgefallen ist:

Schreibe ich eine OnPaint-Procedure in der FormMain und weise diese meiner Komponente zu, funktioniert es!
Hier aber habe ich als Parameter vom Paint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF), in der Komponente nicht!

Versuche ich diese Parameter in der Komponente zu verwenden, wird
Delphi-Quellcode:
  protected
    { Protected-Deklarationen }
    procedure Paint(Sender: TObject; Canvas: TCanvas;
      const ARect: TRectF); override;
E2037 Deklaration von 'Paint' unterscheidet sich von vorheriger Deklaration

bemängelt!

Hast Du eine Idee was da schiefläuft?

Ciao
Stefan

sko1 19. Mär 2018 12:24

AW: FillRect mit weißer Farbe funktioniert nicht!
 
Lösung:

Ich habe in der Komponente nun eine

Delphi-Quellcode:
MyPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF)


und diese im OnCreate der Komponente zugewiesen.
Jetzt wird wie gewünscht gezeichnet, warum ein

Delphi-Quellcode:
Paint; overwrite;


nicht korrekt gezeichnet hat, bleibt ein Rätsel...

Ciao
Stefan

jziersch 19. Mär 2018 12:31

AW: FillRect mit weißer Farbe funktioniert nicht!
 
Zitat:

Zitat von sko1 (Beitrag 1396607)
warum ein

Delphi-Quellcode:
Paint; overwrite;
nicht korrekt gezeichnet hat, bleibt ein Rätsel...

Ich würde sagen das hat mit den Stilen zu tun.
Wenn eine Komponente nur durch ihren Stil gezeichnet wird, ruft sie intern Paint nicht auf, was sich mit einem breakpoint in Paint verifizieren lässt.

sko1 19. Mär 2018 12:42

AW: FillRect mit weißer Farbe funktioniert nicht!
 
Das dumme aber ist, dass das Paint gefeuert wurde, per Breakpoint überprüft!

Ciao
Stefan

jziersch 19. Mär 2018 14:28

AW: FillRect mit weißer Farbe funktioniert nicht!
 
Abgleitet von einem TSpeedButton funktioniert mein code in einer klasse:

Code:
procedure TSpecButton.Paint;
var r : TRectF;
begin
  inherited;
  r := ClipRect;
  canvas.BeginScene;
  canvas.Fill.Kind := TBrushKind.Solid;
  canvas.Stroke.Kind := TBrushKind.Solid;
  canvas.FillRect(r, 0,0, AllCorners, TAlphaColors.White);
  canvas.Stroke.Color := TAlphaColors.Blue;
  canvas.Fill.Kind := TBrushKind.None;
  InflateRect(r,-1, -1);
  canvas.DrawRect(r, 0, 0, AllCorners, 100);
  canvas.EndScene;
end;
Ich könnte mir aber vorstellen, dass ClearRect, wie in dem original code verwendet, manchmal anders funktioniert. Soweit ich verstanden habe ist dies eigentlich für bitmaps gedacht - ich habe es zumindest nie verwendet.


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