С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/127: Рейтинг темы: голосов - 127, средняя оценка - 4.61
0 / 0 / 1
Регистрация: 08.11.2008
Сообщений: 86

Сохранение/Загрузка StringGrid'a в файл

02.07.2009, 15:04. Показов 25166. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Помогите пожалуйста переписать дельфийский код в с++.

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
// Save a TStringGrid to a file 
 
procedure SaveStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
 var
   f:    TextFile;
   i, k: Integer;
 begin
   AssignFile(f, FileName);
   Rewrite(f);
   with StringGrid do
   begin
     // Write number of Columns/Rows 
    Writeln(f, ColCount);
     Writeln(f, RowCount);
     // loop through cells 
    for i := 0 to ColCount - 1 do
       for k := 0 to RowCount - 1 do
         Writeln(F, Cells[i, k]);
   end;
   CloseFile(F);
 end;
 
 // Load a TStringGrid from a file 
 
procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
 var
   f:          TextFile;
   iTmp, i, k: Integer;
   strTemp:    String;
 begin
   AssignFile(f, FileName);
   Reset(f);
   with StringGrid do
   begin
     // Get number of columns 
    Readln(f, iTmp);
     ColCount := iTmp;
     // Get number of rows 
    Readln(f, iTmp);
     RowCount := iTmp;
     // loop through cells & fill in values 
    for i := 0 to ColCount - 1 do
       for k := 0 to RowCount - 1 do
       begin
         Readln(f, strTemp);
         Cells[i, k] := strTemp;
       end;
   end;
   CloseFile(f);
 end;
 
 
 // Save StringGrid1 to 'c:\temp.txt': 
 
procedure TForm1.Button1Click(Sender: TObject);
 begin
   SaveStringGrid(StringGrid1, 'c:\temp.txt');
 end;
 
 // Load StringGrid1 from 'c:\temp.txt': 
 
procedure TForm1.Button2Click(Sender: TObject);
 begin
   LoadStringGrid(StringGrid1, 'c:\temp.txt');
 end;
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.07.2009, 15:04
Ответы с готовыми решениями:

Сохранение данных в текстовый файл и их загрузка
В общем не могу загрузить из текстового файла в stringgrid Код сохранения в файл for(int j=1; j<=SConstr+2; j++) ...

StringGrid - загрузка из и сохранение в XML файл
вы говорили что можете помоч с сохранением и загрузкой в XML файл ,,, ну очень нужно завтро прогу сдавать (по нажатию на кнопку...

Сохранение/Загрузка массива в файл тхт
void __fastcall TForm1::Button1Click(TObject *Sender) { i=StrToInt(Edit2->Text); A=StrToInt(Edit1->Text); FILE* store =...

21
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
02.07.2009, 15:24
а вам не подойдут фунции LoadFormFile и SaveToFlie стандартные?
0
0 / 0 / 1
Регистрация: 08.11.2008
Сообщений: 86
02.07.2009, 15:33  [ТС]
а как ими пользоваться? Куда вписывать имя файла и адрес сохранения?
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
02.07.2009, 15:45
почитайте справку по классу TStringGrid:
C++
1
2
virtual void __fastcall LoadFromFile(const AnsiString FileName);
virtual void __fastcall SaveToFile(const AnsiString FileName);
0
0 / 0 / 1
Регистрация: 08.11.2008
Сообщений: 86
02.07.2009, 17:23  [ТС]
у меня справка не открывается почему то(( видимо она не установлена
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
02.07.2009, 17:53
malik, я что-то видимо попутал... но сути это не меняет... при загрузке данных:
1) создаешь TStringList*
2) грузишь туда данные методом LoadFromFile (данные желательно с каким-то разделителем)
3) бьешь строку по разделителям и пишешь

функция разбиения строки на подстроки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void AnalizeAnswer(AnsiString Text, TStringList* Block, char Delimiter)
{
  AnsiString Str = Text, tmp = "";
  while(!Str.IsEmpty()){
    if(!Str.Pos(AnsiString(Delimiter))) break;
    tmp = ((Str.SubString(1, Str.Pos(AnsiString(Delimiter)) - 1)).TrimLeft()).TrimRight();
    Block->Add(tmp);
    Str.Delete(1, Str.Pos(AnsiString(Delimiter)));
  }
  if(!Str.IsEmpty()){
    tmp = ((Str).TrimLeft()).TrimRight();
    Block->Add(tmp);
  }
}
при выгрузке данных:
все аналогично, но отличие в том, что формируешь строки с разделителем конкатенацией, записываешь в TStringList и потом вызываешь SaveToFile...
0
 Аватар для Tree
74 / 74 / 4
Регистрация: 31.05.2009
Сообщений: 243
02.07.2009, 20:55
Лучший ответ Сообщение было отмечено как решение

Решение

StringGrid - это простейшая таблица. У нее принцып сохранения файла очен простой. Перед тем как его сохранять, нужно его переобразовать (эта функция как раз это и делает - DelimitedText). Тогда, перед загрузкой файла, его опять нужно переобразовувать, тогда, StringGrid будет его понимать.

Припустим, что:
C++
1
AnsiString file1 = "с:\\temp.txt" ;       //путь к базе
Теперь создадим (вручную) вспомогательную таблицу:
C++
1
TStringList *Table1 = new TStringList ;
Но только обязательно удалим ее при закрытии проги, потому, что она создает свое место на оперативке:
C++
1
2
3
4
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  delete Table1 ;
}
Далее:
C++
1
2
3
4
5
6
7
8
  Table1->LoadFromFile(file1) ;    // Загружаем нашу вспомогательную табл.
 
  StringGrid1->RowCount = Table1->Count ;            //Задаем колич. строк в StringGrid1 из вспомог. табл.
 
  for(int i = 0 ; i<StringGrid1->RowCount ; i++)                              
    {                                                                                      //  Копируем (построчно) данные с 
      StringGrid1->Rows[i]->DelimitedText = Table1->Strings[i] ;       //  вспомогательной табл. в StringGrid1.
    }                                                                                      //
Далее хочешь, сохраняй при закрытии проги, хочешь - при других действиях.
Сохранение обработанных данных:
C++
1
2
3
4
5
  for(int i = 0 ; i<StringGrid1->RowCount ; i++)                         
    {                                                                                    
      Table1->Strings[i] = StringGrid1->Rows[i]->DelimitedText  ; //присваиваем вспомог. табл. (построчно) обработанные (наверно) данные с StringGrid1   
    }                                                                               
  Table1->SaveToFile(file1) ;   // просто сохраняем.
Кстати, что бы таблица могла редактироваться вручную, включи в Options - goEditing = true

Добавлено через 4 минуты 52 секунды
Думаю этот пример, можно в Faq заложить
6
0 / 0 / 1
Регистрация: 08.11.2008
Сообщений: 86
02.07.2009, 22:07  [ТС]
Я пишу приложение для учета продаж. Там у мя будет что то типа базы проданных товаров, которая будет постоянно дополняться, я все уже сделал, осталось только сохранение доделать. Сохранять буду 2 стринг грида в 1 файл. Каким методом мне это лучше сделать? И как поступать с последующими сохранениями? Дописывать в файл или же полностью перезаписывать в него?
0
 Аватар для Tree
74 / 74 / 4
Регистрация: 31.05.2009
Сообщений: 243
02.07.2009, 23:21
А не проще просто сохранить 2 базы в 2 файла? Зачем по китайськи делать?
0
0 / 0 / 1
Регистрация: 08.11.2008
Сообщений: 86
03.07.2009, 13:46  [ТС]
Можно и в 2 файла, но то что вы мне объясняли я не понял)) какой смысл что то куда то грузить когда можно просто поставить функцию которая будет бегать по строкам и записывать в файл, а потом просто считывать оттуда.

Добавлено через 2 часа 21 минуту 32 секунды
Делаю через SaveFromFile, возникла проблемка, записал стринг грид в файл , а как теперь загрузить с него? я ведь не знаю сколько там было строк.
C++
1
2
3
4
5
6
//начало цикла по i
StringGrid1->Rows[i]->SaveToFile("save.bd");
//конец цикла по i
 
//А тут как считать все строки ? >
StringGrid1->Rows[i]->LoadFromFile("save.bd");
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
03.07.2009, 14:54
зато RowCount и ColCount знают
0
0 / 0 / 1
Регистрация: 08.11.2008
Сообщений: 86
03.07.2009, 15:17  [ТС]
а при загрузке c файла в стринг грид? изначально у меня стринг грид пустой RowCount=1, в него я должен загрузить информацию с файла. Как это сделать?
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
03.07.2009, 15:21
ну если бы почитал, что я тебе писал выше... работай не через сам стринггрид, а через TStringList, тогда у тебя все будет известно заранее, еще до загрузки... да и выгружается инфа из грида мягко говоря не очень
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
03.07.2009, 15:25
malik, а ты не хочешь использовать БД (MS Access, например) для хранения этих данных. Будешь использовать связку ADOTable + DataSource + DBGrid. Если все правильно настроишь, то даже писать практически ничего не надо будет. Да и БД лучше подойдет для твоих целей.
0
0 / 0 / 1
Регистрация: 08.11.2008
Сообщений: 86
03.07.2009, 20:28  [ТС]
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
malik, а ты не хочешь использовать БД (MS Access, например) для хранения этих данных. Будешь использовать связку ADOTable + DataSource + DBGrid. Если все правильно настроишь, то даже писать практически ничего не надо будет. Да и БД лучше подойдет для твоих целей.
Если бы ты объяснил как это сделать то я был бы рад.
0
0 / 0 / 1
Регистрация: 08.11.2008
Сообщений: 86
22.07.2009, 20:15  [ТС]
Цитата Сообщение от Tree Посмотреть сообщение
StringGrid - это простейшая таблица. У нее принцып сохранения файла очен простой. Перед тем как его сохранять, нужно его переобразовать (эта функция как раз это и делает - DelimitedText). Тогда, перед загрузкой файла, его опять нужно переобразовувать, тогда, StringGrid будет его понимать.

Припустим, что:
C++
1
AnsiString file1 = "с:\\temp.txt" ;       //путь к базе
Теперь создадим (вручную) вспомогательную таблицу:
C++
1
TStringList *Table1 = new TStringList ;
Но только обязательно удалим ее при закрытии проги, потому, что она создает свое место на оперативке:
C++
1
2
3
4
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  delete Table1 ;
}
Далее:
C++
1
2
3
4
5
6
7
8
  Table1->LoadFromFile(file1) ;    // Загружаем нашу вспомогательную табл.
 
  StringGrid1->RowCount = Table1->Count ;            //Задаем колич. строк в StringGrid1 из вспомог. табл.
 
  for(int i = 0 ; i<StringGrid1->RowCount ; i++)                              
    {                                                                                      //  Копируем (построчно) данные с 
      StringGrid1->Rows[i]->DelimitedText = Table1->Strings[i] ;       //  вспомогательной табл. в StringGrid1.
    }                                                                                      //
Далее хочешь, сохраняй при закрытии проги, хочешь - при других действиях.
Сохранение обработанных данных:
C++
1
2
3
4
5
  for(int i = 0 ; i<StringGrid1->RowCount ; i++)                         
    {                                                                                    
      Table1->Strings[i] = StringGrid1->Rows[i]->DelimitedText  ; //присваиваем вспомог. табл. (построчно) обработанные (наверно) данные с StringGrid1   
    }                                                                               
  Table1->SaveToFile(file1) ;   // просто сохраняем.
Кстати, что бы таблица могла редактироваться вручную, включи в Options - goEditing = true

Добавлено через 4 минуты 52 секунды
Думаю этот пример, можно в Faq заложить

С сохранением то понятно, а можете написать как считать с файла это обратно?)
0
 Аватар для Tree
74 / 74 / 4
Регистрация: 31.05.2009
Сообщений: 243
23.07.2009, 03:09
Если я тебя правильно понял, то:
---------------------------------------
Смотри у тебя стоит компонент StringGrid. Что бы он понял твои данные при загрузке, нужна ф-ция DelimitedText.

Вот пример только загрузки файла (я его выше указал):
C++
1
2
3
4
5
6
7
8
  Table1->LoadFromFile(file1) ;    // Загружаем нашу вспомогательную табл.
 
  StringGrid1->RowCount = Table1->Count ;            //Задаем колич. строк в StringGrid1 из вспомог. табл.
 
  for(int i = 0 ; i<StringGrid1->RowCount ; i++)                              
    {                                                                                      //  Копируем (построчно) данные с 
      StringGrid1->Rows[i]->DelimitedText = Table1->Strings[i] ;       //  вспомогательной табл. в StringGrid1.
    }
---------------------------------------
P.S. В том примере, что выше все подробно описано и прокомментировано.
0
0 / 0 / 1
Регистрация: 08.11.2008
Сообщений: 86
23.07.2009, 18:56  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void __fastcall TForm3::Button3Click(TObject *Sender)
{
AnsiString file1 = "temp.txt";
    TStringList *Table1 = new TStringList ;
 
      for(int i = 0 ; i<StringGrid1->RowCount ; i++)
    {
      Table1->Strings[i] = StringGrid1->Rows[i]->DelimitedText  ; //присваиваем вспомог. табл. (построчно) обработанные (наверно) данные с StringGrid1
    }
  Table1->SaveToFile(file1) ;   // просто сохраняем.
  delete Table1 ;
 
 
Form1->ComboBox1->Items->Clear();
for(int i=0;i<Form3->StringGrid1->RowCount;i++){
Form1->ComboBox1->Items->Add(Form3->StringGrid1->Cells[0][i]); }
 
 
Close();
}
при нажатии на кнопку выдает ошибку: на прикрепленной картинке
Миниатюры
Сохранение/Загрузка StringGrid'a в  файл  
0
 Аватар для Tree
74 / 74 / 4
Регистрация: 31.05.2009
Сообщений: 243
24.07.2009, 14:30
Да, думал я долго... Потом дошло)))
Смотри, ты добавить в стринг риде строку то добавил:
C++
1
2
3
4
5
6
  StringGrid1->Cells[0][tek_pos]=Edit1->Text;
  tek_pos++;
  if(tek_pos>StringGrid1->RowCount)
   {
      StringGrid1->RowCount++;
   }
А кода ты сохраняешь через вспомогательную таблицу свою базу:

C++
1
2
3
4
5
  for(int i = 0 ; i<StringGrid1->RowCount ; i++)
    {
      Table1->Strings[i] = StringGrid1->Rows[i]->DelimitedText  ;
    }
  Table1->SaveToFile(file1) ;
то в ней (в вспомог. табл.) нету тех строк, которые появились в стринг риде.
Помнишь при загрузки базы мы присваивали кол. строк из вспомог. табл в стринг рид?
Вот также нужно и при сохранении, только наоборот.
Но! Тут таки опять трабл, так сделать почему-то нельзя:

C++
1
Table1->Count = StringGrid1->RowCount  ;
Поэтому просто когда будешь добавлять строки в стринг риде, то тогда добавляй и в вспомог. табл., но, там нужно добавлять их так:

C++
1
2
3
4
5
6
7
8
  StringGrid1->Cells[0][tek_pos]=Edit1->Text;
  tek_pos++;
 
  if(tek_pos>StringGrid1->RowCount)
   {
      StringGrid1->RowCount++;
      Table1->Append("\n");  // Вот оно, добавление строки в вспомог. табл.
   }
А вот тебе плоды моего старания:
Вложения
Тип файла: rar База.rar (407.2 Кб, 245 просмотров)
0
AkinoRed
22.10.2009, 22:48
Цитата Сообщение от Tree Посмотреть сообщение
C++
1
  Table1->LoadFromFile(file1) ;    // Загружаем нашу вспомогательную табл.
Думаю этот пример, можно в Faq заложить
к слову о корректности содержимого..
строка выше не работает. ругается. error declaration
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.10.2009, 22:48
Помогаю со студенческими работами здесь

Сохранение и Загрузка объектов класса через файл
Имеется иерархия классов с множественным наследованием. Множество объектов классов хранятся в векторах. Как правильно объекты сохранить в...

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

Сохранение из StringGrid массива в файл и загрузка из файла в StringGrid
Всем доброго времени суток =) У меня есть загрузка массива из StringGrid на Delphi 2010: //загрузка из файла procedure...

Сохранение положения компонента на форме (Сохранение параметра в Ini-файл)
Не знаю верно ли назвал тему. Доброго вечера тебе, всяк сюда входящий. Подскажите пожалуйста с вопросом: Имеется Form1, на нем...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru