| 
| 
 | Вопрос # 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. Всем большое спасибо за ценные советы. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |