Autor Beitrag
Krish
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 19.02.12 15:06 
So es ist mal wieder so weit, ich habe ein Problem bei dem ich nicht weiterkomme.

Ersteinmal zu den Grundlagen.
Ich möchte ein Programm schreiben, das Daten aus der seriellen Schnittstelle auswertet. Dabei handelt es sich um Zeiten einer Carrerarennbahn.

Über den ComPort kommen Datensätze die aus 12 stelligen Zahlen bestehen.

1. Ziffer: Spieler (1 oder 2)
2. bis 4. Ziffer: Rundenzahl (001 bis 999)
5. bis 12. Ziffer: Zeit in tausendstel Sekunden (0 bis 99999999)

und hier das programm:

ausblenden 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:
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
  Daten, Spur, Runde, Zeit : String;
  Z : LongInt;
begin
  ComPort.ReadStr(Daten, Count);     //Daten einlesen
  Memo.Text := Memo.Text + Daten;    //Daten in Kontrollfenster einfügen
  Spur := leftstr(Daten,1);          //Spielernummer ermitteln
  Runde := midstr(Daten,2,3);        //Runde ermitteln
  Zeit := midstr(Daten,5,8);         //Zeit ermitteln
  Z := StrToInt(Zeit);               //Zeit in Integer umwandeln

  if spur = IntToStr(1)
    then
      begin                             //Ausgabe für Spieler 1
        label3.caption := runde;
        label5.caption := inttostr(Z);
      end
    else
      begin                             //Ausgabe für Spieler 2
        label8.caption := runde;
        label10.caption := inttostr(Z);
      end;
end;



Das aufteilen des Strings in die einzelnen Daten (Spieler, Runde, Zeit) ist kein Problem.

Jedoch habe ich ein Problem den Sring 'Zeit' in einen LongInteger umzuwandeln. Diesen Wert würde ich später noch für andere Unterprogramme benötigen.

Beim testen des Programms kommt immer die Fehlermeldung: " ********(belibige Ziffern) ist kein gültiger Integer Wert. "

Wo liegt nun mein Fehler?

LG Krish

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 19.02.12 15:20 
user profile iconKrish hat folgendes geschrieben Zum zitierten Posting springen:
Beim testen des Programms kommt immer die Fehlermeldung: " ********(belibige Ziffern) ist kein gültiger Integer Wert. "
Was für Ziffern sind das denn? Sieht es denn aus wie eine gültige Zahl? Sind da vielleicht Steuerzeichen dabei (solltest du im Debugger sehen können)?
Krish Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 19.02.12 15:25 
Pro Stelle sind das nur Ziffern von 0 bis 9 (z.B. 132435). Es sollte also ein Gültiger Integer wert sein jedoch kommt immer dieser Fehler.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 19.02.12 15:27 
Dann müssen da Steuerzeichen drin drin. Mach einmal einen Haltepunkt auf die Zeile und schau bevor die ausgeführt wird, was wirklich in dem String drin steht...
Funktioniert vielleicht ein Trim um diese zu entfernen?
Krish Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 19.02.12 15:40 
In diesem Srting stehen nur Zahlen. Das kann ich ja in dem Kontrollfenster überprüfen.

Als Beispiel:

Über den ComPort kommt folgender String: 100514023

1 005 14023
1 -> Spieler 1
005 -> Runde 5
14023 -> Zeit: 14023 ms

Wie gesagt das Zerlegen Funktioniert jedoch kann ich den neuen String(Zeit) nicht in eine LongInt Variable konvertieren.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 19.02.12 15:52 
Hier hast du ja weniger Stellen. Vermutlich befinden sich dahinter schlicht noch Steuerzeichen wie geschrieben. Wie sieht es denn aus im Debugger? Wie im ersten Bild? Oder doch wie im zweiten?
IntCorrect

IntIncorrect
Einloggen, um Attachments anzusehen!
Krish Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 19.02.12 16:07 
Entschuldige die dumme Frage aber wie kann ich mir das denn so im Debugger anzeigen lassen?
Mir wird da kein Wert angezeigt.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 19.02.12 16:12 
Maus drüber halten, ansonsten kann das deine Version vielleicht nicht, dann markiere einfach die Variable und drück Strg + F7. ;-)
Krish Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 19.02.12 16:17 
So wie du richtig vermutet hast sieht es wie im unteren Bild aus mit den Steuerzeichen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 19.02.12 16:21 
Du behandelst auch nicht, wenn du nur einen Teil der Daten in einem Rutsch bekommst. Aber wie dem auch sei, du kannst Trim ausprobieren.

Wenn das nicht geht, musst du den String durchgehen und schauen wie lange Ziffern drin stehen. Wenn das Endzeichen immer fest ist, kannst du auch Pos benutzen um dessen Position zu finden.
Krish Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 19.02.12 16:36 
Danke für die umfassende Fehleranlyse. TrimRight hat das ganze Problem gelöst.

Jetzt funktioniert es endlich wie es soll.