Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ TXT to StringGrid

Автор: Desktop_4 7.06.2007 14:31

Файл например содержит:


0 0 1 0 0 1 0 0 0 0
0 0 0 1 0 0 1 0 1 0
1 1 1 0 0 0 0 0 1 0
0 0 1 0 1 1 0 1 1 0
0 0 1 0 1 0 1 1 1 1
1 0 1 1 1 1 1 0 1 0
0 1 0 1 1 1 1 1 0 0
1 1 1 1 0 0 1 1 1 1
1 0 0 1 0 1 0 0 1 1
0 0 0 0 1 0 0 0 1 1



Надо этот файл загрузить в StringGrid не трогая FixedRows/Cols...

Есть процедура:

procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName) ;
var f: TextFile; iTmp, i, k: Integer;
strTemp: String ;
begin
AssignFile(f, FileName) ;
Reset(f) ;
with StringGrid do
begin
// Get number of columns
Readln(f, iTmp) ;
ColCount := iTmp;
// Get number of rows
Readln(f, iTmp) ;
RowCount := iTmp;
// loop through cells & fill in values
for k := FixedRows to RowCount - 1 do begin
for i := FixedCols to ColCount - 1 do
begin
Readln(f, strTemp) ;
Cells[i, k] := strTemp;
end ;
end ;
CloseFile(f) ;
end ;
end;



Но грузится первая строка в одну ячейку.
Как правильно загрузить из файла в StringGrid ?
И как сделать проверку соотвецтвия формату файла который загружается ?

Автор: Ozzя 7.06.2007 14:55

Этот пример файла реальный?
Потому что, ты сначала грузишь кол-во строк и кол-во столбцов из файла.
А в файле этого нет.

Цитата
10
10
0 0 1 0 0 1 0 0 0 0
0 0 0 1 0 0 1 0 1 0
1 1 1 0 0 0 0 0 1 0
0 0 1 0 1 1 0 1 1 0
0 0 1 0 1 0 1 1 1 1
1 0 1 1 1 1 1 0 1 0
0 1 0 1 1 1 1 1 0 0
1 1 1 1 0 0 1 1 1 1
1 0 0 1 0 1 0 0 1 1
0 0 0 0 1 0 0 0 1 1

По твоему коду файл должен быть таким.
И ты читаешь полностью всю строку, разбивай ее.

Автор: Desktop_4 7.06.2007 16:39

Да если добавить 10 10 то грузиться
но в 1-у ячейку одну строку...
Как разбить строку ?

Автор: Ozzя 7.06.2007 16:48

http://forum.pascal.net.ru/index.php?showtopic=6972

Автор: Desktop_4 8.06.2007 1:22

А есть какой небуть простой способ разбиение слов для этой матрицы ?

Автор: volvo 8.06.2007 2:06

Так достаточно просто?

procedure LoadStringGrid(sg: TStringGrid; const FileName: TFileName);
var
f: TextFile; iTmp, i, k, p: Integer;
s: String ;
begin
AssignFile(f, FileName);
Reset(f);
with sg do begin
// Get number of columns
Readln(f, iTmp);
ColCount := iTmp + FixedCols;

// Get number of rows
Readln(f, iTmp);
RowCount := iTmp + FixedRows;

k := fixedrows;
while not eof(f) do begin

readln(f, s);
s := s + ' ';
i := fixedcols;
repeat
p := pos(' ', s);
if p > 0 then begin
cells[i, k] := copy(s, 1, p - 1);
inc(i);
delete(s, 1, p);
end;
until p = 0;
inc(k);
end;

end;
CloseFile(f);
end;


Автор: Desktop_4 8.06.2007 3:32

Да. Спасибо !

А как сделать проверку что бы если вначале открывающевася файла нету
N
N
(Где N там число)
То выводили ошибку про то что файл не коректен. ?

Автор: volvo 8.06.2007 3:49

Можно, например, читать не число, а строку:


...
// Get number of columns
Readln(f, s);
iTmp := StrToIntDef(s, -1);
if iTmp = -1 then { <--- Если условие выполнено, то прочитанная строка содержит не одно число }
...