Autor Beitrag
ForzaFCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 80


D6 / D7 Personal
BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 735

Win XP
Delphi 3, Delphi 6 PE, Delphi 2005 PE
BeitragVerfasst: Do 15.04.04 10:20 
Titel: Re: KoordinatenSystem mit Werten aus einer Textdatei zeichen
ForzaFCH hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
x.LoadFromFile('c:\Edit.txt');
korSystem.Canvas.LineTo(x,y);


:rofl: :rofl: :rofl:

Entschuldige bitte, aber das ist wirklich gut. Ich schätze, daß es in 20 Jahren Programmiersprachen geben wird wo man mit x.LoadFromFile('c:\Edit.txt') Werte aus Dateien laden wird können, weil die Sprache so schlau sein wird und von sich aus weiß was genau du willst. Noch ist es aber nicht so weit.

Schreib zuerst wie du deine Werte zu verfügung hast, d.h. in welcher Form sie in der Textdatei liegen. Mach ein Beispiel und schreibe eine Beispielliste.

_________________
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



BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
begin

end;

aus dem Quelltext und kopiere das folgende rein:


ausblenden volle Höhe Delphi-Quelltext
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); // Button1 ist ein "Button" ( TButton ) auf deiner Maske( Form )
Var List : TStrings ;
    AFileName : String ;
    sX, sY : String ;
    i : Integer ;
Begin
  List := TStringList.Create; // Erstma eine instanz der klasse erzeugen ;-)

  // hier wird der dateiname übergeben:
  AFileName := edit1.Text ; // Edit1 ist ein "Edit-Feld" ( TEdit ) auf deiner Maske( Form )

  If FileExists( AFileName ) Then // Ertma prüfen ob überhaupt vorhanden!
  Begin
    List.LoadFromFile( AFileName ) ;

    If List.Count > 0 then
    Begin
      // erste koordinaten-paar ist der startpunkt
      // versuchma mit debugger nachzuvollziehen was in den folgenden 3 Zeilen passiert ;-)
      sY := UpperCase( List[ 0 ] ) ;
      GetNDelUntil( sY, 'X' ) ;
      sX := GetNDelUntil( sY, 'Y' ) ;
      image1.Canvas.MoveTo( strtoint(sX),strtoint(sY) ); // image1 ist ein "Image-Feld" ( TImage ) auf deiner Maske( Form )

      For i := 1 To List.Count - 1 Do
      Begin
        // Einfache Wiederholung:
        sY := UpperCase( List[ i ] ) ;
        GetNDelUntil( sY, 'X' ) ;
        sX := GetNDelUntil( sY, 'Y' ) ;
        image1.Canvas.LineTo( strtoint(sX),strtoint(sY) ); // image1 ist ein "Image-Feld" ( TImage ) auf deiner Maske( Form )

      End ;
    End ;
    
  End
  Else
  Begin
    // kannst hier reaktion auf nichtvorhandene datei angeben
    // z.B.:
    ShowMessage( 'Datei "'+AFileName+'" exsistiert nicht!' ) ;
  End ;

  List.Free ;// instanz freigeben (speicher freigeben) ab jetzt nichtmehr auf "list" zugreifen ;-) -- gibt häsliche errors!
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 user profile iconPeter Lustig (14:01, 15.04.2004): Code- durch Delphi-Tags ersetzt
ForzaFCH Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 80


D6 / D7 Personal
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173

Win XP
D7 Prof
BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
//ich geh davon aus dass du zum einlesen auf nen button drückst, ansonsten mach den Code in ne andere procedure rein
procedure TForm1.Button1Click(Sender: TObject);
var
  F: TextFile;
  Buffer: String;
  x: Array[0..4of Double;
  i: Integer;
begin
  AssignFile(F, 'Dateipfad\Name');  // vor D7 heißts glaub ich nur Assign(F, 'Pfad\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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173

Win XP
D7 Prof
BeitragVerfasst: Mo 19.04.04 17:53 
Oben das zwei über mir ist furchtbar kompliziert :?:
Schreiben in die Datei geht so:
ausblenden 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:
ausblenden Quelltext
1:
2:
1,5
2,75


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 :wink:

MfG
Johannes

_________________
MfG
Johannes ehem. jbmaier
ForzaFCH Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 80


D6 / D7 Personal
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 80


D6 / D7 Personal
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 80


D6 / D7 Personal
BeitragVerfasst: Di 20.04.04 09:08 
ausblenden 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); // Nullpunkt wird definiert
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173

Win XP
D7 Prof
BeitragVerfasst: Di 20.04.04 14:25 
Also zuerst mal hast du in deinem SourceCode zweimal ListX und zweimal SX da stehen :wink: 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 8) 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 :wink: Vll kann ich dir dann besser helfen.

MfG
Johannes

_________________
MfG
Johannes ehem. jbmaier
ForzaFCH Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 80


D6 / D7 Personal
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173

Win XP
D7 Prof
BeitragVerfasst: 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 ? :wink:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 80


D6 / D7 Personal
BeitragVerfasst: 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
ausblenden 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 :lol:


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173

Win XP
D7 Prof
BeitragVerfasst: 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:
ausblenden 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');  // bzw. Assign(F, 'name.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 :roll:

Ich würde mir eine eigene LineTo bauen (vll gehts auch einfacher):
ausblenden 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):
ausblenden Delphi-Quelltext
1:
2:
private
  procedure LineToNeu(x, y: Integer);


dann immer statt korSystem.Canvas.LineTo(SX, SY) schreiben:
ausblenden Delphi-Quelltext
1:
LineToNeu(SX, SY);					

ist auch kürzer :)

So, hoffe das hat geholfen :wink:

MfG
Johannes

_________________
MfG
Johannes ehem. jbmaier
ForzaFCH Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 80


D6 / D7 Personal
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 80


D6 / D7 Personal
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 80


D6 / D7 Personal
BeitragVerfasst: 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? :D

_________________
HANSA ROSTOCK DU SOLLST STRAHLEN..... *sing* Für immer und ewig FC hansa Rostock!
Johannes Maier
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173

Win XP
D7 Prof
BeitragVerfasst: Mi 21.04.04 16:17 
Ich denke das kommt daher, dass du "Count" benutzt. Ich weiß nicht wieso du das machst :roll: :wink:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 80


D6 / D7 Personal
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 80


D6 / D7 Personal
BeitragVerfasst: Fr 23.04.04 08:22 
wie nur funzt das? :)

_________________
HANSA ROSTOCK DU SOLLST STRAHLEN..... *sing* Für immer und ewig FC hansa Rostock!
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.

Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.