Danke an alle.
Hab das jetzt mit Zeigern gelöst.
Bin ich zunächst nicht drauf gekommen
Falls jemand das gleiche Problem hat:
Delphi-Quellcode:
//******************************************************************************
// Auslesen der .csv Datei und schreiben in ein Record vom Typ RCVMsg. Zunächst
// wird der Kopf der Datei abgeschnitten und anschließend werden die Daten
// ausgelesen. Dabei wird die eingelesen Reihe aus der Dateí in einen sting
// zwischengespeichert. Anschließend wird dann dieser String zerlegt und in den
// Record geschrieben. Dies geschieht mit Hilfe von Pointern, die die jeweiligen
// Bezugspunkte angeben.
//
// Eingabeparameter : - Dateiname : Name und Pfad der zu öffnenden Datei
//
// Rückgabewert : ------
//******************************************************************************
procedure TForm1.DateiAuslesen(Dateiname : string);
var
datei : textFile;
Einlesestring : string; //Der eingelesene String wird
Zwischenspeicher : string; //Hier wird der Ausgabestring gespeichert
zaehler : Integer; //Hilfsvariable
Stringzaehler : Integer; //zählt die einzelnen Felder des eingelesenen Strings hoch
Recordeintrag : Integer; //Zähler für die einzelnen Recordeinträge
EinleseRCVMsg : TCANRcvMsg; //Zwischenspeicher für die ausgelesenen Nachrichten
Abstandszaehler : cardinal; //wenn kein Trennzeichen gefunden wurde, dann Daten Ausgeben
ZeigerAnfangEinlesestring, ZeigerEndeEinlesestring : PChar; //Zeiger auf Anfang und ende, beim Auslesen der Daten
begin
Assignfile(Datei, Dateiname);
Reset(Datei); // Datei zurücksetzen
for zaehler := 0 to 7 do // Anfang auslesen und abschneiden
readln(Datei,Einlesestring);
while not EOF(Datei) do
begin // Datei auslesen
readln(Datei,Einlesestring); // eine Zeile auslesen
Recordeintrag := 0; // Record initalisieren, da immer ein Eintrag höher gezählt wird
Abstandszaehler := 0;
ZeigerAnfangEinlesestring := Pchar(Einlesestring); //Zeiger auf den beginn des Strings setzen
for Stringzaehler := 1 to Length(Einlesestring)+1 do //einmal den gesamten eingelesenen string durchlaufen
begin // String auslesen //Ausgabe entwerder wenn Trennzeichen gefunden oder String am Ende
if (Einlesestring[Stringzaehler] = ';') or (Stringzaehler = (Length(Einlesestring)+1)) then
begin
inc(Recordeintrag); //in den nächsten Recordeintrag schreiben
ZeigerEndeEinlesestring := ZeigerAnfangEinlesestring + Abstandszaehler; // Ende des auszulesenden Strings berechnen
// String schreiben, in den berechneten grenzen
SetString(Zwischenspeicher, ZeigerAnfangEinlesestring, ZeigerEndeEinlesestring - ZeigerAnfangEinlesestring);
// Ergebnis in Record schreiben
case Recordeintrag of
1: EinleseRCVMsg.msgbuff.ID := StrToInt(Zwischenspeicher);
2: EinleseRCVMsg.msgbuff.MSGTYPE := StrToInt(Zwischenspeicher);
3: EinleseRCVMsg.msgbuff.LEN := StrToInt(Zwischenspeicher);
4: EinleseRCVMsg.msgbuff.DATA[0] := StrToInt(Zwischenspeicher);
5: EinleseRCVMsg.msgbuff.DATA[1] := StrToInt(Zwischenspeicher);
6: EinleseRCVMsg.msgbuff.DATA[2] := StrToInt(Zwischenspeicher);
7: EinleseRCVMsg.msgbuff.DATA[3] := StrToInt(Zwischenspeicher);
8: EinleseRCVMsg.msgbuff.DATA[4] := StrToInt(Zwischenspeicher);
9: EinleseRCVMsg.msgbuff.DATA[5] := StrToInt(Zwischenspeicher);
10: EinleseRCVMsg.msgbuff.DATA[6] := StrToInt(Zwischenspeicher);
11: EinleseRCVMsg.msgbuff.DATA[7] := StrToInt(Zwischenspeicher);
12: EinleseRCVMsg.hNet := StrToInt(Zwischenspeicher);
13: EinleseRCVMsg.rcvtime.millis := StrToInt(Zwischenspeicher);
14: EinleseRCVMsg.rcvtime.millis_overflow := StrToInt(Zwischenspeicher);
15: EinleseRCVMsg.rcvtime.micros := StrToInt(Zwischenspeicher);
end; // case
ZeigerAnfangEinlesestring := ZeigerEndeEinlesestring+1; // neuen Anfangspunkt bestimmen
Abstandszaehler := 0; // hilfszäher zurücksetzen, der den Absatnd zwischen
// Anfang und Ende angibt
end
else // wenn kein Trennzeichen gefunden wurde, dann ist eine Zeichen-
begin // kette vorhanden. Es wird der abstand erhöht
inc(Abstandszaehler);
end;
end; // String auslesen
RcvMsgList.UpdateMsg( EinleseRCVMsg.msgbuff,
EinleseRCVMsg.hNet,
EinleseRCVMsg.rcvtime.millis);
end; // Datei auslesen
end;