Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как сохранить в файле содержимое StringGrid 
:(
    Опции темы
Взюх
  Дата 17.6.2006, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.6.2006

Репутация: нет
Всего: нет



у меня есть компонент StringGrid (типа моя база данных) и ее содержимое при нажатии на кнопку сэйв надо сохранить в файле что б  потом при нажатии на кнопку оупэн она открылась, вопрос, КАК сохранить содержимое а потом открыть?
 
 
PM MAIL   Вверх
Partizan
Дата 18.6.2006, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 7
Всего: 67



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


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
W0LF
Дата 18.6.2006, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: нет
Всего: 20



Дело в том, 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:
Для начала все разобъем на слова,
Смотри здесь как это делается
Но если неохота разбираться с тем, как это занести еще и в StringGrid напиши мне, а я скину тебе. Просто два раза постить одно и то же, ну сам понимаешь...
На моем пне 1.7ghz с 512mb ddr конечный результат при появлении инфы в СтрингГриде(размерность его 6x6864) проходит за 2-3 секунды... То есть сравнительно не долго smile Если же надо быстрее - используй BDE. 
    

Это сообщение отредактировал(а) W0LF - 18.6.2006, 20:16


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Взюх
Дата 19.6.2006, 06:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.6.2006

Репутация: нет
Всего: нет



ХЫ! =) спасибо! =) но я вчера уже разобрался =)

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, а ты сам-то пробовал свой код? слишком короткий и гладкий чтоб работал. 
PM MAIL   Вверх
tramp
Дата 19.6.2006, 07:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 14.4.2006
Где: Kemerovo

Репутация: нет
Всего: нет



Я делаю так, разделитель табуляция. Файл текстовый, хотя можно файлу дать расширение 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;
 }

 

Это сообщение отредактировал(а) tramp - 19.6.2006, 07:43
PM MAIL   Вверх
Взюх
Дата 19.6.2006, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.6.2006

Репутация: нет
Всего: нет



tramp, это код для чтения из файла с расширением xls? 
PM MAIL   Вверх
tramp
Дата 19.6.2006, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 14.4.2006
Где: Kemerovo

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) tramp - 19.6.2006, 07:57
PM MAIL   Вверх
Взюх
Дата 19.6.2006, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.6.2006

Репутация: нет
Всего: нет



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


ofstream fout;  
ifstream fin;

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

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

Но я не знаю как он работает =(  (в том смысле что, не знаю как с ним работать )
 
PM MAIL   Вверх
W0LF
Дата 19.6.2006, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: нет
Всего: 20



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


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
ZIlya
Дата 19.6.2006, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 6.2.2006

Репутация: нет
Всего: нет



самый простой(но не лучший) способ по моему

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

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;
 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0911 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.