Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Canvas.Rectangle malt falschen Bereich?? (https://www.delphipraxis.net/112308-canvas-rectangle-malt-falschen-bereich.html)

Florian H 18. Apr 2008 11:38


Canvas.Rectangle malt falschen Bereich??
 
Aloha,

ich habe folgenden Codeschnippsel (vereinfacht):
Delphi-Quellcode:
var
  filled : integer;
begin
  [...]
  for i:=0 to 4 do
  begin
    amount := 20;
    bmp.Canvas.Brush.Color := part[i].color;
    bmp.Canvas.Rectangle(0, 100-filled, 10, 100-filled-amount);
    inc(filled, amount);
  end;

  bmp.Canvas.Brush.Color := clFuchsia;
  bmp.Canvas.Rectangle(0, 0, 10,100-filled); // !!  filled=80 , 100-filled=100
Der soll mir ein Bmp von unten nach oben mit farbigen Kästchen füllen (funktioniert soweit auch) und dann den letzten Bereich, der noch nicht gefüllt wurde, mit clFuchsia befüllen.

Das komische ist jetzt aber, dass er mit der letzten Anweisung -alles- übermalt.
Kommentiere ich die Zeile aus, macht er brav seine Kästchen und der restliche Bereich ist halt weiß (standardfarbe).

Ich habe bereits mit dem Debugger geschaut: "filled" hat in der letzten Zeile definitiv den Wert "80" .. trotzdem ergibt "100-filled" offenbar 100. Wenn ich das durch "50-filled" ersetze, bemalt er nur die Hälfte der Fläche - filled scheint da einfach 0 zu sein.

Was ist da los? Ich steh' grad echt auf dem Schlauch und fühle mich vergackeiert von Delphi...

Liebe Grüße
Florian

Muetze1 18. Apr 2008 11:47

Re: Canvas.Rectangle malt falschen Bereich??
 
Du malst falsch. Deine Y Anfangsposition ist immer grösser als die Y Endposition. GDI will immer positive Differenzen zwischen Anfangs- und Endpunkt haben.

Florian H 18. Apr 2008 11:51

Re: Canvas.Rectangle malt falschen Bereich??
 
Okay, das ist vielleicht ein Fehler in der Zeichenrountine innerhalb der Schleife .. aber diese hat ja auch davor trotzdem schon funktioniert.
(Habe es jetzt mal vertauscht, hilft aber beim eigentlichen Problem nicht.)


Denn die unterste Zeile ist ja richtigrum... von Y1=0 bis Y2=20 - aber sie malt trotzdem falsch.

Muetze1 18. Apr 2008 12:01

Re: Canvas.Rectangle malt falschen Bereich??
 
Ok, ich habe das ganze nun so übernommen.

Delphi-Quellcode:
procedure TForm1.FormPaint(Sender: TObject);
var
  filled, i, amount: integer;
begin
  filled := 0;

  for i:=0 to 4 do
  begin
    amount := 20;
    Canvas.Brush.Color := clGreen;
    Canvas.Rectangle(0, 100-filled, 10, 100-filled-amount);
    inc(filled, amount);
  end;

  Canvas.Brush.Color := clFuchsia;
  Canvas.Rectangle(0, 0, 10,100-filled); // !!  filled=80 , 100-filled=100
end;
Ich sehe nur die 5 grünen Rechtecke. Von dem clFuchsia ist nichts zu sehen, was auch so richtig ist, da du 5 Schleifendurchläufe hast und somit filled am Ende 100 ist. Somit ergibt sich ein Rectangle von X 0 bis X 0. Somit funktioniert alles bestens, das Problem muss im nicht geposteten Quellcode auf deiner Seite liegen.

Florian H 18. Apr 2008 14:07

Re: Canvas.Rectangle malt falschen Bereich??
 
Ieks, sorry, da hab ich beim Vereinfachen einen Fehler gemacht x_X
Es werden nur 4 Rechtecke gezeichnet normal (die Werte werden alle aus einer DB ausgelesen, den Codeabschnitt habe ich halt ersetzt).

Es ist aber definitiv (!) so (wie im 1. Post geschrieben), dass "filled" in der letzten Zeile den Wert "80" hat und somit 100-80 nur die oberen 20 Pixel zeichnen dürfte .. trotzdem wird das gesamte Bitmap eingefärbt...


Aber der Fehler tritt wohl nur im Zusammenhang mit dem ganzen anderen Programm auf, nur die beteiligten Teile zu extrahieren ist sterbensaufwändig .. werde also wohl selber noch ein bisschen im trüben Wasser fischen müssen um rauszukriegen, an was es liegt.

Danke dir.


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