7 / 7 / 7
Регистрация: 27.01.2010
Сообщений: 32
1

Сохранение и загрузка в файла

09.02.2010, 20:52. Показов 10207. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
На форме есть StringGrid со заполнеными полями, и много заполняемых Edit и кнопка сохранить,загрузить.
При нажатии на Сохранить должны сохранятся все данные из этих полей.
При нажатии на Загрузить соответсвенно поля заполняются данными из файла.
На данный момент полазив по интернету пришел к такому результату:

Сохранение StringGrid:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
Procedure SaveGrid(Const S: String; Const Grid: TStringGrid);  // Сохранение данных таблицы
Var ff: TextFile;
    t: Integer;
Begin
 AssignFile(ff, S);
 ReWrite(ff);
 try
  With Grid Do For t:=1 to RowCount - 1 Do 
   WriteLn(ff, StringReplace(Rows[t].Text, #13#10, #9, [rfReplaceAll]));
 finally
  CloseFile(ff);
 end;  
End;

Сохранение Edit+вызов процедуры сохранения таблицы:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm2.Save(Sender: TObject);      //Сохранение всех Edit + вызов сохранения Таблицы
var
  SaveStrim: TMemoryStream;
  Text:string;
  j:Byte;
begin
 SaveStrim:=TMemoryStream.Create;
 for j := 0 to ComponentCount - 1 do
    if Components[j] is TEdit then
      Begin
        Text:=(Components[j] as TEdit).Text;
        SaveStrim.Write(text,Length(text))  ;
        Savestrim.Savetofile('Save.txt');
      end;
      Savestrim.Free;
 SaveGrid('grid.dat',StringGrid1);
end;
Загрузка данных в StringGrid:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Procedure LoadGrid(Const S: String; Const Grid: TStringGrid); //Загрузка таблицы из файла
Var ff: TextFile;
    St: String;
Begin
 AssignFile(ff, S);
 Reset(ff);
 try
  ClearGrid(Grid); // очистка грида, если нужно
  While not Eof(ff) Do
   Begin
    ReadLn(ff, St);
    With Grid Do
     Begin
      RowCount:=RowCount + 1;
      Rows[RowCount - 1].Text:=StringReplace(St, #9, #13#10, [rfReplaceAll]);
     End; 
   End; 
 finally
  CloseFile(ff);
 end;
End;
На данные момент с гридом все работает.
Edit вроде тоже что то записывает.


Подскажите каким образом загрузить данные в Edit из файла( Если не код , то хотя бы натолкните на идею и покажите что почитать)))))

+ Проверьте то что есть уже.



Заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2010, 20:52
Ответы с готовыми решениями:

Сохранение и загрузка файла Image в Delphi
Добрый день. Помогите пожалуйста с заданием. Необходимо, чтобы при запуске приложения, Image...

Сохранение из StringGrid в файл и загрузка из файла
Есть таблица с 5 столбцами и 0 строками.Данные заполняются в режиме редактирования...

Сохранение и Загрузка даных с файла в ListView
Парни, второй день уже мучаюся и не могу никак сделать сохранение даных из ListView в файл и...

Сохранение, загрузка и заполнение массивом файла Image
Добрый день. Помогите пожалуйста с заданием. Необходимо, чтобы при запуске приложения, Image...

5
Эксперт С++
3071 / 1409 / 425
Регистрация: 19.01.2009
Сообщений: 3,879
09.02.2010, 22:03 2
А то что сохраняется из Editов в файл save.txt, поидее на каждой итерации цикла будет содержимое файла будет перезаписоваться, так что по выходу из цикла в файле Save.txt будет значение последнего Edita.

Добавлено через 11 минут
Так бы я переписал процедуру сохранения, теперь работает
Delphi
1
2
3
4
5
6
7
8
9
10
11
var j:Byte;
    f:TextFile;
begin
  AssignFile(f, 'Save.txt');
  Rewrite(f);
  for j := 0 to ComponentCount - 1 do
    if Components[j] is TEdit then
        WriteLn(f, (Components[j] as TEdit).Text);
  CloseFile(f);
  SaveGrid('grid.dat',StringGrid1);
end;
Добавлено через 3 минуты
Ну а вот так процедуру загрузку из файла save.txt в Editы
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var j:Byte;
    f:TextFile;
    s:string;
begin
  AssignFile(f, 'Save.txt');
  ReSet(f);
  for j := 0 to ComponentCount - 1 do
    if Components[j] is TEdit then
    begin
      ReadLn(f, s);
      (Components[j] as TEdit).Text:=s;
    end;
  CloseFile(f);
end;
1
Эксперт С++
3071 / 1409 / 425
Регистрация: 19.01.2009
Сообщений: 3,879
09.02.2010, 22:26 3
Цитата Сообщение от AvaMight Посмотреть сообщение
Delphi
1
With Grid Do For t:=1 to RowCount - 1 Do
Если в гриде нет FixedRows, то тут нужно начинать с нуля, есть вероятность пропустить первую строку. Т.е. проверочку желательно добавить.
0
7 / 7 / 7
Регистрация: 27.01.2010
Сообщений: 32
12.02.2010, 02:28  [ТС] 4
хм.. Странно может я этого не замечал либо что то напутал дальше но у меня при загрузке данных из файла в StringGrid новые данные вставляются под старыми...

Думаю дело в
Delphi
1
RowCount:=RowCount + 1;
но не уверен... Можете подсказать с чем связано такое действие?

P.s В таблице хранятся данные по месяцам, соответсвенно при выборе месяца должны быть отображены данные только этого месяца
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
12.02.2010, 11:57 5
Процедура LoadGrid() добавляет новые строки и в них записывает данные из файла. Её работа зависит от реализации процедуры ClearGrid(). Если эта прцедура только очищает ячейки (но не удаляет строки таблицы), тогда LoadGrid() добавит данные ниже уже существующих строк - видимо именно это и происходит.
Прокомментирую процедуру LoadGrid():
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Procedure LoadGrid(Const S: String; Const Grid: TStringGrid); //Загрузка таблицы из файла
Var ff: TextFile;
    St: String;
Begin
 //Файловая переменная связывается с именем файла.
 AssignFile(ff, S);
 //Открытие файла в режиме "только чтение".
 Reset(ff);
 try
  ClearGrid(Grid); // очистка грида, если нужно
  //Цикл до тех пор пока не достигнут конец файла.
  While not Eof(ff) Do
   Begin
    //Читаем очередную строку из файла.
    ReadLn(ff, St);
    With Grid Do
     Begin
      //Добавляем новую строку в таблицу (т. к. мы увеличениваем общее количество строк на 1).
      RowCount:=RowCount + 1;
      //Во вновь добавленную строку добавляем данные из ранее прочитанной строки файла.
      //Распределяем данные по ячейкам, ориентируюясь на знаки табуляции.
      Rows[RowCount - 1].Text:=StringReplace(St, #9, #13#10, [rfReplaceAll]);
     End; 
   End; 
 finally
  //Закрываем файл.
  CloseFile(ff);
 end;
End;
Чтобы решить эти проблемы, можно действовать так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Процедура для удаления строк данных (т. е., исключая фиксированные строки).
procedure ClearGrid(Const Grid : TStringGrid);
var
  i : Integer;
begin
  //Очистка строк. Этот шаг необходим из-за "плавающего" бага
  //компонента TStringGrid. - Строки, удалённые через уменьшение значения
  //TStringGrid.RowCount на самом деле не всегда удаляются. - TStringGrid
  //их прячет и при последующем увеличении TStringGrid.RowCount в таблице опять
  //могут появиться ранее "удалённые" строки. Именно поэтому необходима очистка
  //перед удалением.
  for i := Grid.FixedRows to Grid.RowCount - 1 do begin
    Grid.Rows[i].Clear;
  end;
  //Удаление строк.
  //Здесь +1 - для того, чтобы после фиксированной строки осталась одна нефиксированная
  //строка - это необходимо для правильного функционирования таблицы.
  Grid.RowCount := Grid.FixedRows + 1;
end;
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Procedure LoadGrid(Const S: String; Const Grid: TStringGrid); //Загрузка таблицы из файла
Var ff: TextFile;
    St: String;
  //Индекс очередной строки в которую мы намереваемся записать данные из файла.
  RowNum : Integer;
Begin
 //Файловая переменная связывается с именем файла.
 AssignFile(ff, S);
 //Открытие файла в режиме "только чтение".
 Reset(ff);
 try
  //Очистка таблицы.
  ClearGrid(Grid);
  //Индекс самой верхней нефиксированной строки.
  RowNum := Grid.FixedRows;
  //Цикл до тех пор пока не достигнут конец файла.
  While not Eof(ff) Do
   Begin
    //Читаем очередную строку из файла.
    ReadLn(ff, St);
    With Grid Do
     Begin
      //Если требуется, добавляем строку вниз таблицы.
      if RowNum = RowCount then begin
        RowCount := RowCount + 1;
      end;
      //Распределяем данные по ячейкам, ориентируюясь на знаки табуляции.
      Rows[RowNum].Text:=StringReplace(St, #9, #13#10, [rfReplaceAll]);
     End;
   End;
 finally
  //Закрываем файл.
  CloseFile(ff);
 end;
End;
Таким образом теперь LoadGrid() загрузит данные в таблицу, начиная с самой верхней нефиксированной строки. При этом поведение будет гибким - если в таблице уже есть строки, то запись будет происходить без добавления новых строк. Как только окажется, что строк в таблице недостаточно - тогда новая строка будет предварительно добавлена, а затем в неё произойдёт запись.
1
7 / 7 / 7
Регистрация: 27.01.2010
Сообщений: 32
12.02.2010, 12:02  [ТС] 6
Спасибо за полный и разъясненный ответ!
0
12.02.2010, 12:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.02.2010, 12:02
Помогаю со студенческими работами здесь

Сохранение и загрузка из файла
Столкнулся с проблемой загрузки из файла *.ini. для сохранения параметров программы использую...

Сохранение и загрузка файла из ресурсов
Нужна помощь! У меня есть проект с формами(ListBox, TextBox, Button 3х), и мне нужно что бы данные...

Загрузка и сохранение BMP файла
Добрый день! Мне нужно загружать, а затем сохранять BMP файл, пока без обработки, просто...

Сохранение/загрузка xml файла
Привет, нашел вот кодик сохранения/загрузки в/из xml, хочу прикрутить эти функции в отдельный cpp...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru