Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.68/34: Рейтинг темы: голосов - 34, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 03.02.2010
Сообщений: 9
1

Сохранение и открытие файла

12.02.2010, 16:29. Просмотров 6849. Ответов 11
Метки нет (Все метки)

Нужно организовать сохранение данных (элементы StringGrid) в файл, а также открытие (и соответственно заполнение этого самого StringGrid)
Элементы формы: Button и StringGrid:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.Button1Click(Sender: TObject);
var sd:TSaveDialog;
f:textfile;
i:integer;
begin
sd:=SaveDialog1;
if not sd.execute then exit;
assignfile(f, sd.FileName);
rewrite(f);
for i:=0 to (StringGrid1.ColCount-1) do begin
  b:=StrToInt(StringGrid1.Cells[i,0]);
  write(f, b);
end;
 
end;
Поможет кто привести в рабочий вид?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.02.2010, 16:29
Ответы с готовыми решениями:

Написать текстовый редактор, в котором продемонстрировать открытие файла, сохранение файла, создание нового файла
№ 5. Написать текстовый редактор, в котором продемонстрировать открытие файла, сохранение файла,...

Сохранение и открытие
Еще большие проблемы с открытием и сохранением...есть какой нить пример программы с этими...

Открытие и сохранение картинок
Когда открываю картинку в написанной программе а потом ее сохраняю, программа не открывает...

Сохранение и открытие матрицы
У меня есть 2 процедуры, одна на сохранение, другая на открытие, через save и opendialog...

11
13036 / 5822 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
12.02.2010, 17:17 2
Делается это так:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
//Очищает таблицу.
//Т. е. очищает все нефиксированные строки, затем удаляет их,
//кроме одной. - Одна нефиксированная строка должна всегда оставаться для
//правильного функционирования таблицы.
procedure ClearGrig(aSg : TStringGrid);
var
  i : Integer;
begin
  //Очистка строк. Этот шаг необходим из-за "плавающего" бага
  //компонента TStringGrid. - Строки, удалённые через уменьшение значения
  //TStringGrid.RowCount на самом деле не всегда удаляются. - TStringGrid
  //их прячет и при последующем увеличении TStringGrid.RowCount в таблице опять
  //могут появиться ранее "удалённые" строки. Именно поэтому необходима очистка
  //перед удалением.
  for i := aSg.FixedRows to aSg.RowCount - 1 do begin
    aSg.Rows[i].Clear;
  end;
  //Удаление строк.
  aSg.RowCount := aSg.FixedRows + 1;
end;
 
//Сохраняет данные из нефиксированной части таблицы в файл.
procedure SaveData(aSg : TStringGrid; const aFileName : String);
var
  //Файловая переменная.
  F : TextFile;
  //Индексы строк и толбцов таблицы.
  i, j : Integer;
begin
  //Связываем файловую переменную с именем файла.
  AssignFile(F, aFileName);
  //Открываем (перезаписываем) файл в режиме "только запись".
  Rewrite(F);
 
  //Записываем количество нефиксированных строк.
  Writeln(F, aSg.RowCount - aSg.FixedRows);
  //Записываем количество нефиксированных столбцов.
  Writeln(F, aSg.ColCount - aSg.FixedCols);
  //Записываем данные из нефиксированной части таблицы в файл.
  for i := aSg.FixedRows to aSg.RowCount - 1 do begin
    for j := aSg.FixedCols to aSg.ColCount - 1 do begin
      Writeln(F, aSg.Cells[j, i]);
    end;
  end;
 
  //Закрываем файл.
  CloseFile(F);
end;
 
//Загружает данные из файла в таблицу.
//Количество нефиксированных столбцов таблицы должно быть не меньше чем количество,
//заложенное в файле.
//Количество строк - не имеет значения - недостающие строки будут автоматически добавлены.
procedure LoadData(aSg : TStringGrid; const aFileName : String);
var
  //Файловая переменная.
  F : TextFile;
  //Индексы строк и столбцов таблицы.
  i, j : Integer;
  //Количество строк и столбцов, записанных в таблицу.
  RowCnt, ColCnt : Integer;
  //Строка для промежуточных действий.
  StrTmp : String;
begin
  //Связываем файловую переменную с именем файла.
  AssignFile(F, aFileName);
  //Открываем файл в режиме "только чтение".
  Reset(F);
 
  //Читаем сведения о размерах нефиксированной части таблицы.
  //Количество строк.
  Readln(F, RowCnt);
  //Количество столбцов.
  Readln(F, ColCnt);
 
  //Если количество нефиксированных столбцов в таблице aSg меньше, чем
  //в файле - генерируем исключение.
  if (aSg.ColCount - aSg.FixedCols) < ColCnt then begin
    //Закрываем файл.
    CloseFile(F);
    //Генерируем исключение.
    raise Exception.Create('Количество нефиксированных столбцов в таблице меньше, чем в файле. Действие прервано.');
  end;
 
  //Читаем данные из файла и записываем их в таблицу.
  for i := aSg.FixedRows to aSg.FixedRows + RowCnt - 1 do begin
    //Если количества строк в таблице не хватает - тогда добавляем строку.
    if i = aSg.RowCount then begin
      aSg.RowCount := aSg.RowCount + 1;
    end;
    //Записываем в ячейки очередной строки данные из файла.
    for j := aSg.FixedCols to aSg.FixedCols + ColCnt - 1 do begin
      //Читаем очередное значение из файла.
      Readln(F, StrTmp);
      //Записываем прочитанное значение в очередную ячейку.
      aSg.Cells[j, i] := StrTmp;
    end;
  end;
 
  //Закрываем файл.
  CloseFile(F);
end;
 
//Кнопка: "Сохранить данные таблицы в файл".
procedure TForm1.Button1Click(Sender: TObject);
begin
  SaveData(StringGrid1, 'data.txt');
end;
 
//Кнопка: "Загрузить данные из файла в таблицу".
procedure TForm1.Button2Click(Sender: TObject);
begin
  LoadData(StringGrid1, 'data.txt');
end;
 
//Кнопка: "Очистить нефиксированную область в таблице".
procedure TForm1.Button3Click(Sender: TObject);
begin
  ClearGrig(StringGrid1);
end;
1
7 / 7 / 7
Регистрация: 27.01.2010
Сообщений: 32
12.02.2010, 17:53 3
Посмотри мою тему... мне там все подробно обьяснили

Сохранение и загрузка в файла
0
13036 / 5822 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
12.02.2010, 18:28 4
А, нуда, выходит, что я уже 2 раза в разных местах ответил.
0
0 / 0 / 0
Регистрация: 03.02.2010
Сообщений: 9
12.02.2010, 20:18  [ТС] 5
спасибо конечно за старания, но мне желательно бы отладить именно мой код) так как нужно использовать компонент SaveDialog/OpenDialog

Забыл добавить - Массив в одну строку, то есть rowcount=1, и никаких фиксированных столбцов/строк нету, они убраны в свойствах StringGrid.
0
Добрый самаритянин
1105 / 620 / 139
Регистрация: 31.03.2009
Сообщений: 2,568
12.02.2010, 20:24 6
f:textfile; попробуй f:file of integer;
0
13036 / 5822 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
12.02.2010, 21:03 7
Если текстовый файл предполагается использовать, тогда так:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
//Кнопка: "Сохранить данные таблицы в файл".
procedure TForm1.Button1Click(Sender: TObject);
var
  //Файловая переменная.
  F : TextFile;
  //Индекс столбцов таблицы.
  j : Integer;
begin
  //Начальной папкой для диалога сохранения файла делаем ту,
  //в которой расположено наше приложение.
  if SaveDialog1.InitialDir = '' then begin
    SaveDialog1.InitialDir := ExtractFilePath(Application.ExeName);
  end;
  //Запускаем диалог сохранения файла.
  if not SaveDialog1.Execute then Exit;
  //Связываем файловую переменную с именем файла.
  AssignFile(F, SaveDialog1.FileName);
  //Открываем (создаём/пересоздаём) файл в режиме "только запись".
  Rewrite(F);
  //Записываем последовательно значения из ячеек первой (с индексом = 0) строки в файл.
  for j := 0 to StringGrid1.ColCount - 1 do begin
    Writeln(F, StringGrid1.Cells[j, 0]);
  end;
  //Закрываем файл.
  CloseFile(F);
end;
 
//Кнопка: "Загрузить данные из файла в таблицу".
procedure TForm1.Button2Click(Sender: TObject);
var
  //Файловая переменная.
  F : TextFile;
  //Индекс столбцов таблицы.
  j : Integer;
  //Строка для промежуточных действий.
  StrTmp : String;
begin
  //Начальной папкой для диалога открытия файла делаем ту,
  //в которой расположено наше приложение.
  if OpenDialog1.InitialDir = '' then begin
    OpenDialog1.InitialDir := ExtractFilePath(Application.ExeName);
  end;
  //Запускаем диалог сохранения файла.
  if not OpenDialog1.Execute then Exit;
  //Связываем файловую переменную с именем файла.
  AssignFile(F, OpenDialog1.FileName);
  //Открываем файл в режиме "только чтение".
  Reset(F);
  //Читем построчно данные из файла и записываем их последовательно в ячейки
  //первой (с индексом = 0) строки таблицы.
  j := 0;
  while not Eof(F) do begin
    //Читаем данные из очередной строки файла.
    Readln(F, StrTmp);
    //Если в таблице недостаточно столбцов, тогда добавляем столбец.
    if j = StringGrid1.ColCount then begin
      StringGrid1.ColCount := StringGrid1.ColCount + 1;
    end;
    //Записываем прочитанные из файла данные в очередную ячейку.
    StringGrid1.Cells[j, 0] := StrTmp;
    //Переходим к следующему столбцу.
    Inc(j);
  end;
 
  //Закрываем файл.
  CloseFile(F);
end;
Josch, если в задании есть условие - что использовать типизированный файл (типа Integer) - скажи, могу переделать на типизированный.
---
Вот в случае, если надо использовать типизированный файл (типа Integer):
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//Кнопка: "Сохранить данные таблицы в файл".
procedure TForm1.Button3Click(Sender: TObject);
var
  //Файловая переменная.
  F : File of Integer;
  //Индекс столбцов таблицы.
  j : Integer;
  //Целочисленная переменная для промежуточных вычислений.
  IntTmp : Integer;
begin
  //Начальной папкой для диалога сохранения файла делаем ту,
  //в которой расположено наше приложение.
  if SaveDialog1.InitialDir = '' then begin
    SaveDialog1.InitialDir := ExtractFilePath(Application.ExeName);
  end;
  //Запускаем диалог сохранения файла.
  if not SaveDialog1.Execute then Exit;
  //Связываем файловую переменную с именем файла.
  AssignFile(F, SaveDialog1.FileName);
  //Открываем (создаём/пересоздаём) файл в режиме "только запись".
  Rewrite(F);
  //Записываем последовательно значения из ячеек первой (с индексом = 0) строки в файл.
  for j := 0 to StringGrid1.ColCount - 1 do begin
    IntTmp := StrToInt(StringGrid1.Cells[j, 0]);
    Write(F, IntTmp);
  end;
  //Закрываем файл.
  CloseFile(F);
end;
 
//Кнопка: "Загрузить данные из файла в таблицу".
procedure TForm1.Button4Click(Sender: TObject);
var
  //Файловая переменная.
  F : File of Integer;
  //Индекс столбцов таблицы.
  j : Integer;
  //Целочисленная переменная для промежуточных действий.
  IntTmp : Integer;
begin
  //Начальной папкой для диалога сохранения файла делаем ту,
  //в которой расположено наше приложение.
  if OpenDialog1.InitialDir = '' then begin
    OpenDialog1.InitialDir := ExtractFilePath(Application.ExeName);
  end;
  //Запускаем диалог сохранения файла.
  if not OpenDialog1.Execute then Exit;
  //Связываем файловую переменную с именем файла.
  AssignFile(F, OpenDialog1.FileName);
  //Открываем файл в режиме "только чтение".
  Reset(F);
  //Читем построчно данные из файла и записываем их последовательно в ячейки
  //первой (с индексом = 0) строки таблицы.
  j := 0;
  while not Eof(F) do begin
    //Читаем данные из очередной строки файла.
    Read(F, IntTmp);
    //Если в таблице недостаточно столбцов, тогда добавляем столбец.
    if j = StringGrid1.ColCount then begin
      StringGrid1.ColCount := StringGrid1.ColCount + 1;
    end;
    //Записываем прочитанные из файла данные в очередную ячейку.
    StringGrid1.Cells[j, 0] := IntToStr(IntTmp);
    //Переходим к следующему столбцу.
    Inc(j);
  end;
 
  //Закрываем файл.
  CloseFile(F);
end;
Но удобнее использовать текстовый файл - потому что значения ячеек таблицы всё равно являются строками. Поэтому нет смысла дважды выполнять преобразования StrToInt() - IntToStr() - сначала при записи в файл, затем при чтении из файла.
2
0 / 0 / 0
Регистрация: 03.10.2013
Сообщений: 13
14.10.2013, 22:41 8
Что делать, если с твоим кодом в текстовый файл залетает только первая строчка?
0
13036 / 5822 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
15.10.2013, 00:47 9
Цитата Сообщение от Pavel_34 Посмотреть сообщение
Что делать, если с твоим кодом в текстовый файл залетает только первая строчка?
А этот код изначально был предназначен, как раз, для записи/чтения только первой строки. Можно доделать для записи/чтения всей таблицы.
0
0 / 0 / 0
Регистрация: 03.10.2013
Сообщений: 13
15.10.2013, 15:30 10
Цитата Сообщение от Mawrat Посмотреть сообщение
А этот код изначально был предназначен, как раз, для записи/чтения только первой строки. Можно доделать для записи/чтения всей таблицы.
А можешь? Мне оч надо)
0
0 / 0 / 0
Регистрация: 03.10.2013
Сообщений: 13
17.10.2013, 02:16 11
Mawrat Так ты напишешь? Мне просто ЭТО надо в курсач впихнуть
0
0 / 0 / 0
Регистрация: 03.10.2013
Сообщений: 13
21.10.2013, 21:11 12
Плиз, подкоректируй для всей таблицы
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.10.2013, 21:11

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

ListBox сохранение и открытие
Очень нужна помощь)))Необходимо создать ListBox с битмапом или на худой конец с какими-нибудь...

StringGrid Сохранение и открытие
Помогите пожалуйста пытаюсь сохранить стрингрид в текстовый файл procedure...

Treeview корректное сохранение и открытие
Добрый вечер великим умам!! Помогите еще раз бедному тупому ( Есть дерево два едита и две кнопки...

Сохранение и открытие с выбором места
Всем добрый день! Написал я прогу, она сохраняет и открывает файл с заданным именем. Как сделать...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.