AGB  ·  Datenschutz  ·  Impressum  







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

Achsenkreuz skalieren mit for-to-Schleife

Ein Thema von MetalAddict · begonnen am 8. Jan 2011 · letzter Beitrag vom 9. Jan 2011
Antwort Antwort
MetalAddict

Registriert seit: 7. Jan 2011
14 Beiträge
 
#1

Achsenkreuz skalieren mit for-to-Schleife

  Alt 8. Jan 2011, 15:32
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?
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

AW: Achsenkreuz skalieren mit for-to-Schleife

  Alt 8. Jan 2011, 15:59
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?
  Mit Zitat antworten Zitat
MetalAddict

Registriert seit: 7. Jan 2011
14 Beiträge
 
#3

AW: Achsenkreuz skalieren mit for-to-Schleife

  Alt 9. Jan 2011, 15:15
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
  Mit Zitat antworten Zitat
MetalAddict

Registriert seit: 7. Jan 2011
14 Beiträge
 
#4

AW: Achsenkreuz skalieren mit for-to-Schleife

  Alt 9. Jan 2011, 16:24
(Ich weiß nicht, ob das erlaubt ist, aber)
Hoch damit!

Ich brauche eure Hilfe.. :/
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#5

AW: Achsenkreuz skalieren mit for-to-Schleife

  Alt 9. Jan 2011, 16:49
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!
  Mit Zitat antworten Zitat
MetalAddict

Registriert seit: 7. Jan 2011
14 Beiträge
 
#6

AW: Achsenkreuz skalieren mit for-to-Schleife

  Alt 9. Jan 2011, 17:06
Au Backe, jetzt kapier ichs.
Dankeschön!

Okay, dann weiß weiß ich darüber jetzt auch Bescheid, wird nicht mehr vorkommen.

Und danke nochmal, das ist meine Rettung!

Liebe Grüße
  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 18: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