![]() |
Achsenkreuz skalieren mit for-to-Schleife
Hallo,
ich will wie im anderen Thread erwähnt einen GTR nachprogrammieren, das Achsenkreuz ist jetzt einstellbar, nur muss der Ursprung noch in der PaintBox liegen, das reicht aber aus. Nun will ich die Achsen skalieren, allerdings will Delphi nicht so, wie ich es will:
Code:
Die y-Achse ist zu vernachlässigen.
procedure TForm1.Button1Click(Sender: TObject);
var xmin, xmax, ymin, ymax, deltax, deltay, einheitx, einheity, strichposx, strichposy, i: integer; mystring: String; begin xmin:=IntEdit1.Value; xmax:=IntEdit2.Value; ymin:=IntEdit3.Value; ymax:=IntEdit4.Value; deltax:=xmax-xmin; deltay:=ymax-ymin; einheitx:=PaintBox1.Width div deltax; einheity:=PaintBox1.Height div deltay; IntEdit5.Value:=deltax; IntEdit6.Value:=einheitx; IntEdit7.Value:=deltay; IntEdit8.Value:=einheity; //x-Achse PaintBox1.Canvas.MoveTo(0,round(einheity*ymax)); PaintBox1.Canvas.LineTo(Paintbox1.Width,round(einheity*ymax)); //myString := ''; for i:=0 to deltax do strichposx:=i*einheitx; PaintBox1.Canvas.MoveTo(strichposx,(round(einheity*ymax))-5); PaintBox1.Canvas.LineTo(strichposx,(round(einheity*ymax))+5); //myString := myString + IntToStr(i); //Edit1.Text:=myString; //y-Achse PaintBox1.Canvas.MoveTo(round(einheitx*xmax),0); PaintBox1.Canvas.LineTo(round(einheitx*xmax),Paintbox1.Height); end; Edit1 zeigt auch 21 an, wie es sein sollte, also muss der Fehler irgendwo hier liegen, oder?
Code:
Hier soll strichposx zuerst den Wert 0 haben, dann den Wert einer Längeneinheit auf der x-Achse mal 1, dann mal 2 usw.
strichposx:=i*einheitx;
PaintBox1.Canvas.MoveTo(strichposx,(round(einheity*ymax))-5); PaintBox1.Canvas.LineTo(strichposx,(round(einheity*ymax))+5); strichposx soll also die x-Koordinate der kleinen Skalierungsstriche sein, und mit (round(einheity*ymax))-/+5 will ich eine y-Koordinate einmal 5 Pixel über der x-Achse und einmal unter ihr angeben, damit ich einen 10 Pixel langen Skalierungsstrich erhalte. Es erscheint aber rein gar kein Strich, nur das Achsenkreuz, wie gehabt. Wo liegt mein Fehler? Ich bedanke mich im Vorraus für Antworten! :) Grüße P.S.: Zitat:
|
AW: Achsenkreuz skalieren mit for-to-Schleife
Ich hab's mal anders formatiert und die Einrückung korrigiert:
Delphi-Quellcode:
Beantwortet das die Frage?
for i:=0 to deltax do
strichposx:=i*einheitx; PaintBox1.Canvas.MoveTo(strichposx,(round(einheity*ymax))-5); PaintBox1.Canvas.LineTo(strichposx,(round(einheity*ymax))+5); //myString := myString + IntToStr(i); //Edit1.Text:=myString; //y-Achse PaintBox1.Canvas.MoveTo(round(einheitx*xmax),0); PaintBox1.Canvas.LineTo(round(einheitx*xmax),Paintbox1.Height); |
AW: Achsenkreuz skalieren mit for-to-Schleife
Nein, das beantwortet sie leider nicht, da passiert nach wie vor nichts.. :/
Das Problem liegt bei der Verarbeitung der Schleifenvariablen, also i. Anstatt das die move-to und line-to-Anweisungen jeden i-Wert benutzen, benutzen sie bloß den letzten.. :/ Wenn ich z.B. schreibe:
Code:
dann zeichnet es mir den Strich am Anfang der x-Achse,
PaintBox1.Canvas.MoveTo(0,(round(einheity*ymax))-5);
PaintBox1.Canvas.LineTo(0,(round(einheity*ymax))+5); wenn ich schreibe:
Code:
dann zeichnet es mir einen Strich bei Position 300 auf der x-Achse (21-5=16, 16*50Pixel=300Pixel).
for i:=0 to deltax-5 do
strichposx:=i*einheitx; PaintBox1.Canvas.MoveTo(strichposx,(round(einheity*ymax))-5); PaintBox1.Canvas.LineTo(strichposx,(round(einheity*ymax))+5); [Warnung] Unit1.pas(74): FOR-Schleifenvariable 'i' kann nach Durchlauf undefiniert sein [Warnung] Unit1.pas(70): Variable 'strichposx' ist möglicherweise nicht initialisiert worden Das wird mir in der Unit angezeigt, falls das hilft.. Ich hoffe, dass da der Fehler liegt und ihr ihn seht.. :/ Ich habs nochmal etwas umgeschrieben, allerdings nicht für das Problem relevant, nur hat die Koordinatenzuweisung nicht ganz gepasst für die y-Achse:
Code:
(Bevor mich jemand auf den Fehler aufmerksam macht. ;)
procedure TForm1.Button1Click(Sender: TObject);
var xmin, xmax, ymin, ymax, deltax, deltay, einheitx, einheity, strichposx, strichposy, i: integer; mystring: String; begin xmin:=IntEdit1.Value; xmax:=IntEdit2.Value; ymin:=IntEdit3.Value; ymax:=IntEdit4.Value; deltax:=xmax-xmin; deltay:=ymax-ymin; einheitx:=PaintBox1.Width div deltax; einheity:=PaintBox1.Height div deltay; IntEdit5.Value:=deltax; IntEdit6.Value:=einheitx; IntEdit7.Value:=deltay; IntEdit8.Value:=einheity; //x-Achse PaintBox1.Canvas.MoveTo(0,round(einheity*ymax)); PaintBox1.Canvas.LineTo(Paintbox1.Width,round(einheity*ymax)); //myString := ''; for i:=0 to deltax-5 do strichposx:=i*einheitx; PaintBox1.Canvas.MoveTo(strichposx,(round(einheity*ymax))-5); PaintBox1.Canvas.LineTo(strichposx,(round(einheity*ymax))+5); //PaintBox1.Canvas.MoveTo(0,(round(einheity*ymax))-5); //PaintBox1.Canvas.LineTo(0,(round(einheity*ymax))+5); myString := myString + IntToStr(i); Edit1.Text:=myString; Edit2.Text := IntToStr(strichposx); //y-Achse PaintBox1.Canvas.MoveTo(round(einheitx*xmin*-1),0); PaintBox1.Canvas.LineTo(round(einheitx*xmin*-1),Paintbox1.Height); end; Ich hoffe, ihr könnt mir helfen.. :/ Grüße |
AW: Achsenkreuz skalieren mit for-to-Schleife
(Ich weiß nicht, ob das erlaubt ist, aber)
Hoch damit! Ich brauche eure Hilfe.. :/ |
AW: Achsenkreuz skalieren mit for-to-Schleife
Okay, dann nochmal etwas ausführlicher:
Die Einrückung sollte dir aufeigen, welche Befehle tatsächlich in der Schleife stehen und welche nicht. Da du kein begin-end verwendet hast, wird nur der folgende Befehl (i.d.R. bis zum nächsten Semikolon oder die nächste Kontrollstruktur) mehrfach ausgeführt. Alles danach wird wieder einfach sequentiell abgearbeitet. Das hier:
Delphi-Quellcode:
Ist also im Grunde eine sinnlose Schleife.
for i:=0 to deltax do
strichposx:=i*einheitx; // Ein Befehl in der Schleife // Ab hier geht's "normal" weiter PaintBox1.Canvas.MoveTo(strichposx,(round(einheity*ymax))-5); PaintBox1.Canvas.LineTo(strichposx,(round(einheity*ymax))+5); Was du wahrscheinlich machen wolltest ist das hier:
Delphi-Quellcode:
Mit begin-end fasst du mehrere Befehle zu einem Block zusammen.
for i:=0 to deltax do
begin strichposx:=i*einheitx; PaintBox1.Canvas.MoveTo(strichposx,(round(einheity*ymax))-5); PaintBox1.Canvas.LineTo(strichposx,(round(einheity*ymax))+5); end; //y-Achse PaintBox1.Canvas.MoveTo(round(einheitx*xmax),0); PaintBox1.Canvas.LineTo(round(einheitx*xmax),Paintbox1.Height); Pushen ("hochschieben") ist erst 24h nach dem letzten Beitrag erlaubt! |
AW: Achsenkreuz skalieren mit for-to-Schleife
Au Backe, jetzt kapier ichs. :D
Dankeschön! :) Okay, dann weiß weiß ich darüber jetzt auch Bescheid, wird nicht mehr vorkommen. :roll: Und danke nochmal, das ist meine Rettung! :) Liebe Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz