Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Canvas in Schleifen (https://www.delphipraxis.net/184318-canvas-schleifen.html)

Konny 17. Mär 2015 22:44

Canvas in Schleifen
 
Hallo allerseits,

Ich möchte gerne mithilfe des Canvasbefehls Canvas.Pixels[X,Y]:=TColor Ein beliebiges Objekt zeichnen, z.B. einen Kreis oder eine Ellipse etc.
Dazu rechne ich X und Y für jeden Punkt aus und färbe diesen dann. Wie ich das genau berechne möchte ich hier jetzt gar nicht groß erklären, denn mein eigentliches Problem ist das ich am Ende jedes meiner vielen Versuche vor dem Problem stehe, dass der Canvasbefehl einfach nicht ausgeführt wird. Hier ein Beispiel(Nur ein Test für den Sachverhalt, nicht mein eigentliches Programm...):

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=1 to 100 do
Canvas.Pixels[i,201]:=clBlack;
Canvas.Pixels[i,202]:=clBlack;
Canvas.Pixels[i,203]:=clBlack;
Canvas.Pixels[i,204]:=clBlack;
Canvas.Pixels[i,205]:=clBlack;
end;

Meines Wissens nach müsste es jetzt eine 5 Pixel breite und 100 Pixel lange Linie zeichnen, oder?
Aber, wenn ich diesen Quelltext ausführen lasse und auf den Button klicke passiert einfach: Nichts.....:thumb:
oder es kommt eine Fehlermeldung, dass C:/.../Programmname/Project1.exe nicht gefunden wurde.

Bitte helft mir ich kenn mich mit Canvas nicht wirklich aus und verstehe nicht, warum das nicht funktioniert, ich hab alles schon mal statt einer Schleife mit einem Timer gemacht und es funktionierte perfekt. Aber wenn ich wirklich etwas zeichnen will, dauert das mit dem Timer zu lange... :(

Popov 17. Mär 2015 22:51

AW: Canvas in Schleifen
 
Deine For Schleife führt die Schleife nur bei dem ersten Canvas aus.

Wenn du es richtig machen willst, dann musst du alle Canvas in den Block setzten:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
begin
  for i:=1 to 100 do
  begin
    Canvas.Pixels[i,201]:=clBlack;
    Canvas.Pixels[i,202]:=clBlack;
    Canvas.Pixels[i,203]:=clBlack;
    Canvas.Pixels[i,204]:=clBlack;
    Canvas.Pixels[i,205]:=clBlack;
  end;
end;

himitsu 17. Mär 2015 23:11

AW: Canvas in Schleifen
 
Eine ordentliche Codeformatierung zeigt ebenfalls das Problem und außerdem sagt sogar der Compiler, daß hier etwas nicht stimmt.
Delphi-Quellcode:
var
  i: integer;
begin
  for i := 1 to 100 do
    Canvas.Pixels[i, 201] := clBlack;
  Canvas.Pixels[i, 202] := clBlack;
  Canvas.Pixels[i, 203] := clBlack;
  Canvas.Pixels[i, 204] := clBlack;
  Canvas.Pixels[i, 205] := clBlack;
end;
Aber warum wird denn kein Debugger verwendet und warum wird nicht auf das gehört, was der Compiler dir sagt?

Im Debugger sieht man sehr gut (F7), daß nur das erste Canvas.Pixels in der Schleife ausgeführt wird
und der Compiler sagt ebenfalls, daß der zweite i-Zugriff nicht in der Schleife liegt.
Zitat:

[dcc32 Warnung] Unit23.pas(82): W1037 FOR-Schleifenvariable 'i' kann nach Durchlauf undefiniert sein

jaenicke 18. Mär 2015 06:11

AW: Canvas in Schleifen
 
Zitat:

Zitat von Konny (Beitrag 1293830)
Aber, wenn ich diesen Quelltext ausführen lasse und auf den Button klicke passiert einfach: Nichts.....:thumb:

Die Zeichenbefehle gehören in das OnPaint. Denn sobald ein anderes Fenster deines verdeckt, ist sonst alles Gezeichnete wieder weg. Luckie hat da ein Beispiel:
http://michael-puff.de/Programmierun...enBitmap.shtml

Zitat:

Zitat von Konny (Beitrag 1293830)
oder es kommt eine Fehlermeldung, dass C:/.../Programmname/Project1.exe nicht gefunden wurde.

Das dürfte am Virenscanner liegen.

Konny 18. Mär 2015 08:33

AW: Canvas in Schleifen
 
Ok, danke erstmal für die schnellen Antworten. :)
Tatsächlich, jetzt geht'S... Ich sollte mir nochmal meinne Schleifen anschauen;)
Danke auch für den Tipp mit OnPaint.
:stupid:


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