Entwickler-Ecke
Dateizugriff - Daten von ComPort in Stringliste speichern
Grolle - Di 26.04.05 11:38
Titel: Daten von ComPort in Stringliste speichern
Hi!
Ich möchte gerne das, was von der ComSchnittstelle zurück kommt (benutze Async Pro)
in eine Stringliste speichern. Das funtioniert nicht und ich weiß nicht wo der
Fehler liegt (Es wird nur ein Zeichen gespeichert. Müssten aber einige Reihen sein.)
Hier der Quelltext:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word); var Data: String; I: Integer; List: TStringList; begin List:=TStringList.Create; Data := ''; for I:= 0 to Count-1 do Data := Data + ApdComPort1.GetChar; List.Add(Data); List.SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt'); List.Free; end; |
chrisw - Mi 27.04.05 12:09
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| List : TStringList;
List := TStringList.Create;
List.Free;
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word); var I: Integer; begin for I:= 0 to Count-1 do List.Add(ApdComPort1.GetChar); List.SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt'); end; |
Grolle - Mo 02.05.05 11:30
Hi!
So klappt das schon fast. Allerdings werden die Buchstaben alle untereinander
geschrieben. Wie schreibt er das denn jetzt zeilenweise (so wie es ankommt)
in die Stringliste?
Viele Grüße: Grolle
Smartie - Mo 02.05.05 14:23
Servus,
ich hatte ein änlichzes Problem, und ich hab es folgendermaßen gelöst:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| for I := 1 to Count do begin C := ApdComPort1.GetChar; case C of #0..#31 : ; else S := S + C; end; end; tempBuffer := tempBuffer + S; |
und dann am Schluß den tempBuffer abspeichern.
Fuß zum Gruß
Smartie
Grolle - Mo 02.05.05 15:01
Hi!
danke für deine Antwort. Allerdings bleibt das Programm bei
der Case Anweisung hängen (Ordinaltyp erforderlich?)
Viele Grüße....
Smartie - Mo 02.05.05 15:05
Dann laß die Case-Anweisung einfach weg. Wen ndu sie nutzen wilslt, mußt du deine Zeichen als Char einzeln nehmen. die Case ist nur dazu da, um die ersten 31 ASCII-Zeichen "fernzuhalten", sprich sowas wie tab, oder auch CR und LF etc.
Gruß
Smartie
Grolle - Mo 02.05.05 15:13
Muss ich tempBuffer dann erst nen leeren String zuweisen?
Ich checks net :nixweiss:
Smartie - Mo 02.05.05 15:19
Grolle hat folgendes geschrieben: |
Muss ich tempBuffer dann erst nen leeren String zuweisen?
Ich checks net :nixweiss: |
Jup, das wäre Sinnvoll.
Ich hab meine Anbindung ein bischen anders als du, deswegen würde es nicht viel sinn ergeben dir hier meinen komplette ncode einzutippen.
Spiel einfach ein bischen rum, ich hab auch n bischen länger gebraucht bis ichs funktionierend hatte. Such mal auch im forum rum, ich hab ähnliche fragen wie du vor knapp 2 wochen gestellt, gibt ziemlich ausführliche threats zu, auch in den FAQs
Lieben Gruß
Smartie
Grolle - Mo 02.05.05 15:27
Ich schick dir nochmal den Quelltext. Es wird aber immer noch jeder einzelne
Buchstabe untereinander in die Stringliste geschrieben :gruebel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word); var c,tempBuffer : string; I: Integer; begin tempBuffer := ''; for I:= 1 to Count do begin C := ApdComPort1.GetChar; end; tempBuffer := tempBuffer + c; List.Add(tempBuffer); List.SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt'); end; |
Viele Grüße... Grolle
Smartie - Mo 02.05.05 15:36
Schau ma lden Code genauer an.
Du lässt deine Schleife durchlaufen, und änderst ständig dein 'c', und dann lässt du das letzte c einfach zum tempBuffer dazuschreiben.
probiers doch mal so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word); var C, tempBuffer : string; I: Integer; begin tempBuffer := ''; for I:= 1 to Count do begin C := ApdComPort1.GetChar; tempBuffer := tempBuffer + C; end; List.Add(tempBuffer); List.SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt'); end; |
Ich hoffe des klappt, ich habs nicht ausprobiert.
Lieben Gruß
Smartie
chrisw - Mo 02.05.05 15:38
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word); var I: Integer; begin with TStringList.Create do try for I:= 0 to Count-1 do Text := Text + ApdComPort1.GetChar; SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt'); finally Free; end; end; |
Grolle - Mo 02.05.05 15:41
Hi Smartie!
Auch auf die Gefahr hin, dass du mir gleich den Kopf abreißt:
Es klappt so auch nicht. Alle Buchstaben sind schön untereinander. :evil:
Viele Grüße: Grolle
Smartie - Mo 02.05.05 15:45
Ich werd dir sicher nicht den Kopf abreißen. Ich hab selbst erst morgen vor 3 Wochen mit Delphi angefangen, und gehöre somit selbst noch zu den Anfängern.
Bist du sicher, daß du auc hwirklich den tempBuffer in deine Datei schreiben läßt, und nicht "C"?
:gruebel:
Lieben Gruß
Smartie
Grolle - Mo 02.05.05 17:33
@ chrisw
Bei deinem Vorschlag wird leider gar nix in die Liste (Datei)
geschrieben. :( .
chrisw - Di 03.05.05 07:35
Dann probier das hier mal !
(Der Fehler war, dass er Count von der TStringList und nicht von der procedure genommen hat.
Da die Liste leer ist, hat er auch nichts reingeschrieben)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word); var I: Integer; t : TStringList; begin t := TStringList.Create; try for I:= 0 to Count-1 do t.Text := t.Text + ApdComPort1.GetChar; t.SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt'); finally t.Free; end; |
Grolle - Di 03.05.05 09:40
Hi Chris!
Hat auch nicht geklappt. Die Datei ist nach wie vor leer.
Ich werde noch verrückt... :bawling:
Habe es jetzt so probiert, aber in der Datei stehen alle
Buchstaben untereinander und es gibt ne Exception:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word); var c,tempBuffer : string; I: Integer; begin tempBuffer := ''; for I:= 1 to Count do begin C := ApdComPort1.GetChar; tempBuffer := tempBuffer + c; end; List.Add(tempBuffer); List.SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt'); end; |
HIIIIIIIIIIIILLLLLLLLLLLFFFFFFFFFFFFFFFFFFFFFFEEEEEEEEEEEEEEEEEEEEEE
chrisw - Di 03.05.05 10:23
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word); var I: Integer; t : TStringList; tempStr : String; begin t := TStringList.Create; try for I:= 1 to Count do tempStr := tempStr + ApdComPort1.GetChar; t.Text := tempStr; t.SaveToFile(ExtractFilePath(ParamStr(0))+ 'temp.txt'); finally t.Free; end; end; |
Grolle - Di 03.05.05 14:04
Hi!
Danke erstmal für eure Antworten und für eure Geduld. :roll:
vielleicht habe ich noch nicht das wirkliche Verständniss für
die RS232, aber warum funktioniert dann folgendes:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word); var Data: String; I: Integer; begin Data := ''; for I:= 0 to Count-1 do begin Data := Data + ApdComPort1.GetChar; RichEdit1.SelText := (Data); end; end; |
Hier wird einfach das, was von dem Gerät zurück kommt an ein Memo über-
geben. Das funktioniert sehr gut. Warum klappt das mit der Stringliste
nicht?
chrisw - Di 03.05.05 14:34
Wenn Du mein letztes Beispiel nimmst, die Zeile I := 1 to Count ..
in I := 0 to Count -1 ... änderst sollte es dann auch funktionieren !
Grolle - Mi 04.05.05 10:22
Hi!
Funktioniert leider auch so nicht!
Sollte ich mich nach einer komplett
anderen Lösung umsehen?
chrisw - Mi 04.05.05 10:49
Probier mal das hier !
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:
| RS232Active : Boolean; tempBuffer : String; RS232Active := False; procedure TForm1.Timer1Timer(Sender: TObject); begin RS232Active := False; with TStringList.Create do try Text := tempBuffer; SaveToFile('c:\test.txt'); finally Free; end; tempBuffer := ''; end;
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word); var I : Word; begin RS232Active := True; Timer1.enabled := False; Timer1.enabled := True; for I := 1 to Count do tempBuffer := tempBuffer + ApdComPort1.GetChar; end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!