Лично я бы предпочел не использовать здесь Pascal IO. Если вы хотите, чтобы ваш код мог читать данные Unicode, то Pascal IO вам не поможет.
Вы можете сделать то, что вы описываете, используя список строк для загрузки файла и затем SplitString
из блока StrUtils
для анализа строки.
procedure PopulateStringGrid(Grid: TStringGrid; const FileName: string);
var
Strings: TStringList;
Row, Col: Integer;
Items: TStringDynArray;
begin
Grid.RowCount := 0;//clear any previous data
Strings := TStringList.Create;
try
Strings.LoadFromFile(FileName);
Grid.RowCount := Strings.Count;
for Row := 0 to Strings.Count-1 do
begin
Items := SplitString(Strings[Row], ' ');
for Col := 0 to Grid.ColCount-1 do
if Col<Length(Items) then
Grid.Cells[Col, Row] := Items[Col]
else
Grid.Cells[Col, Row] := '0';
end;
finally
Strings.Free;
end;
end;
Обратите внимание, что SplitString
может быть не совсем то, что вам нужно. Например, он не объединяет повторяющиеся разделители в один. Чтобы понять, что я имею в виду, рассмотрим следующую информацию:
Hello World
Между двумя словами есть 4 пробела, и SplitString
вернет следующий массив:
'Hello'
''
''
''
'World'
Если вы хотите обрабатывать последовательные разделители как один разделитель, вы можете использовать свойство DelimitedText
списка строк:
procedure PopulateStringGrid(Grid: TStringGrid; const FileName: string);
var
TextFile, Line: TStringList;
Row: Integer;
begin
Grid.RowCount := 0;//clear any previous data
TextFile := TStringList.Create;
try
Line := TStringList.Create;
try
Line.Delimiter := ' ';
TextFile.LoadFromFile(FileName);
Grid.RowCount := TextFile.Count;
for Row := 0 to TextFile.Count-1 do
begin
Line.DelimitedText := TextFile[Row];
for Col := 0 to Grid.ColCount-1 do
if Col<Line.Count then
Grid.Cells[Col, Row] := Line[Col]
else
Grid.Cells[Col, Row] := '0';
end;
finally
Line.Free;
end;
finally
TextFile.Free;
end;
end;