AGB  ·  Datenschutz  ·  Impressum  







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

Canvas.Rectangle malt falschen Bereich??

Offene Frage von "Florian H"
Ein Thema von Florian H · begonnen am 18. Apr 2008 · letzter Beitrag vom 18. Apr 2008
Antwort Antwort
Florian H

Registriert seit: 30. Mär 2003
Ort: Mühlacker
1.043 Beiträge
 
Delphi 6 Professional
 
#1

Canvas.Rectangle malt falschen Bereich??

  Alt 18. Apr 2008, 12:38
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
Florian Heft
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Canvas.Rectangle malt falschen Bereich??

  Alt 18. Apr 2008, 12:47
Du malst falsch. Deine Y Anfangsposition ist immer grösser als die Y Endposition. GDI will immer positive Differenzen zwischen Anfangs- und Endpunkt haben.
  Mit Zitat antworten Zitat
Florian H

Registriert seit: 30. Mär 2003
Ort: Mühlacker
1.043 Beiträge
 
Delphi 6 Professional
 
#3

Re: Canvas.Rectangle malt falschen Bereich??

  Alt 18. Apr 2008, 12:51
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.
Florian Heft
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Canvas.Rectangle malt falschen Bereich??

  Alt 18. Apr 2008, 13:01
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.
  Mit Zitat antworten Zitat
Florian H

Registriert seit: 30. Mär 2003
Ort: Mühlacker
1.043 Beiträge
 
Delphi 6 Professional
 
#5

Re: Canvas.Rectangle malt falschen Bereich??

  Alt 18. Apr 2008, 15:07
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.
Florian Heft
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:18 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