|
Вопрос # 687/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Как создать массив StringGrid, который будет хранится и считываться с файла при начале работы программы? Т.е. при выходе из программы массив сохраняется в файл, а при запуске программы она прочитывает файл и заполняет StringGrid данными из файла.
Заранее спасибо!
 |
Вопрос задал: Евгений Eklmn (статус: Посетитель)
Вопрос отправлен: 1 июля 2007, 13:33
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Градов Ю.М.
Здравствуйте, Трофимов Евгений!
В приложении дан пример. В Form1.FormCreate сначала отключите считывание файла (иначе выскочит ошибка - файла с таким именем нет), а после того, как запустите программу и выйдите из неё - файл будет создан, включите процедуру считывания файла в StringGrid1. Возможно использовать динамический массив или типа Record
Удачи!
Приложение: Переключить в обычный режим- const r = 10;
- c = 10;
-
- var
- Form1: TForm1;
- Mass: array[1..10,1..10] of string;
- F: TextFile;
-
- implementation
-
- {$R *.dfm}
-
- procedure TForm1.FormCreate(Sender: TObject);
- var i,j: integer;
- s: string;
- begin
- StringGrid1.ColCount:=c;
- StringGrid1.RowCount:=r;
- AssignFile(F,'data.dat');
- Reset(F);
- for i:=1 to c do for j:=1 to r do
- begin
- s:=StringGrid1.Cells[c,r];
- Readln(F,s);
- end;
- CloseFile(F);
- end;
-
- procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
- var i,j: integer;
- begin
- AssignFile(F,'data.dat');
- Rewrite(F);
- for i:=1 to StringGrid1.ColCount do for j:=1 to StringGrid1.RowCount do
Writeln(F,StringGrid1.Cells[c,r]);
- CloseFile(F);
- end;
-
 |
Ответ отправил: Градов Ю.М. (статус: 8-ой класс)
Время отправки: 1 июля 2007, 15:08
Оценка за ответ: 5
|
Ответ #2. Отвечает эксперт: min@y™
Хочу предложить альтернативный вариант. Для хранения данных из TStringGrid можно использовать простой текстовый файл, а также XML-файл.
Поясню на примере текстового файла.
Данные можно хранить так: одна строка файла - одна строка в TStringGrid. Разделение данных по ячейкам можно сделать с помощью символов-разделителей. Советую запустить Excel, наваять там простенькую табличку, скажем 5х6, сохранить в формате CSV, а потом заглянуть в этот файл из "блокнота". Там строки делятся на ячейки с помощью символа ";".
Кроме самих данных в начале текстового файла можно хранить параметры самого компонента TStringGrid. Такие, как:
- ColCount;
- ColWidths;
- RowCount;
- и прочие значения свойств компонента.
Если чего непонятно, могу написать пример.pas.
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 2 июля 2007, 08:46
|
Мини-форум вопроса
Всего сообщений: 3; последнее сообщение — 1 июля 2007, 21:00; участников в обсуждении: 2.
|
Градов Ю.М. (статус: 8-ой класс), 1 июля 2007, 15:14 [#1]:
Исправьте, пожалуйста, не проверил сначала:
procedure TForm1.FormCreate(Sender: TObject);
var i,j: integer;
s: string;
begin
StringGrid1.ColCount:=c;
StringGrid1.RowCount:=r;
AssignFile(F,'data.dat');
Reset(F);
for i:=1 to c do for j:=1 to r do
begin
Readln(F,s);
StringGrid1.Cells[i,j]:=s;
end;
CloseFile(F);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var i,j: integer;
begin
AssignFile(F,'data.dat');
Rewrite(F);
for i:=1 to StringGrid1.ColCount do
for j:=1 to StringGrid1.RowCount do
Writeln(F,StringGrid1.Cells[i,j]);
CloseFile(F);
end;
|
|
Евгений Eklmn (статус: Посетитель), 1 июля 2007, 19:49 [#2]:
А если данные получаются при работе программы, как их распределить по ечейкам? например есть 3 переменные, полученные во время работы программы и их нужно из файла внести в 3 ячейки StringGrid. И еще как эти переменные записать в файл (если их нужно записывать не как обычно)?
Генерация случайных чисел - слишком важный вопрос, чтобы оставлять его на волю случая. (Роберт Ковзю, Окриджская лаборатория)
|
|
Градов Ю.М. (статус: 8-ой класс), 1 июля 2007, 21:00 [#3]:
Какая разница? Сохраняйте всю StringGrid, сколько бы не изменилось значений ячеек. Только для сохранения во время работы программы напишите отдельную процедуру и вызывайте ее хоть по Button Click.
procedure TForm1.SaveTable;
var i,j: integer;
begin
AssignFile(F,'data.dat');
Rewrite(F);
for i:=1 to StringGrid1.ColCount do
for j:=1 to StringGrid1.RowCount do
Writeln(F,StringGrid1.Cells[i,j]);
CloseFile(F);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
SaveTable;
end;
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|