гранлок клапан обратный фланцевый. Наслаждайся моментами релакса и удовольствия с помощью незнакомок, представленных на https://hm.inditail.net. Твоя мечта сбудется на https://smol.inditok.info. Познакомься с привлекательными спутницами, которые готовы исполнить все твои желания, на https://sposad.indi-hub.com.
C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
SaveToStream, LoadFromStream, помогите разобраться
joynter
Отправлено: 15.01.2004, 19:28


Станционный диспетчер

Группа: Участник
Сообщений: 137



как записать дерево в поток? Как правильно использовать методы SaveToStream, LoadFromStream?

В хелпе нашел пример для TMemoryStream. А хотелось бы использовать TFileStream.
Ничего умнее этого кода придумать не смог:

void __fastcall TForm1::Button8Click(TObject *Sender)
{
TMemoryStream* pms = new TMemoryStream();
TreeView1->SaveToStream(pms);
int iFile, err;
iFile = FileCreate("test.txt");
err = FileWrite(iFile, &pms, sizeof(pms));
FileClose(iFile);
delete pms;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button9Click(TObject *Sender)
{
TMemoryStream* pms = new TMemoryStream();
int iFile, err;
iFile = FileOpen("test.txt", fmOpenRead);
err = FileRead(iFile, &pms, sizeof(pms));
FileClose(iFile);
pms->Position = 0;
TreeView1->LoadFromStream(pms);
delete pms;
}

TreeView1->LoadFromStream(pms) — дерево не грузит (а хотелось бы)
Помогите пожалуйста разобраться
fellow
Отправлено: 15.01.2004, 21:02


Дежурный стрелочник

Группа: Участник
Сообщений: 33



И не будет грузить. Запись в файл FileWrite(iFile, &pms, sizeof(pms)), тогда как pms — это указатель на TMemoryStream, приведёт к записи _значения_ указателя, т.е. 4 байта.
Такие сложности ни к чему. У TTreeView имеются методы записи и в файл, и в поток. Соответственно, и чтения тоже. SaveToStream записывает в любой потомок от TStream, хоть в память, хоть в файл. SaveToFile пишет в файл непосредственно.
joynter
Отправлено: 16.01.2004, 02:07


Станционный диспетчер

Группа: Участник
Сообщений: 137



Re: У TTreeView имеются методы записи ... и в поток
так вот мне и не понятно, как правильно организовать метод

TreeView->SaveToStream()
joynter
Отправлено: 16.01.2004, 02:22


Станционный диспетчер

Группа: Участник
Сообщений: 137



как правильно организовать метод

TreeView->SaveToStream() используя класс TFileStream?
Bond
Отправлено: 16.01.2004, 13:35


Станционный диспетчер

Группа: Участник
Сообщений: 142



Если ты хочешь записать дерево в файл, то поток не нужен — юзай TreeView1->SaveToFile.
Зачем метод придумывать?
fellow
Отправлено: 16.01.2004, 18:13


Дежурный стрелочник

Группа: Участник
Сообщений: 33



Верно!
joynter
Отправлено: 17.01.2004, 03:38


Станционный диспетчер

Группа: Участник
Сообщений: 137



мне нужно именно в поток, тк деревьев много и количество их не ограничено
Bond
Отправлено: 17.01.2004, 12:52


Станционный диспетчер

Группа: Участник
Сообщений: 142



Я создал два ТриВьюва и кнопочку и потестил слидующий код:

CODE

void __fastcall TMainForm::Button1Click(TObject *Sender)
{
 TMemoryStream *str = new TMemoryStream();
 TreeView1->SaveToStream(str);
 TreeView2->SaveToStream(str);
 str->SaveToFile("1.txt");
 delete str;
}
Bond
Отправлено: 17.01.2004, 12:59


Станционный диспетчер

Группа: Участник
Сообщений: 142



Если ты хочешь записать в один файл несколько деревьев, то в конструкторе объекта (TForm1), работающего с ними выдели память под поток ТМемориСтрим, в деструкторе сохрани его в файл и убей. А в нужных местах кода вставь запись необходимых деревьев в этот поток.
joynter
Отправлено: 17.01.2004, 17:11


Станционный диспетчер

Группа: Участник
Сообщений: 137



два тривьюва — выход, но не красивый

а мемориСтрим хорошо работает только с мелкими деревьями
(у меня деревья содержат ~ 5000 файлов, и, например, при далении одной ноды комп иногда выдает сообщение access violation at address ..... in module 'myFile.exe' . Read of address .....
насколько я понимаю — это глюки при работе с памятью, по-этому мне необходим именно файловый поток
joynter
Отправлено: 17.01.2004, 17:12


Станционный диспетчер

Группа: Участник
Сообщений: 137



два тривьюва — выход, но не красивый

а мемориСтрим хорошо работает только с мелкими деревьями
(у меня деревья содержат ~ 50000 файлов, и, например, при удалении одной ноды комп иногда выдает сообщение access violation at address ..... in module 'myFile.exe' . Read of address .....
насколько я понимаю — это глюки при работе с памятью, по-этому мне необходим именно файловый поток

Отредактировано joynter — 17/01/2004, 18:14
fellow
Отправлено: 18.01.2004, 07:28


Дежурный стрелочник

Группа: Участник
Сообщений: 33



CODE

void __fastcall TMainForm::Button1Click(TObject *Sender)
{
TFileStream *str = new TFileStream("1.txt",fmCreate|fmShareExclusive);
TreeView1->SaveToStream(str);
delete str;
}
joynter
Отправлено: 18.01.2004, 09:24


Станционный диспетчер

Группа: Участник
Сообщений: 137



спасибо

Вернуться в Вопросы программирования в C++Builder