Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > как сохранить в файле содержимое StringGrid


Автор: Взюх 17.6.2006, 19:29
у меня есть компонент StringGrid (типа моя база данных) и ее содержимое при нажатии на кнопку сэйв надо сохранить в файле что б  потом при нажатии на кнопку оупэн она открылась, вопрос, КАК сохранить содержимое а потом открыть?
 
 

Автор: Partizan 18.6.2006, 09:11
=))) Придумать формат хранения данных, согласно этому формату запихивать данные в файл, и на основе него же извлекать их из файла...
самое грубое - это хранение матрицы значений в txt файле.... 

Автор: W0LF 18.6.2006, 20:12
Дело в том, Partizan, что он, скорее всего, не то спросил. Ему все-равно где и как хранить, главное, как взять и занести значения в файл smile 
Я так понял, что "самое грубое " хранение тебя устроит,  Взюх.
Самый глупый и быстрый(в смысле написания кода) вариант :
Пройтись по всем ячейкам Stringrid'a(StringGrid->Cells[i][j]) и занести их в Memo, добавляя между ними пробелы, ток заноси с переходом на новую строку.
Потом просто и тупо сохранить все в Memo:
Используем OpenDiaolog:
Код

if (SaveDialog->Execute){
  Memo->Lines->SaveToFile(Savedialog.FileName);
}

Когда захочешь все это открыть, то так:
Код

if (OpenDialog->Execute){
  Memo->Lines->LoadFromFile(Opendialog.FileName);
}

Теперь обратный процесс - из Memo занести все в StringGrid:
Для начала все разобъем на слова,
http://forum.vingrad.ru/index.php?showtopic=100820&view=findpost&p=766706
Но если неохота разбираться с тем, как это занести еще и в StringGrid напиши мне, а я скину тебе. Просто два раза постить одно и то же, ну сам понимаешь...
На моем пне 1.7ghz с 512mb ddr конечный результат при появлении инфы в СтрингГриде(размерность его 6x6864) проходит за 2-3 секунды... То есть сравнительно не долго smile Если же надо быстрее - используй BDE. 
    

Автор: Взюх 19.6.2006, 06:58
ХЫ! =) спасибо! =) но я вчера уже разобрался =)

void __fastcall TForm1::SaveAsClick(TObject *Sender)
{
   

     if(SaveDialog1->Execute())
        {
          fout.open(SaveDialog1->FileName.c_str());


            for(int i=1;i<StringGrid1->RowCount;i++)

             {
                   for(int j=0;j<2;j++)
                {

                        {
                         fout<<StringGrid1->Cells[j][i].c_str(); 
                         fout<<"#";
                        }

                }
                fout<<";";
             }

        }
}



Вотб терь пытаюсь загрузить из этого документа обратно в СтрингГрид  smile

Добавлено @ 07:02 
W0LF, а ты сам-то пробовал свой код? слишком короткий и гладкий чтоб работал. 

Автор: tramp 19.6.2006, 07:16
Я делаю так, разделитель табуляция. Файл текстовый, хотя можно файлу дать расширение xls. И он автоматом будет открываться в Excel. Обратное чтение  лушче побайто. 

#include <stdio.h>

int __fastcall TForm1::save_grid(TStringGrid *sGrid, char *fname)
 {
 FILE *out;
 int i,j;
 if((out=fopen(fname,"w+t"))==NULL)return -1;
for (j=0;j<sGrid->RowCount;j++)
{
for (i=0;i<sGrid->ColCount;i++)
    {
    fprintf(out,"%s",sGrid->Cells[i][j].c_str());
    if(i!=sGrid->ColCount-1)fprintf(out,"\t");
    }
    fprintf(out,"\r");
 }
 fclose(out);
 return 0;
}


Код

int open_grid(char *fname)
 {
 FILE *in;
 int i=0,j,NC=0,NV=0;
 char b;
 double temp;
 unsigned int a;
 if((in=fopen(fname,"rb"))==NULL)return -1;
for(i=0;i<Form1->StringGrid1->ColCount;i++)
   Form1->StringGrid1->Cols[i]->Clear();
 i=0;
 Form1->StringGrid1->RowCount=2;
 Form1->StringGrid1->ColCount=2;
//Читаем размеры таблицы
 fseek(in,0l,0l);
 while(a!=EOF)
   {
   a=fgetc(in);
   if(a==0x09){NV++;continue;}
   if(a==0x0D){NC++;i=NV;NV=0;continue;}
   if(a==0x0A){continue;}
   b=a;
   Form1->StringGrid1->Cells[NV][NC]=Form1->StringGrid1->Cells[NV][NC]+b;
   }
 i++;
 fclose(in);
//Заполняем таблицу

 Form1->StringGrid1->Cells[0][0]=IntToStr(i-1)+" х "+IntToStr(NC-1);
 Form1->StringGrid1->RowCount=NC;
 Form1->StringGrid1->ColCount=i;
 for (i=1;i<Form1->StringGrid1->RowCount;i++)
 for (j=1;j<Form1->StringGrid1->ColCount;j++)
   {
   try
    {
    temp=StrToFloat(Form1->StringGrid1->Cells[j][i]);
    Form1->StringGrid1->Cells[j][i]=FloatToStrF(temp,ffFixed,9,3);
    }
    catch (EConvertError &e)
    {
    Form1->StringGrid1->Cells[j][i]="";
    }
    }
 return 0;
 }

 

Автор: Взюх 19.6.2006, 07:35
tramp, это код для чтения из файла с расширением xls? 

Автор: tramp 19.6.2006, 07:47
2Взюх
Это код для чтения текстового файла, имеющего любое расширение, с разделителями табуляции.
 
ЗЫ: Вторая часть кода (там где заполнение) - проверка на корректность. Мне были нужны только цифры. 

Автор: Взюх 19.6.2006, 08:34
Я пытаюсь написать код который читаем посимвольно строку их тхт файла и проверяет если символ равен ; или  #, хы, но тут проблема: 


ofstream fout;  
ifstream fin;

На сколько я знаю поток   fout<<StringGrid1->Cells[j][i].c_str();

Записывает содержимое ячейки в файл, для считывания содержимого файла я так понял мне надо использовать поток  fin>>

Но я не знаю как он работает =(  (в том смысле что, не знаю как с ним работать )
 

Автор: W0LF 19.6.2006, 10:15
 Взюх, мой код я тебе дал с моей программы, которую писал 2 года назад. Там все работает.
Насчет fin не знаю. Я с ним в билдере не работал smile
 

Автор: ZIlya 19.6.2006, 13:27
самый простой(но не лучший) способ по моему

сохранение
Код

TStringList *tsl=new TStringList;
tsl->Add(IntToStr(StringGrid1->RowCount));
tsl->Add(IntToStr(StringGrid1->ColCount));
for(int i=0;i<StringGrid1->RowCount;i++)
        {
        tsl->AddStrings(StringGrid1->Rows[i]);
        }
tsl->SaveToFile("c:\\11111111111111.txt");
delete tsl;


загрузка
Код

TStringList *tsl=new TStringList;
tsl->LoadFromFile("c:\\11111111111111.txt");
StringGrid1->RowCount=StrToInt(tsl->Strings[0]);
StringGrid1->ColCount=StrToInt(tsl->Strings[1]);
int k=2;
for(int i=0;i<StringGrid1->RowCount;i++)
        {
        for(int j=0;j<StringGrid1->ColCount;j++)
                 {
                 StringGrid1->Cels[j][i]=tsl->Strings[k];
                 k++;
                 }
        }
delete tsl;
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)