Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 123

/ вопрос открыт /

Добрый день, уважаемые товарищи программисты. Прошу у Вас помощи. Дело вот в чем. на форме имеется StringGrid и два DateTimePicker'а. Как сохранять и загружать таблицу (StringGrid) в текстовый файл я нашел (код приведен ниже). Подскажите пожалуйста, как изменить этот код, чтобы в файл можно было сохранить также даты, взятые из DateTimePicker-ов, и соответственно их потом из файла загрузить обратно. Заранее премного благодарен!

Приложение:
  1.  
  2. procedure SaveStringGrid(FN:TFileName; SG:TStringGrid);
  3. var
  4.  
  5.  
  6. begin
  7. AssignFile(f,FN);
  8.  
  9.  
  10.  
  11. WriteLn(f,SG.RowCount);
  12. for i:=0 to SG.ColCount-1
  13. do
  14. begin
  15. for j:=0 to SG.RowCount-1
  16. do
  17. begin
  18.  
  19. end;
  20. end;
  21. CloseFile(f);
  22. end;
  23. -------------------------------------------------------------
  24.  
  25. procedure LoadStringGrid(FN:TFileName; SG:TStringGrid);
  26. var
  27. f:TextFile;
  28. s:string;
  29. i,j:integer;
  30. begin
  31. AssignFile(f,FN);
  32. Reset(f);
  33. ReadLn(f,s);
  34. SG.ColCount:=strtoint(s);
  35. ReadLn(f,s);
  36. SG.RowCount:=strtoint(s);
  37. for i:=0 to SG.ColCount-1
  38. do
  39. begin
  40. for j:=0 to SG.RowCount-1
  41. do
  42. begin
  43. ReadLn(f,s);
  44. SG.Cells[i,j]:=s;
  45. end;
  46. end;
  47. CloseFile(f);
  48. end;


Михаил Лебедев Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Михаил Лебедев (статус: Посетитель)
Вопрос отправлен: 6 мая 2010, 16:47
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: DNK

Здравствуйте, Михаил Лебедев!
Для этого надо воспользоваться свойством TDateTimePicker.Date. Оно имеет тип TDate, который по своей сути вещественный тип Double. В приложении примеры чтения и записи даты. Куда уж поместить это в ваш файл смотрите сами.
Ещё замечания: Во-первых Append здесь лишний. Во-вторых в случае ошибки файл может остаться открытым, поэтому приучайся использовать try - finally.

Приложение:
  1.  
  2.  
  3. procedure ...
  4. var f:TextFile;
  5. dt: TDateTime;
  6. begin
  7. AssignFile(f, 'c:/time.txt');
  8. Rewrite(f);
  9. try
  10. dt := DateTimePicker1.Date;
  11. write(f, dt);
  12. finally
  13. CloseFile(f);
  14. end;
  15. end;
  16.  
  17.  
  18.  
  19. procedure ...
  20. var f:TextFile;
  21. dt: TDateTime;
  22. begin
  23. AssignFile(f, 'c:/time.txt');
  24. Reset(f);
  25. try
  26. read(f, dt);
  27. DateTimePicker1.Date := dt;
  28. finally
  29. CloseFile(f);
  30. end;
  31. end;


Ответ отправил: DNK (статус: Студент)
Время отправки: 6 мая 2010, 17:33
Оценка за ответ: 4


Мини-форум вопроса

Всего сообщений: 9; последнее сообщение — 7 мая 2010, 20:43; участников в обсуждении: 4.

6 мая 2010, 20:23: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Работа с файловой системой модератором Ерёмин А.А.

min@y™

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

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. Всем большое спасибо за ценные советы.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:45
Выполнено за 0.04 сек.