Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C++ Builder > как сохранить в файле содержимое StringGrid |
Автор: Взюх 17.6.2006, 19:29 |
у меня есть компонент StringGrid (типа моя база данных) и ее содержимое при нажатии на кнопку сэйв надо сохранить в файле что б потом при нажатии на кнопку оупэн она открылась, вопрос, КАК сохранить содержимое а потом открыть? |
Автор: Partizan 18.6.2006, 09:11 |
=))) Придумать формат хранения данных, согласно этому формату запихивать данные в файл, и на основе него же извлекать их из файла... самое грубое - это хранение матрицы значений в txt файле.... |
Автор: W0LF 18.6.2006, 20:12 | ||||
Дело в том, Partizan, что он, скорее всего, не то спросил. Ему все-равно где и как хранить, главное, как взять и занести значения в файл ![]() Я так понял, что "самое грубое " хранение тебя устроит, Взюх. Самый глупый и быстрый(в смысле написания кода) вариант : Пройтись по всем ячейкам Stringrid'a(StringGrid->Cells[i][j]) и занести их в Memo, добавляя между ними пробелы, ток заноси с переходом на новую строку. Потом просто и тупо сохранить все в Memo: Используем OpenDiaolog:
Когда захочешь все это открыть, то так:
Теперь обратный процесс - из Memo занести все в StringGrid: Для начала все разобъем на слова, http://forum.vingrad.ru/index.php?showtopic=100820&view=findpost&p=766706 Но если неохота разбираться с тем, как это занести еще и в StringGrid напиши мне, а я скину тебе. Просто два раза постить одно и то же, ну сам понимаешь... На моем пне 1.7ghz с 512mb ddr конечный результат при появлении инфы в СтрингГриде(размерность его 6x6864) проходит за 2-3 секунды... То есть сравнительно не долго ![]() |
Автор: Взюх 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<<";"; } } } Вотб терь пытаюсь загрузить из этого документа обратно в СтрингГрид ![]() Добавлено @ 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; }
|
Автор: Взюх 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 не знаю. Я с ним в билдере не работал ![]() |
Автор: ZIlya 19.6.2006, 13:27 | ||||
самый простой(но не лучший) способ по моему сохранение
загрузка
|