| Autor |
Beitrag |
ForzaFCH
      
Beiträge: 80
D6 / D7 Personal
|
Verfasst: Do 15.04.04 09:51
Ich habe die Absicht ein koordinatensystem aus einer Textdateui eraus zuladen. z.B. die X-Koordinate aus einer Textdatei auslesen und die Y-Koordinate aus Einer Textdatei auszulesen. ich habe es mit dem LoadFromFile Befehl versucht, jedoch bin ich schon früh an meien Grenzen gestoßen
wusste nich genau wie ich die Variable X-deklarieren soll. hab in den anderen Beiträgen was mit StringList gelesen weiß aber nich ob das auch für meien Zahlen geht.
Wäre über Hilfe dankbar. Brauche keinen Code, lediglich ein Anhaltspunkt wie ich dies realisieren kann.
Delphi-Quelltext 1: 2:
| x.LoadFromFile('c:\Edit.txt'); korSystem.Canvas.LineTo(x,y); |
und dann halt noch das definieren aber da weiß ich wie gesagt nich so wirklich was da hin sollte 
_________________ HANSA ROSTOCK DU SOLLST STRAHLEN..... *sing* Für immer und ewig FC hansa Rostock!
|
|
bms
      
Beiträge: 735
Win XP
Delphi 3, Delphi 6 PE, Delphi 2005 PE
|
Verfasst: Do 15.04.04 10:20
Titel: Re: KoordinatenSystem mit Werten aus einer Textdatei zeichen
_________________ VORSICHT: Ich behersche seit heute die Fünf-Finger-Handflächen-Herz-Explodier-Schlag-Kampf-Technik >
|
|
general_north
Hält's aus hier
Beiträge: 3
|
Verfasst: Do 15.04.04 14:00
Hallo,
anbei eine kleine Anleitung:
TextDatei sieht wie folgt aus:
X10 Y 20
X15 Y 20
X 15 Y 25
*und so weiter*
In Worten: jede Zeile enthält immer ein X und ein Y in dieser Reihenfolge!
Es könn jeweils beliebig viele leerzeichen dazwischen sein, nur keine Zeilenumbrüche UND
ES DÜRFEN KEINE anderen zeichen enthalten! Nur Zahlen, ein X und ein Y
mache eine textdatei wie eben genannt,
mach neues projekt, füge ein "image", ein "edit" und ein "button" ein.
Doppelklicke den "button" auf der form.
LÖSCHE das entstanden:
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.Button1Click(Sender: TObject); begin
end; |
aus dem Quelltext und kopiere das folgende rein:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96:
| function Optimised(Wert: String): String; Var Res : String ; Sammler : String ; Ftd1 : Integer ; begin Res := '' ; Sammler := '' ;
For Ftd1 := 1 To Length( Wert ) Do Begin If ( Ord ( Wert[ Ftd1 ] ) <= 32 ) Then Sammler := Sammler + Wert[ Ftd1 ] Else Begin If Not ( Res = '' ) Then Res := Res + Sammler ; Res := Res + Wert[ Ftd1 ] ; Sammler := ''; End; End;
Result := Res; end;
Function GetNDelUntil ( Var Value : String; ASigne : Char ; Optimize : Boolean = TRUE ) : String ; Var Res : String ; Ret : String ; Len : Integer ; Possition : Integer ; Begin Len := Length( Value ) ; Possition := Pos( ASigne, Value ) ; If Possition = 0 Then Begin Ret := '' ; Res := Value ; End Else Begin Ret := Copy( Value, Possition + 1, Len - Possition ) ; Res := Copy( Value, 1, Possition - 1 ) ; End ; If Optimize Then Begin Res := Optimised( Res ) ; Ret := Optimised( Ret ) ; End ;
Value := Ret ;
Result := Res ; End ;
procedure TForm1.Button1Click(Sender: TObject); Var List : TStrings ; AFileName : String ; sX, sY : String ; i : Integer ; Begin List := TStringList.Create; AFileName := edit1.Text ; If FileExists( AFileName ) Then Begin List.LoadFromFile( AFileName ) ;
If List.Count > 0 then Begin sY := UpperCase( List[ 0 ] ) ; GetNDelUntil( sY, 'X' ) ; sX := GetNDelUntil( sY, 'Y' ) ; image1.Canvas.MoveTo( strtoint(sX),strtoint(sY) ); For i := 1 To List.Count - 1 Do Begin sY := UpperCase( List[ i ] ) ; GetNDelUntil( sY, 'X' ) ; sX := GetNDelUntil( sY, 'Y' ) ; image1.Canvas.LineTo( strtoint(sX),strtoint(sY) ); End ; End ; End Else Begin ShowMessage( 'Datei "'+AFileName+'" exsistiert nicht!' ) ; End ;
List.Free ;end ; |
so ... nun projekt starten, namen der textdatei in editbox eingeben, button klicken und glücklichsein
Dann kannste damit anfangen, nachzuvollziehen was ich da gemacht habe.....
Viel glück
General North
Moderiert von Peter Lustig (14:01, 15.04.2004): Code- durch Delphi-Tags ersetzt
|
|
ForzaFCH 
      
Beiträge: 80
D6 / D7 Personal
|
Verfasst: Mo 19.04.04 10:06
also wenn ich das so mach wie du gschrieben hast, dann sagt er mir Funktion benötigt Ergebnisstyp.
aber das was du da geschirben hast brauch ich letzendlich so kompakt gar nicht ich muss nur wissen wie ich die dateien in eien variable laden kan. hab z.b. 5 zahlen in meiner txt stehen und die sollen dann auch als 5 punkte ( zum Beispiel) in einen Koordinatensystem dargestellt werden.
weiß abern it so recht wie. erst in variable laden und dann die variable zeichnen lassen dacht ich mir. funzt aber nit so wirklich 
_________________ HANSA ROSTOCK DU SOLLST STRAHLEN..... *sing* Für immer und ewig FC hansa Rostock!
|
|
Johannes Maier
      
Beiträge: 173
Win XP
D7 Prof
|
Verfasst: Mo 19.04.04 17:48
Wenn du die Zahlen in der Datei untereinander stehen hast (vll mit WriteLn geschrieben) und auch wirklich pro Zeile NUR DIESE ZAHL dann geht das so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Button1Click(Sender: TObject); var F: TextFile; Buffer: String; x: Array[0..4] of Double; i: Integer; begin AssignFile(F, 'Dateipfad\Name'); Reset(F); for i:=0 to 4 do begin ReadLn(F, Buffer); x[i] := StrToFloat(Buffer); end; CloseFile(F); end; |
x[0 bis 4] sind dann deine 5 Variablen
MfG
Johannes
_________________ MfG
Johannes ehem. jbmaier
|
|
Johannes Maier
      
Beiträge: 173
Win XP
D7 Prof
|
Verfasst: Mo 19.04.04 17:53
Oben das zwei über mir ist furchtbar kompliziert
Schreiben in die Datei geht so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var x, y: Double; TForm1.Button1Click(Sender: TObject); var F: TextFile; begin AssignFile(F, 'Dateiname\Pfad'); Rewrite(F); WriteLn(F, x); WriteLn(F, y); CloseFile(F); end; |
Das Resultat sieht für x:=1,5 und y:=2,75 so aus:
Quelltext
Eine einfache Methode, geht schnell. Einlesen dann wie oben beschrieben. Wenn du eine andere Anzahl von Variablen hast, dann mach das Array einfach größer und schreib mehr rein
MfG
Johannes
_________________ MfG
Johannes ehem. jbmaier
|
|
ForzaFCH 
      
Beiträge: 80
D6 / D7 Personal
|
Verfasst: Di 20.04.04 08:50
jo das einlesen hab ich ja soweit dann alles hinbekommen. zeichenen tut er jetzt auch schon, aber nun hab ich ein problem
wie zeichne ich den eine graphen. z.b. eine U/i- Kennlinie. hab einie edit1.txt mit den x werten und eine edit2.txt mit den y- werten. er zeichnet jetzt auch schon aber halt nich so wie es aussehen sollte
thx
_________________ HANSA ROSTOCK DU SOLLST STRAHLEN..... *sing* Für immer und ewig FC hansa Rostock!
|
|
ForzaFCH 
      
Beiträge: 80
D6 / D7 Personal
|
Verfasst: Di 20.04.04 08:59
also ich habe jetzt die 2 datein mit den werten und sage ihm dann Korsystem.Canvas.lineto(StrToInt(Sx),StrToInt(Sy)); aber er zeichnet einfach eine linie vom koordinatenurpsrung zum 0 punkt, welcher ja links oben in der ecke liegt, wenn ich oben aber nich die werte aus der datei einlesen lass, sondern die werte die in der datei stehen anstelle das StrToInt(Sx) also z.b. 130 eingebe dann macht er das ohne Probleme. woran kann das liegen?
_________________ HANSA ROSTOCK DU SOLLST STRAHLEN..... *sing* Für immer und ewig FC hansa Rostock!
|
|
ForzaFCH 
      
Beiträge: 80
D6 / D7 Personal
|
Verfasst: Di 20.04.04 09:08
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| var Sx,Sy :String; ListX: TStrings; ListY: TStrings; ..... begin ListX := TStringList.Create; ListX := TStringList.Create; ListX.LoadFromFile('c:\edit.txt'); ListY.LoadFromFile('c:\edit.txt'); SX:= FloatToStr(ListX.Count); SX:= FloatToStr(ListX.Count); begin KorSystem.Canvas.moveto(300,250); KorSystem.Canvas.LineTo(StrToInt(Sx),StrToInt(Sy)); end; end; |
naja und er zeichnet es nich so wie es sein müsste. kann es sein das er nich die zahl liest die in der TXT stehen, oder er eine Zeile weitergeht und da diese leer ist er einfach eine 0 als Wert nimmt?
_________________ HANSA ROSTOCK DU SOLLST STRAHLEN..... *sing* Für immer und ewig FC hansa Rostock!
|
|
Johannes Maier
      
Beiträge: 173
Win XP
D7 Prof
|
Verfasst: Di 20.04.04 14:25
Also zuerst mal hast du in deinem SourceCode zweimal ListX und zweimal SX da stehen  das kann nicht richtig sein.
Weiterhin vermute ich mal, dass er mit dem LoadFromFile die ganze Datei liest und dann am Ende angekommen ist. Nun würde er als Wert dann wirklich 0 nehmen.
Das kannst du verhindern, wenn du es so machst wie in meine Methode  oder wenn du die Datei dazwischen einmal schließt und noch einmal neu öffnest. Es könnte sein dass der Fehler dann nicht mehr da ist.
Wäre nützlich wenn du mal schreiben könntest wieso du eine StringList benutzt, und wieso du zweimal Count machst. Da du nämlich mit LoadFromFile die gesamte Datei in die erste Stringlist liest, wird hier entweder für den zweiten Wert 0 rauskommen (wenn er am Ende ist) oder der gleiche Wert für Count wie in ListX...
ich würde es nicht über eine StringList machen, sonder wie ich oben schon beschrieben hab die einzelnen Variablen reinschreiben und es "manuell" einlesen. Dann passieren dir diese Fehler nicht.
Schreib mal bitte wozu das Programm dienen soll  Vll kann ich dir dann besser helfen.
MfG
Johannes
_________________ MfG
Johannes ehem. jbmaier
|
|
ForzaFCH 
      
Beiträge: 80
D6 / D7 Personal
|
Verfasst: Di 20.04.04 14:46
jo das oben soll nich zweimal SX und zweimal ListX sondern auch Y das zweitemal heißen
das Programm soll zur Berechnung vom Widerstand, Stromstärke und Spannung dienen. (Parallel und Reihenschaltung) nachdem er das Ergebniss berechnet hat soll er eine Kennlinie (Graphen im KoordinatenSystem) ausgeben  was halt noch nich so ganz funktioniert 
_________________ HANSA ROSTOCK DU SOLLST STRAHLEN..... *sing* Für immer und ewig FC hansa Rostock!
|
|
Johannes Maier
      
Beiträge: 173
Win XP
D7 Prof
|
Verfasst: Di 20.04.04 15:02
Und was sind SX und SY? einfach nur Zahlen? Wie sieht denn die TextDatei aus wenn sie "bespeichert" ist ?
Denn extra nur für zwei Zahlen eine StringList zu erstellen ist sehr umständlich ...
Und was soll dein Count denn ausgeben? Das hat doch nichts mehr mit den eigentlich Zahlen zu tun die in der Datei stehen. Count zählt doch nur wie viele Sachen in der StringList drin sind oder hab ich mich da vertan?
MfG
Johannes
_________________ MfG
Johannes ehem. jbmaier
|
|
ForzaFCH 
      
Beiträge: 80
D6 / D7 Personal
|
Verfasst: Di 20.04.04 15:11
da fragst du mich was  also ich hab halt zwei Textdatein die eine für mehrer x koordinaten und die andere für mehrer y koordinaten. ich will ja nicht nur lineare gleichungen ausgeben können. sx und sy sind meine strings. naja meien txt sieht z.b. so aus
Quelltext 1: 2: 3: 4: 5: 6:
| 130 120 140 10 45 | z.b. ;)dies wären dann alle x koordinaten dann soll er von der txt den ersten wert nehmen und mit dem ersten wert aus der zweiten textdatei ein koordinatenpaar bilden und ein lineto vom koordinatenursprung aus zeichenen  und das dann fürs zweite und so weiter
und dann würd ich noch gerne wissen wie ich den koordinatenursprung definieren kann denn der Punkt (0/0) ist ja jetzt oben links und das is auch shice 
_________________ HANSA ROSTOCK DU SOLLST STRAHLEN..... *sing* Für immer und ewig FC hansa Rostock!
|
|
Johannes Maier
      
Beiträge: 173
Win XP
D7 Prof
|
Verfasst: Di 20.04.04 20:33
Hi,
ich tipp dir mal ab, wie ich das machen würde mit den Werten. Das Reinschreiben in die Dateien klappt aber, oder?
also: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| var SX, SY: Integer; FX, FY: TextFile; Buffer: String; ..... begin AssignFile(FX, 'ersteDatei.txt'); AssignFile(FY, 'zweiteDatei.txt'); Reset(FX); Reset(FY); ReadLn(FX, Buffer); SX := StrToInt(Buffer); ReadLn(FY, Buffer); SY := StrToInt(Buffer); CloseFile(FX); CloseFile(FX); korSystem.Canvas.MoveTo(320,200); korSystem.Canvas.LineTo(SX, SY); end; |
Der Nachteil ist im Mom. nur, dass er halt 320,200 nicht als Ursprung nimmt, sondern von da aus nach SX, SY zeichnet. Wenn SX:=100 und SY:=50 ist, dann zeichnet er eine Linie nach links oben
Ich würde mir eine eigene LineTo bauen (vll gehts auch einfacher):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure (korSystem.)LineToNeu(x, y: Integer); var UrX, UrY: Integer; begin UrX := 320; UrY := 200; korSystem.Canvas.LineTo(UrX+x, UrY-y); end; |
Die hier sollte eine Linie immer in Bezug auf den neuen Nullpunkt zeichnen. Musst du unter private deklarieren (oder wo auch immer):
Delphi-Quelltext 1: 2:
| private procedure LineToNeu(x, y: Integer); |
dann immer statt korSystem.Canvas.LineTo(SX, SY) schreiben:
Delphi-Quelltext
ist auch kürzer
So, hoffe das hat geholfen
MfG
Johannes
_________________ MfG
Johannes ehem. jbmaier
|
|
ForzaFCH 
      
Beiträge: 80
D6 / D7 Personal
|
Verfasst: Mi 21.04.04 08:37
ich probier das alles mal aus...
danke schonmal für die bemühungen.
_________________ HANSA ROSTOCK DU SOLLST STRAHLEN..... *sing* Für immer und ewig FC hansa Rostock!
|
|
ForzaFCH 
      
Beiträge: 80
D6 / D7 Personal
|
Verfasst: Mi 21.04.04 08:49
hmm als ich das so gemach thab is mein delphi ohne fehlermeldung abgeschmiert 
_________________ HANSA ROSTOCK DU SOLLST STRAHLEN..... *sing* Für immer und ewig FC hansa Rostock!
|
|
ForzaFCH 
      
Beiträge: 80
D6 / D7 Personal
|
Verfasst: Mi 21.04.04 10:26
also dann ist mir ebend auch aufgefallen wenn ich das so mach wie schon beschrieben mit KorSystem.Canvas.Lineto(StrToInt(SX),StrToInt(SY)); das er den graphen immer mehr zur Y-Achse angleicht, wenn mehr werte drin stehen. also bei 100 werten liegt er fast senkrecht an der y-achse an. womit hängt das den zusammen? 
_________________ HANSA ROSTOCK DU SOLLST STRAHLEN..... *sing* Für immer und ewig FC hansa Rostock!
|
|
Johannes Maier
      
Beiträge: 173
Win XP
D7 Prof
|
Verfasst: Mi 21.04.04 16:17
Ich denke das kommt daher, dass du "Count" benutzt. Ich weiß nicht wieso du das machst
denn Count zählt nur WIEVIELE Zahlen in der StringList drinstehen. Er liest die Werte nicht. Und je mehr Werte desto höher die Count Zahl ...
MfG
_________________ MfG
Johannes ehem. jbmaier
|
|
ForzaFCH 
      
Beiträge: 80
D6 / D7 Personal
|
Verfasst: Mi 21.04.04 16:43
was sollt ich anstelle von count benutzen? ka warum hab das in einem tutorial gesehn. arbeite vileeicht seit 3 monaten mit delphi und nur oberflächlich 
_________________ HANSA ROSTOCK DU SOLLST STRAHLEN..... *sing* Für immer und ewig FC hansa Rostock!
|
|
ForzaFCH 
      
Beiträge: 80
D6 / D7 Personal
|
Verfasst: Fr 23.04.04 08:22
wie nur funzt das? 
_________________ HANSA ROSTOCK DU SOLLST STRAHLEN..... *sing* Für immer und ewig FC hansa Rostock!
|
|