Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - KoordinatenSystem mit Werten aus einer Textdatei zeichen...


ForzaFCH - Do 15.04.04 09:51
Titel: KoordinatenSystem mit Werten aus einer Textdatei zeichen...
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 :?:


bms - Do 15.04.04 10:20
Titel: Re: KoordinatenSystem mit Werten aus einer Textdatei zeichen
ForzaFCH hat folgendes geschrieben:

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.


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



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


Johannes Maier - 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:
//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


Johannes Maier - 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
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


ForzaFCH - 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


ForzaFCH - 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?


ForzaFCH - 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); // 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?


Johannes Maier - 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


ForzaFCH - 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 ;)


Johannes Maier - 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


ForzaFCH - 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 :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 :)


Johannes Maier - 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');  // 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):

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
1:
LineToNeu(SX, SY);                    

ist auch kürzer :)

So, hoffe das hat geholfen :wink:

MfG
Johannes


ForzaFCH - Mi 21.04.04 08:37

ich probier das alles mal aus...
danke schonmal für die bemühungen.


ForzaFCH - Mi 21.04.04 08:49

hmm als ich das so gemach thab is mein delphi ohne fehlermeldung abgeschmiert :)


ForzaFCH - 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


Johannes Maier - 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


ForzaFCH - 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 ;)


ForzaFCH - Fr 23.04.04 08:22

wie nur funzt das? :)


Johannes Maier - Fr 23.04.04 20:30

Mach es doch einfach OHNE eine StringList :!:
Mit Assign, Reset, Rewrite oder so geht das bei den wenigen Zahlen die du benutzt viel einfacher!
Den Code hab ich oben schon zweimal gepostet. Das auf mehr Variablen auszudehnen dürftest du wohl alleine schaffen :wink:

MfG
Johannes


ForzaFCH - Mo 26.04.04 15:34

also wie gesagt. wenn ich es so mache wie du meintest dann schmiert mir delphi ab. ich hab bei mir jetzt mal versucht mit capity zu arbeiten nur weiß ich gar nicht was der befehl genau macht :shock:


ForzaFCH - Mi 28.04.04 10:01

ich möchte gerne aus einer TextFile die werte in eien Stringlist laden. und den wert aus eienr StringList möchte ich dann in einer Variablen speichern damit ich dann den Wert auch als x-Koordinate zum zeichnen verwenden kann.


bms - Mi 28.04.04 10:17

@ForzaFCH

Eine Antwort hättest du schon sehr, sehr sehr früh haben können. Eine Antwort mit der du auch etwas anfangen kannst. Der Grund wieso es sich so zieht ist, daß du deine Frage so bescheuert formulierst. Du hast ein konkretes Problem, stellst aber deine Frage so allgemein, daß alle nur um das Problem herumreden können. Mit deiner Frage oben kann keiner so richtig was anfangen.

Warum stellst du z.B. immer noch die Frage wie man eine Textdatei in eine StringList laden kann. Das müßtest du inzwischen wissen. Jetzt werden zig Leute sich erst um dieses Problem kümmern. Die andere Sache sind die Koordinate. Keiner weiß so richtig wie sie bei dir aussehen. Deshalb weiß auch keiner was du wissen willst. Deshalb kriegst du jede menge wirrer Antworten mit denen du wiederum nichts anzufangen weißt.

Rauf dich auf und mach eine richtige Problembeschreibung. Gib Beispieldaten wie das bei dir aussieht. Was brauchst du? Wieviel brauchst du? Was machen die? Solange du das nicht machst wird sich nichts ändern.

Ich kann dir sofort ein Beispiel machen und ich wette mit dir, daß es beim ersten mal richtig wird. Es wird sogar so einfach sein, daß du es nachvolziehen kannst. Ich mache es aber nicht, denn ich hab keine Lust, daß du dann kommst und sagst, daß du das anders meinst. Nicht ich bin dafür verantwortlich dich auszufragen wie du es haben möchstest, sondern du muß mir sagen wie deine Aufgabenstellung aussieht.


ForzaFCH - Mi 28.04.04 10:50

jo ich würd es ja gern formulieren, nur bin ich neu in der delphi szene aber ich werds mal probieren.

also meinen sourcecode kannsch jetzt nicht abtippen , weil der gesamte code auf meinen laptop liegt und ich auch keine möglichkeit hab den auf den rechner meiener firma hier raufzuspielen :)

also mein Ziel: Berechnung von Kenngrößen wie (Widerstand, Stromstärke, Spannung)
die werte von Widerstand und Spannung sollen dann in 2 unterschiedlichen Textdateien abgespeichert werden.
sprich

edit1.txt

Quelltext
1:
2:
3:
4:
5:
12
24
10
5
120

das wären dann z.B. meine X-Werte

edit2.txt

Quelltext
1:
2:
3:
4:
5:
7
13
190
12
4

das wären dann z.B. meine Y-Werte

ich will nämlich dann eien R/U Kennlinie in einem KoordinatenSystem darstellen.
das berechnen funktioniert soweit auch schon alles nun hab ich aber das Problem das ich die Werte aus meinen Textdatein in einer Variable speichern will.
damit ich die Kurve oder gerade dann nicht absolut zeichne sondern halt von den werten in meiner Textdatei abhänig zeichne.
hab die Werte dann in eine StringList gelden. meine frage wär also wie ich die werte die in einer StringList stehen als Variabel definiere.

Delphi-Quelltext
1:
SX:= ListX. ???(0);                    

irgendwie so hät ich mir das gedacht hab aber noch nich wirklich was hinbekommen.

und dann würd ich noch gerne wissen wie ich das dann egnau zeichne weil zur zeit kann ich nur eien gerade zeichen. aber will ja das eine linie vom Koordinatenurpsrung gezeichnet wird und dann dann wieder zurück und das nächste paar als linie zeichnet :)


Delphi-Quelltext
1:
2:
korSystem.Canvas.MoveTo(200,200); // hier gehe ich zum Koordinatenurpsrung
korSystem.Canvas.LineTo(200+(StrToInt(SX));200-(StrToInt(SY))); // hier will ich halt die Linie zeichnen (R/U- Kennlinie)


bms - Mi 28.04.04 11:51

Gehören die X und Y Werte zusammen und bilden sie ein Koordinatenwert? Warum dann auf zwei Dateien verteilen?

Als Lösung hab ich was anderes gemacht. Ich hab die Werte in eine Datei gepackt und sie mit einem Semikolon getrennt:


Quelltext
1:
2:
3:
4:
5:
12;7
24;13
10;190
5;12 
120;4


Der erste Wert ist bei mir X, der Zweite ist Y. Um sie zu trennen hab ich Funktion ZeichenKetteAufloesen geschrieben. Da es mindestens zwei Rückgabewerte gibt, hab ich die Ausgabe der x, y Werte in den Parameterbereich gelegt und hab der Funktion eine Fehlermeldung spendiert. Die Werte x, y hab ich, da es strings sind, s1 und s2 genannt. Ansonsten hab ich anstelle eines StringList im Beispiel ein Memo genommen. Du kannst es aber jede Zeit mahen wie du willst.

Für das Beispiel machst du ein leeres Projekt und legst eine Memo und ein Button auf das Formular.


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:
function ZeichenKetteAufloesen(s: Stringvar s1, s2: String): Word;
const
  d = ';';
begin
  s := Trim(s);

  Result := 1// Wert für Zeile hat keinen Trenner.
  if Pos(d, s) = 0 then Exit;

  Result := 2// Wert für Trenner ist an ersten Stelle.
  if Pos(d, s) = 1 then Exit;

  s1 := Trim(Copy(s, 1, Pos(d, s) - 1));
  Delete(s, 1, Pos(d, s));
  s2 := Trim(s);

  Result := 0// Wert für kein Fehler

  // Die Werte sind jetzt in s1 und s2
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  s, s1, s2: String;
begin
  Canvas.MoveTo(0,0);

  with Memo1.Lines do
    for i := 0 to Count - 1 do
    begin
      s := Strings[i];
      if Trim(s) = '' then Continue;

      if ZeichenKetteAufloesen(s, s1, s2) > 0 then
      begin
        MessageDlg('Fehlerhafte Werte in Zeile: ' + IntToStr(i + 1),
          mtError, [mbOK], 0);
        Exit;
      end;

      Canvas.LineTo(StrToInt(s1), StrToInt(s2));
    end;
end;


ForzaFCH - Mi 28.04.04 12:27

ich probiers mal :roll:


ForzaFCH - Mi 28.04.04 12:30

also ich würd es gerne mit der stringlist arbeiten. aber bei der gibt es ja nicht so einen befehl wie bei dem memo de lines befehl.
ich bräuchte sozusagen nur die form wie ich den wert aus eienr stringlist in eien variable speicher :roll:


bms - Mi 28.04.04 12:55

Tut mir leid, ich gebe es auf. Du hast anscheinend keine Ahnung von Delphi und versuchst dir ein Programm zusammen zu schnoren. Memo1.Lines ist TStrings und StringList ist auch TStrings. Verstanden? Nix mehr Befehle. Du brauchst nur Memo1.Lines gegen den Namen deiner StringList zu tauschen und schon funktioniert das alles mit StringList. Zwischen Memo1.Lines und StringList gibt es keinerlei unterschied. Guckst du auch schon mal in die Delphihilfe und zu sehen was dir die Leute für Tips geben? Oder funktioniert das bei dir so, daß due es ausprobiers und wenn es nicht so funktioniert wie du es willst, dann fragst du noch mal. Irgendwie schon auf die Idee gekommen selbst den Code anzupassen?

Aber das alles kann man noch vergeben. Was dich aber für jeglich weitere Hilfe disqualifiziert ist dieser Satz:

Zitat:
ich bräuchte sozusagen nur die form wie ich den wert aus eienr stringlist in eien variable speicher


Du blickst komplett nicht durch. Du hast Null Ahnung was da vor sich geht und deshalb stellst du solche Fragen. Du kennst Begriffe, kannst aber mit denen nichts anfangen.

Ich hab dir gerade gezeigt wie du Werte aus StringList an eine Variable übergibst (nicht speichern, das ist falsch). Und dennoch fragst du noch mal. StringList ist eine Liste mit String-Zeilen. Du kannst dir eine Zeile nehmen und zu Integer konvertieren. Aber da blickst du sowieso nicht durch.


ForzaFCH - Mi 28.04.04 13:01

beruhig dich mal wieder. ich hab doch auch oben schonmal gesagt das ich noch nicht lange mit delphi arbeite. und die hilfe hab ich auch benutzt sonst wäre ich auch nicht so weit gegkommen. aber wenn du meinst das ich mir was zusammenschnorre ist das deine meinung die ich zwar nicht teile aber egal. ich hab hier keinnen gebeten mir das fertige programm zu geben. ich wollte nur die syntax eine befehles haben. nix weiter. und du machst gleich ein fass auf. wenn ich das da bloß ersetzten muss is ja jut wußte ich ja nicht.

no comment


bms - Mi 28.04.04 13:08

Du verstehst es anscheinend noch nicht. Es gibt nicht den Befehl. Das gibt es nicht. Das mußt du über viele Zeilen lösen. Dein Problem hab ich schon im zweiten Beitrag erkannt. So klug ist Delphi nun auch nicht, daß es wüßte was du willst.

Zitat:
wenn ich das da bloß ersetzten muss is ja jut weußte ich ja nicht.


Sowas weiß man aber wenn man sich das Beispiel genauer anguckt und man alles was man nicht versteht in der Hilfe anguckt.


ForzaFCH - Mi 28.04.04 13:34

aha. ich hab es zwar jetzt auch mal mit deinen hinweis versucht aber klappen tut es nicht. naja irgenwann werd ich auch das hinbekommen :(


Christian S. - Mi 28.04.04 13:52

So, Leute, jetzt beruhigt Euch erst mal wieder. Es bringt niemanden weiter, wenn man den anderen angreift.

Zitat:
aha. ich hab es zwar jetzt auch mal mit deinen hinweis versucht aber klappen tut es nicht. naja irgenwann werd ich auch das hinbekommen
Dann zeige doch, wie der Quelltext aussieht, mit dem Du es versucht hast, und wir sagen Dir, was Du falsch machst.


ForzaFCH - Mi 28.04.04 14:06

wie schonmal geschrieben.

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; 
ListY := TStringList.Create; 
ListX.LoadFromFile('c:\edit.txt'); 
ListY.LoadFromFile('c:\edit2.txt'); 
SX:=FloatToStr(ListX. ...); // und hier dachte ich mir das so irgendwie realisieren zu können weil ich den wert aus der list ja in der varibalen haben will
SY:=FloatToStr(ListY. ...);
begin 
KorSystem.Canvas.moveto(200,220); // Nullpunkt wird definiert 
KorSystem.Canvas.LineTo(StrToInt(Sx),StrToInt(Sy)); 
end
end;


das halt der teil der hierfür wichtig ist denek ich mal :)


Christian S. - Mi 28.04.04 14:17

Hm. Du scheinst nicht wirklich viel von den Anregungen, die Du durch den Quelltext von bms erhalten haben solltest, umgesetzt zu haben.

Also, der Reihe nach:

Delphi-Quelltext
1:
2:
SX:=FloatToStr(ListX. ...); // und hier dachte ich mir das so irgendwie realisieren zu können weil ich den wert aus der list ja in der varibalen haben will
SY:=FloatToStr(ListY. ...);
Kann nicht gehen. Denn Sx hält nur eine Zahl, ListX enthält ja nun aber ziemlich viele Zahlen. Du musst also irgendwie angeben, welche der Zahlen aus ListX Du in SX haben willst. Wie das geht, hat Dir bms bereits gezeigt:

Delphi-Quelltext
1:
2:
3:
4:
  with Memo1.Lines do
    for i := 0 to Count - 1 do
    begin
      s := Strings[i];


Damit kannst Du (wenn Du es an Deine Bedürfnisse anpasst) die Zeilen (und dmait auch Zahlen) in der StringList einzeln durchgehen. Und dann nach einander zeichnen.

MfG
Peter

P.S.:
Zitat:
ch hab es zwar jetzt auch mal mit deinen hinweis versucht
Hm, also in dem von Dir geposteten Quellcode steckt aber rein gar nichts von bms' Hinweisen .... :?


ForzaFCH - Mi 28.04.04 14:19

hab ich ja auch wieder rückgänig gemacht. :)


ForzaFCH - Mi 28.04.04 14:23

ICH HAB ES HINBEKOMMEN :) ob ihr glaubt oder nicht :)

jetzt sag ich ihm ja das er den Str in einen Integer umwandeln soll, bevor er es zeichnet

Delphi-Quelltext
1:
 KorSystem.Canvas.LineTo(200+StrToInt(SX),200-StrToInt(Sy));                    

aber es kommt bei mir vor das ich auch komma werte rausbekomme. muss ich dann noch mit StrTofloat arbeiten?


bms - Mi 28.04.04 15:43

@ForzaFCH

Bevor du überhaupt weiter machst solltest du dir zuerst im klaren sein in welcher Form du die Daten gespeichert hast. Nicht einfach zwei Textdateien wo x und y für sich alleine rumliegen, sondern konkret sagen, daß es so ist. Ich hab dir ein Model vorgeschlagen:


Delphi-Quelltext
1:
2:
3:
4:
5:
12;7 
24;13 
10;190 
5;12 
120;4


Hier hast du X und Y in einer Liste, getrennt durch Semikolon. Wenn du weiter mit einer Liste für X und einer anderen für Y machst, dann wundere dich nicht wenn du nicht das kriegst was du brauchst.

Also, entscheide dich zuerst für die Form wie deine Daten zu verfügung stehen.

Und noch was: StrToFloat ist falsch. Du brauchst Integer-Zahlen. Flat ist Real-Zahl. Du brauchst StrToInt.


ForzaFCH - Mi 28.04.04 15:59

ich hab es wie schon gesagt. in 2 datein. will ich ja auch so. nur bei meienr berechung kommt halt auhc mal ein widerstand von 12,30 raus aber dann mekert er mich wenn er zeihcnen soll is kein gültiger integerwert :( bei den anderen zahlen geht es ja wie z.b 1 oder 120


Christian S. - Mi 28.04.04 16:00

Dann musst Du wirklich StrToFloat nehmen und hinter runden (Round) oder die Nachkommastellen abschneiden (Trunc).


ForzaFCH - Mi 28.04.04 16:36

k hab es jetzt mit round realisieren können.

thx


bms - Mi 28.04.04 16:39

ForzaFCH hat folgendes geschrieben:
ich hab es wie schon gesagt. in 2 datein. will ich ja auch so.


Das Problem ist aber, wenn eine der Werte nicht angenommen wird, dann kann die Nächste mit falschen Werten arbeiten. Wenn du es aber auf zwei Dateien verteilen willst, dann ist des dein Problem.


ForzaFCH - Do 29.04.04 08:45

bisher hatte ich noch kein problem damit, aber thx.


bms - Do 29.04.04 10:58

ForzaFCH hat folgendes geschrieben:
bisher hatte ich noch kein problem damit, aber thx.


Naja, ich weiß nicht, aber hast du nicht weiter vorne gejamert, daß etwas anders rauskommt als soll? Aber wenn du bisher keine Probleme hattest, dann freut es mich.


ForzaFCH - Do 29.04.04 11:00

ich hab noch ein problem. und zwar will ich in meinen editfeldern nebst den zahlen und dem backspace auch noch das zeichen komme zulassen.
jetzt steht da lediglich

Delphi-Quelltext
1:
2:
3:
4:
5:
 if not (Key in [#8'0'..'9']) then
shwomessage('Bitte nur Zahlen eingeben');
Rechner.Widerstand.text:='';
Key:=#0;
end;

was muss in der if not routine noch rein damit er das komma zeichen zu lässt # ???


Christian S. - Do 29.04.04 11:12

Neue Frage -> Neuer Thread