|
Вопрос # 4 123/ вопрос открыт / |
|
Добрый день, уважаемые товарищи программисты. Прошу у Вас помощи. Дело вот в чем. на форме имеется StringGrid и два DateTimePicker'а. Как сохранять и загружать таблицу (StringGrid) в текстовый файл я нашел (код приведен ниже). Подскажите пожалуйста, как изменить этот код, чтобы в файл можно было сохранить также даты, взятые из DateTimePicker-ов, и соответственно их потом из файла загрузить обратно. Заранее премного благодарен!
Приложение: Переключить в обычный режим-
- procedure SaveStringGrid(FN:TFileName; SG:TStringGrid);
- var
-
-
- begin
- AssignFile(f,FN);
-
-
-
- WriteLn(f,SG.RowCount);
- for i:=0 to SG.ColCount-1
- do
- begin
- for j:=0 to SG.RowCount-1
- do
- begin
-
- end;
- end;
- CloseFile(f);
- end;
- -------------------------------------------------------------
-
- procedure LoadStringGrid(FN:TFileName; SG:TStringGrid);
- var
- f:TextFile;
- s:string;
- i,j:integer;
- begin
- AssignFile(f,FN);
- Reset(f);
- ReadLn(f,s);
- SG.ColCount:=strtoint(s);
- ReadLn(f,s);
- SG.RowCount:=strtoint(s);
- for i:=0 to SG.ColCount-1
- do
- begin
- for j:=0 to SG.RowCount-1
- do
- begin
- ReadLn(f,s);
- SG.Cells[i,j]:=s;
- end;
- end;
- CloseFile(f);
- end;
 |
Вопрос задал: Михаил Лебедев (статус: Посетитель)
Вопрос отправлен: 6 мая 2010, 16:47
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: DNK
Здравствуйте, Михаил Лебедев!
Для этого надо воспользоваться свойством TDateTimePicker.Date. Оно имеет тип TDate, который по своей сути вещественный тип Double. В приложении примеры чтения и записи даты. Куда уж поместить это в ваш файл смотрите сами.
Ещё замечания: Во-первых Append здесь лишний. Во-вторых в случае ошибки файл может остаться открытым, поэтому приучайся использовать try - finally.
Приложение: Переключить в обычный режим-
-
- procedure ...
- var f:TextFile;
- dt: TDateTime;
- begin
- AssignFile(f, 'c:/time.txt');
- Rewrite(f);
- try
- dt := DateTimePicker1.Date;
- write(f, dt);
- finally
- CloseFile(f);
- end;
- end;
-
-
-
- procedure ...
- var f:TextFile;
- dt: TDateTime;
- begin
- AssignFile(f, 'c:/time.txt');
- Reset(f);
- try
- read(f, dt);
- DateTimePicker1.Date := dt;
- finally
- CloseFile(f);
- end;
- end;
 |
Ответ отправил: DNK (статус: Студент)
Время отправки: 6 мая 2010, 17:33
Оценка за ответ: 4
|
Мини-форум вопроса
Всего сообщений: 9; последнее сообщение — 7 мая 2010, 20:43; участников в обсуждении: 4.
6 мая 2010, 20:23: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Работа с файловой системой модератором Ерёмин А.А.
|
min@y™ (статус: Доктор наук), 7 мая 2010, 09:52 [#1]:
Выкинь этот код к ядренефене и используй XML.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Михаил Лебедев (статус: Посетитель), 7 мая 2010, 14:10 [#2]:
я не могу похвастать великими знаниями в области Delphi, и XML для меня - это что-то покрытое тайной. Мне бы хотелось тот код, который есть у меня модернизировать, чтобы можно было сохранять вместе с StringGrid-ом еще и даты.
|
|
Михаил Лебедев (статус: Посетитель), 7 мая 2010, 15:11 [#3]:
Сделал как посоветовал уважаемый DNK:, процесс сохранения файла работает как надо (правда дата сохраняется в таком виде: 4.94065645841247E-0324 (не знаю правильно это или нет)), но при загрузке данных из файла выскакивает ошибка EAccessViolation как раз в том месте, где происходит чтение даты из файла. Подскажите, пожалуйста, как это можно исправить. Вот код, который я использую для загрузки данных (ошибка возникает там, где я поставил !!):
// загрузка данных из файла
procedure LoadStringGrid(FN:TFileName; SG:TStringGrid);
var
f:TextFile;
s:string;
i,j:integer;
dt1, dt2 : TDateTime;
DateTimePicker1: TDateTimePicker;
DateTimePicker2: TDateTimePicker;
begin
AssignFile(f,FN);
Reset(f);
try
readln(f,dt1);
DateTimePicker1.Date := dt1;
!! readln(f, dt2);
DateTimePicker2.Date := dt2;
ReadLn(f,s);
SG.ColCount:=strtoint(s);
ReadLn(f,s);
SG.RowCount:=strtoint(s);
for i:=0 to SG.ColCount-1
do
begin
for j:=0 to SG.RowCount-1
do
begin
ReadLn(f,s);
SG.Cells[i,j]:=s;
end;
end;
finally
CloseFile(f);
end;
end;
|
|
Михаил Лебедев (статус: Посетитель), 7 мая 2010, 15:36 [#4]:
p.s. вторая дата, которая сохраняется в файл имеет вид: -7.92455445973535E+0155. меня интересует знак МИНУС перед числом. Это нормально?
|
|
Вадим К (статус: Академик), 7 мая 2010, 15:50 [#5]:
это однозначно какой то мусор.
Если читается через readln, то пишете ли вы дату через writeln?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Михаил Лебедев (статус: Посетитель), 7 мая 2010, 16:10 [#6]:
Да, сохраняю я через Writeln. вот код, с помощью которого я сохраняю в файл:// Сохранение исходных данных в файл
procedure SaveStringGrid(FN:TFileName; SG:TStringGrid);
var
f:TextFile; // файл, в который сохраняются данные
i,j:integer;
dt1, dt2 : TDateTime;
DateTimePicker1: TDateTimePicker;
DateTimePicker2: TDateTimePicker;
begin
AssignFile(f,FN);
Rewrite(f); // создаем файл
try
dt1 := DateTimePicker1.Date;
writeln(f,dt1);
dt2 := DateTimePicker2.Date;
writeln(f,dt2);
WriteLn(f, SG.ColCount); //записываем кол-во строк и столбцов StringGrid-а
WriteLn(f, SG.RowCount);
for i:=0 to SG.ColCount-1
do
begin
for j:=0 to SG.RowCount-1
do
begin
WriteLn(f,SG.Cells[i,j]); // запись значений ячеек
end;
end;
finally
CloseFile(f);
end;
end;
|
|
DNK (статус: Студент), 7 мая 2010, 17:15 [#7]:
Если не нравится такой вид, то можно предварительно сконвертировать дату в строку.
s := DateToStr(DateTimePicker1.Date);
writeln(f, s);
Соответственно при чтении:
readln(f, s);
DateTimePicker1.Date := StrToDate(s)
"Digital Networked Knight"
|
|
Михаил Лебедев (статус: Посетитель), 7 мая 2010, 17:48 [#8]:
попробовал, но что то попрежнему никак. сохранять сохраняет, но почему то, какие бы значения дат (у меня 2 календаря на форме) я не выбирал сохраняются следующие даты 30.12.1899. А загрузить эти данные так и не получается. выдает ошибку EAccessViolation. Помогите, пожалуйста. уже всю голову изломал над этим вопросом...
|
|
Михаил Лебедев (статус: Посетитель), 7 мая 2010, 20:43 [#9]:
Всё! Заработало! нашел решение данной проблеммы. Для сохранения и загрузки были отдельные процедуры, но как только я перенес код для сохранения в стандартные процедуры, то тут же все заработало. Использовал DateToStr и StrToDate. Всем большое спасибо за ценные советы.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|