0 / 0 / 0
Регистрация: 27.11.2015
Сообщений: 75
1

Ошибка при сохранении StringGrid в txt файл

01.04.2016, 15:32. Показов 1062. Ответов 10
Метки нет (Все метки)

Точно не понял как записать значения с StringGrid в txt файл,но нашёл этот способ. Программа запускается,но выдаёт следующее:
Cannot create file 'Путь к файлу\Win32\Debug\report.txt' Процесс не может получить доступ к файлу,так как этот файл занят другим процессом.
Вроде как я не использую этот файл,но все равно выдаёт ошибку. Укажите на мою ошибку в коде. Мне не удалось 100% разобраться в записи таблицы в txt файл. Будет ли вообще производиться запись?
Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TForm1.Button2Click(Sender: TObject);
begin
AssignFile(F,'report.txt');
Rewrite(F,'report.txt');
for I := 1 to kr do
 
Stringgrid1.Rows[i].Savetofile('report.txt');
 
 
CloseFile(f);
end;
Заранее спасибо
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.04.2016, 15:32
Ответы с готовыми решениями:

Ошибка при сохранении данных из StringGrid в Excel
Добрый день! Возникает проблема при попытке сохранения данных из StringGrid в формате Excel ...

При сохранении данных таблицы StringGrid в Excel появляется ошибка
При сохранении данных таблицы StringGrid в Excel появляется ошибка. Код пишу в обработчике кнопки...

Ошибка при сохранении в файл
доброго времени суток, помогите пожалуйста отладить код procedure TForm1.Button2Click(Sender:...

Открыть txt-файл при его формировании в матлаб и сохранении вне матлаб
С помощью операторов fopen, fprintf и fclose в файл "Press.txt" записана текстовая информация : ...

10
Native x86
Эксперт Hardware
4772 / 2698 / 789
Регистрация: 13.02.2013
Сообщений: 8,775
01.04.2016, 15:35 2
Не нужно никаких AssignFile и Rewrite.
Но имейте в виду, что Stringgrid1.Rows[i].Savetofile сохраняет одну строку. Делая это несколько раз в цикле вы будете каждый раз перезаписывать файл с нуля, в результате чего в конце останется только результат последнего сохранения (последняя строка).
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31152 / 20360 / 7929
Регистрация: 22.10.2011
Сообщений: 35,292
Записей в блоге: 6
01.04.2016, 15:37 3
Цитата Сообщение от Just Trying Посмотреть сообщение
Вроде как я не использую этот файл
Ну ты же его сам открыл, не закрыл, и теперь говоришь, что не используешь. Создай еще один TStringList, в который занеси все данные из Rows[i], и его уже пиши в файл. А про AssignFile/Rewrite/CloseFile забудь, это никому не нужно сегодня.
1
northener
01.04.2016, 15:45
  #4

Не по теме:

Цитата Сообщение от volvo Посмотреть сообщение
А про AssignFile/Rewrite/CloseFile забудь, это никому не нужно сегодня.
Мне нужно. И именно сегодня! :)

0
0 / 0 / 0
Регистрация: 27.11.2015
Сообщений: 75
01.04.2016, 17:01  [ТС] 5
Не работал еще с TStringList. Попробую, спасибо. Скорее всего придется отписаться

Добавлено через 8 минут
Да, заметил, что только последняя сохраняется только,но по-началу подумал, что дело в Begin. Где то не написал. То есть, по другому её не заставишь записывать? Как вариант использовать пример ниже через TStringList? Или есть ещё какие то варианты?
0
2281 / 1395 / 481
Регистрация: 29.05.2013
Сообщений: 6,112
01.04.2016, 21:06 6
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
procedure TForm13.Button1Click(Sender: TObject);
Var
  SL: TStringList;
  i: Integer;
begin
 SL := TStringList.Create;
 for i := 0 to StringGrid1.RowCount - 1
 do SL.AddStrings(StringGrid1.Rows[i]);
 SL.SaveToFile('H:\5\test.txt');
 SL.Free;
end;
 
 
procedure TForm13.Button2Click(Sender: TObject);
Var
  SL: TStringList;
  i,j: Integer;
begin
 SL := TStringList.Create;
 SL.LoadFromFile('H:\5\test.txt');
 for i := 0 to StringGrid1.RowCount - 1
 do for j := 0 to StringGrid1.ColCount - 1
    do StringGrid1.Cells[j,i] := SL.Strings[i*StringGrid1.ColCount+j];
 SL.Free;
end;
2
2509 / 1130 / 582
Регистрация: 07.06.2014
Сообщений: 3,281
01.04.2016, 22:38 7
Цитата Сообщение от Пытливый Посмотреть сообщение
SL.LoadFromFile('H:\5\test.txt');
*for i := 0 to StringGrid1.RowCount - 1
*do for j := 0 to StringGrid1.ColCount - 1
я бы размеры грида туда же в файл записал, иначе, при чтении, непонятки возникают, какого же размера должен быть грид.

ну, типа, так сделал:

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
procedure TForm13.Button1Click(Sender: TObject);
Var
  SL: TStringList;
  i: Integer;
begin
 SL := TStringList.Create;
 SL.Append(IntToStr(StringGrid1.RowCount));
 SL.Append(IntToStr(StringGrid1.ColCount));
 for i := 0 to StringGrid1.RowCount - 1 do 
     SL.AddStrings(StringGrid1.Rows[i]);
 SL.SaveToFile('H:\5\test.txt');
 SL.Free;
end;
 
 
procedure TForm13.Button2Click(Sender: TObject);
Var
  SL: TStringList;
  i,j: Integer;
begin
 SL := TStringList.Create;
 SL.LoadFromFile('H:\5\test.txt');
 if SL.Count < 2 then Exit;
 StringGrid1.RowCount := StrToInt(SL.Strings[0]);
 StringGrid1.ColCount := StrToInt(SL.Strings[1]);
 
 for i := 0 to StringGrid1.RowCount - 1 do 
    for j := 0 to StringGrid1.ColCount - 1do 
         StringGrid1.Cells[j,i] := SL.Strings[i*StringGrid1.ColCount+j+2];
 SL.Free;
end;
ну и если в ячейках грида будут переводы строк (многострочный текст), такое сохранение/чтение тоже работать не будет.
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31152 / 20360 / 7929
Регистрация: 22.10.2011
Сообщений: 35,292
Записей в блоге: 6
01.04.2016, 23:07 8
Лучший ответ Сообщение было отмечено Sergio Leone как решение

Решение

Цитата Сообщение от Sergio Leone Посмотреть сообщение
ну и если в ячейках грида будут переводы строк (многострочный текст), такое сохранение/чтение тоже работать не будет
Зато вот такое будет:
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
procedure TForm1.Button1Click(Sender: TObject); // save
Var
  SL: TStringList;
  i: Integer;
begin
  SL := TStringList.Create;
  SL.StrictDelimiter := true;
  SL.Delimiter := #0;
  SL.Append(IntToStr(StringGrid1.RowCount));
  SL.Append(IntToStr(StringGrid1.ColCount));
  for i := 0 to StringGrid1.RowCount - 1 do
    SL.Add(StringReplace(StringGrid1.Rows[i].CommaText, sLineBreak, '<br>', [rfReplaceAll]));
  SL.SaveToFile('D:\test_grd.txt');
  SL.Free;
end;
 
procedure TForm1.Button2Click(Sender: TObject); // Load
Var
  SL: TStringList;
  i: Integer;
begin
  SL := TStringList.Create;
  SL.StrictDelimiter := true;
  SL.Delimiter := #0;
  SL.LoadFromFile('D:\test_grd.txt');
  if SL.Count < 2 then Exit;
  StringGrid1.RowCount := StrToInt(SL[0]);
  StringGrid1.ColCount := StrToInt(SL[1]);
 
  for i := 0 to StringGrid1.RowCount - 1 do
    StringGrid1.Rows[i].CommaText := StringReplace(SL[i + 2], '<br>', sLineBreak, [rfReplaceAll]);
  SL.Free;
end;
1
2509 / 1130 / 582
Регистрация: 07.06.2014
Сообщений: 3,281
01.04.2016, 23:10 9
Цитата Сообщение от volvo Посмотреть сообщение
Зато вот такое будет:
согласен. красиво!
0
0 / 0 / 0
Регистрация: 27.11.2015
Сообщений: 75
03.04.2016, 10:50  [ТС] 10
Спасибо Вам и остальным за помощь!

Добавлено через 22 часа 24 минуты
А можете по конкретней объяснить эту часть,а точнее что в конце в []?
Delphi
1
StringGrid1.Cells[j,i] := SL.Strings[i*StringGrid1.ColCount+j+2];
Можно ли указать, чтобы в каждую ячейку, по мере заполнения строк, добавлялось значение с каждой новой строки в файле? ВСё это сделать через for, к примеру:
Delphi
1
2
3
for j:=1 to 4 do
for i:=1 to 5 do 
StringGrid1.Cells[j,i]:=SL.Strings[а тут как указать чтобы читалась новая строчка из файла не знаю]
0
2281 / 1395 / 481
Регистрация: 29.05.2013
Сообщений: 6,112
03.04.2016, 13:43 11
У грида 2 размерности - строки,столбцы а вот у стринга только одна размерность - строки, вот эта формула и позволяет преобразовать одномерные координаты в двумерные.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.04.2016, 13:43

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Ошибка при сохранении в типизированный файл
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics,...

Ошибка "Неизвестное имя" при сохранении данных таблицы StringGrid в Excel
При попытке сохранения данных таблицы StringGrid в Excel , появляется сообщение об ошибке - ...

Ошибка при сохранении dataGridView в Excel файл.
Хочу сохранить датугридвью в эксель файл. Выдает следующую ошибку. Может я забыл подгрузить...

При сохранении в файл формата xlsx выпадает сообщение о сохранении шаблона
Такая дурацкая штука получается при сохранении в файл формата xlsx - выпадает сообщение о...

Ошибка при сохранении активного листа в файл с заменой символов
Уважаемые форумчане, очень нужна помощь Необходимо сохранить активный лист excel в отдельный...

В GDI+ произошла ошибка общего вида при сохранении изображений из picturebox'a в файл
Опять не получается. Что посоветуете? Как все таки сделать сохранение изображений из picturebox'a в...


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

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

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