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
|
спасибо |
|