[英]Loading StringGrid from text file
如何將用空格分隔的整數加載文本文件到StringGrid? 每個數字到每個單元格。 網格必須是矩形,因此如果缺少一些數字,則應使用0填充。
這是我到目前為止所做的,但是它需要已經設置了行數和列數。
while not eof(f) do
begin
while not eoln(f) do
begin
read(f, data);
StringGrid1.Cells[p, l] := data;
inc(p);
end;
p := 0;
readln(f);
inc(l);
end;
我個人選擇不使用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;
我建議嘗試一下此代碼。
這很基本,但是我敢肯定,您可以解決您的問題。
procedure LoadFile(FileName: string; StringGrid: TStringGrid);
var
temp, fName, sName, eMail: string;
sgItem: TStringList;
f: textfile;
begin
assignfile(f, FileName);
reset(f);
sgItem := TStringList.Create;
StringGrid.RowCount := 2;
while not eof(f) do
begin
readln(f, temp);
fName := copy(temp, 1, pos('|', temp) - 1);
delete(temp, 1, pos('|', temp));
sName := copy(temp, 1, pos('|', temp) - 1);
delete(temp, 1, pos('|', temp));
eMail := temp;
sgItem.Clear;
sgItem.Add(fName);
sgItem.Add(sName);
sgItem.Add(eMail);
StringGrid.Rows[StringGrid.RowCount - 1].AddStrings(sgItem);
StringGrid.RowCount := StringGrid.RowCount + 1;
end;
sgItem.Free;
closefile(f);
end;
用法:
LoadFile('File.txt', StringGrid1);
貝尼
嘗試這個
procedure FillStringgrid;
// Split the line of text into individual entries
procedure Split(const Delimiter: Char;Input: string;const Strings:TStrings);
begin
Assert(Assigned(Strings)) ;
Strings.Clear;
Strings.Delimiter := Delimiter;
Strings.DelimitedText := Input;
end;
var
strlst : Tstringlist;
myfile : TextFile;
search : string;
i,j : integer;
begin
i:= 0;
AssignFile(myfile,'filepath'); // specify your file path here
Reset(myFile);
while not eof(myfile) do
begin
Readln(myfile,search);
strlst:= Tstringlist.Create;
Split(' ',search,strlst); // get the no's separated by the delimiter
//adjust your column count based on no of entries
if StringGrid1.ColCount < strlst.Count then
StringGrid1.ColCount := strlst.Count;
StringGrid1.Rows[i]:=strlst; // adjust the row count
Inc(i);
StringGrid1.RowCount := i;
end;
// free stringlist and textfile
CloseFile(myfile) ;
strlst .free;
// fill in the blank entries with 0
for i := 0 to StringGrid1.RowCount - 1 do
begin
for j := 0 to StringGrid1.ColCount - 1 do
begin
if StringGrid1.Cells[j,i]='' then
StringGrid1.Cells[j,i]:='0';
end;
end;
end;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.