Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Achsenkreuz skalieren mit for-to-Schleife (https://www.delphipraxis.net/157339-achsenkreuz-skalieren-mit-schleife.html)

MetalAddict 8. Jan 2011 14:32

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:
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;
Die y-Achse ist zu vernachlässigen.
Edit1 zeigt auch 21 an, wie es sein sollte, also muss der Fehler irgendwo hier liegen, oder?
Code:
strichposx:=i*einheitx;
      PaintBox1.Canvas.MoveTo(strichposx,(round(einheity*ymax))-5);
      PaintBox1.Canvas.LineTo(strichposx,(round(einheity*ymax))+5);
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 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:

Die Methode TextOut gibt beginnend am Punkt (X,Y) einen String auf der Zeichenfläche aus und setzt die Eigenschaft PenPos auf das Ende des Strings
Das bräuchte ich doch, um die Striche zu beschriften, oder?

jfheins 8. Jan 2011 14:59

AW: Achsenkreuz skalieren mit for-to-Schleife
 
Ich hab's mal anders formatiert und die Einrückung korrigiert:
Delphi-Quellcode:
    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);
Beantwortet das die Frage?

MetalAddict 9. Jan 2011 14:15

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:
PaintBox1.Canvas.MoveTo(0,(round(einheity*ymax))-5);
PaintBox1.Canvas.LineTo(0,(round(einheity*ymax))+5);
dann zeichnet es mir den Strich am Anfang der x-Achse,

wenn ich schreibe:
Code:
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);
dann zeichnet es mir einen Strich bei Position 300 auf der x-Achse (21-5=16, 16*50Pixel=300Pixel).

[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:
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;
(Bevor mich jemand auf den Fehler aufmerksam macht. ;)

Ich hoffe, ihr könnt mir helfen.. :/
Grüße

MetalAddict 9. Jan 2011 15:24

AW: Achsenkreuz skalieren mit for-to-Schleife
 
(Ich weiß nicht, ob das erlaubt ist, aber)
Hoch damit!

Ich brauche eure Hilfe.. :/

jfheins 9. Jan 2011 15:49

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:
    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);
Ist also im Grunde eine sinnlose Schleife.
Was du wahrscheinlich machen wolltest ist das hier:
Delphi-Quellcode:
    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);
Mit begin-end fasst du mehrere Befehle zu einem Block zusammen.

Pushen ("hochschieben") ist erst 24h nach dem letzten Beitrag erlaubt!

MetalAddict 9. Jan 2011 16:06

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