Основываясь на некоторых комментариях, приведенных здесь ( Как работать с записями, используя файловый поток ввода-вывода вместо «старого» ввода-вывода ), я попытался переписать свой код. (Я попросил потоковое решение, но это все еще открытый вопрос). Я использую таблицы, созданные и поддерживаемые в Excel, которые хранятся в виде TXT-файлов с разделителями табуляции (здесь: File1.txt). Теперь я использую компонент stringlist для чтения данных и анализа строки с помощью небольшой программы, найденной в другом месте (адаптированной к моим потребностям). Однако нужная мне строковая запись должна быть длиннее 256 символов, тогда как Delphi требует, чтобы я определил строку как строку [255], иначе я получу ошибку «финализации». Мой вопрос: как получить полную строку в моих записях? Вот код:
TExample = record
Nr : integer;
Load : string[16];
Tekst : string[255]; // this is my problem, I can't use it without the "[255]"
end;
procedure ParseString(const SourceString : string; Nr: integer) ;
/// based on Zarko Gajic's procedure
/// uses tab char (#9) as delimiter
/// Nr = number of substrings
/// fills global string array SA[0..Nr-1] with the parsed substrings
var
N,K,i : integer;
txt : string;
begin
txt := SourceString + #9;
Setlength(SA, Nr);
i := 0;
while Length(txt) > 0 do begin
K := Pos(#9, txt) ;
SA[i] := Copy(txt,0,K-1) ;
trim(SA[i]); // get rid of any trailing #13#10 chars
txt := Copy(txt,K+1,MaxInt) ;
i := i+1;
end;
end;
procedure ConvertFile1;
var
TFile : textfile;
EFile : File of TExample;
Fname : string;
SList : TStringlist;
BigStr : string; // this is full line of data to be parsed
ER : TExample;
i,N : integer;
AE : array of TExample;
begin
MainDir := GetCurrentDir;
Fname := MainDir + '\Data\File1.txt';
AssignFile(Tfile, Fname);
if (FileExists(Fname)) then begin
try
SList := TStringList.Create;
SList.Loadfromfile(Fname);
N := SList.Count;
SetLength(AE,N-1);
for i := 1 to N-1 do begin // i := 1 will skip 1st line = a header in .txt file
BigStr := SList[i];
ParseString(BigStr,3); // real data may have > 3 columns
ER.Nr := StrtoInt(SA[0]);
ER.Load := SA[1]);
ER.Tekst := SA[2];
AE[i-1] := AR;
end;
finally
if Assigned(sList) then FreeAndNil(sList);
end;
end;
Спасибо, Фред