Форум: "Основная";
Текущий архив: 2003.07.17;
Скачать: [xml.tar.bz2];
ВнизCOM итерфейс IStorage. Общение с TTreeView. Найти похожие ветки
← →
K_O_T (2003-07-03 15:17) [0]У меня в программе элементы хранилища IStorage рекурсивно загружаются в TreeView.
Посветуйте как организовать общение между Node"ом TreeView и соответствующим хранилищем.
P.S. Очень расчитываю на Вашу помощь
← →
MMF (2003-07-03 15:37) [1]Я использовал для работы с компаундами компонент TfcTreeView (FirstClass) у него есть у каждого узла поле StringData: string, в нем я запоминал полный путь от корневого хранилища к конкретному потоку/хранилищу. аналогично можешь запоминать в PYourType(Node.Data). А вот по событию MDTreeChange
* * *
Hr := StgOpenStorage(StringToPWideChar(FFileName),
nil, STGM_READ or STGM_DIRECT
or STGM_SHARE_EXCLUSIVE,
nil, 0, Root);
OLECheck(Hr);
Root.Commit(STGC_DEFAULT);
SubStor := Root;
//нужно найти этот поток по названию
TempStr := Node.StringData;
first := True;
DelPos := Pos("/", TempStr);
while DelPos <> 0 do
begin
//выделяем очередное имя папки
StgName := Copy(TempStr, 1, DelPos - 1);
TempStr := Copy(TempStr, DelPos + 1, Length(TempStr) - DelPos);
DelPos := Pos("/", TempStr);
if first then
begin
First := False;
Continue;
end;
SubStor := GetSubStorage(SubStor, StgName);
end;
*****
function GetSubStorage(Root: IStorage; Name: string): IStorage;
var
Hr: HResult;
begin
Hr := Root.OpenStorage(StringToPWideChar(Name),
nil, STGM_READ or STGM_DIRECT
or STGM_SHARE_EXCLUSIVE,
nil, 0, Result);
OleCheck(Hr);
Root.Commit(STGC_DEFAULT);
end;
← →
K_O_T (2003-07-03 15:58) [2]Я по смыслу точно так и делал!!!!
Но у меня все время вылозили исключения(попытка обращения к умершему объекту). ПРосто с COM объектами первый раз общаюсь:)
← →
MMF (2003-07-03 16:04) [3]Обрати внимание на Root.Commit(STGC_DEFAULT) - для корневых хранилищ, открываемых в STGM_DIRECT перед Release надо обязательно делать. Иначе будут исключения "Ресурс занят"
← →
K_O_T (2003-07-03 23:14) [4]Большое спасибо!
← →
Тих (2003-07-03 23:21) [5]Если памяти не жалко, можно прямо указатель на IStorage/IStream вешать на TreeNode.Data, аккуратненько добавляя при присвоении указателя AddRef, при удалении узла или переприсвоении указателя Release
← →
K_O_T (2003-07-03 23:37) [6]Ндааа...
Опять я наверное что-то не так делаю:(
function GetSubStorage(Root: IStorage; Name: string): IStorage;
var
Hr: HResult;
begin
Hr := Root.OpenStorage(StringToOleStr(Name),
nil, STGM_READ or STGM_DIRECT
or STGM_SHARE_EXCLUSIVE,
nil, 0, Result);
OleCheck(Hr);
Root.Commit(STGC_DEFAULT);
end;
procedure TForm1.Button1Click(Sender: TObject);
var root,SubStor:IStorage;
hr:HRESULT;
TempStr,StgName:string;
first:BOOL;
DelPos:integer;
begin
Hr := StgOpenStorage("1",
nil, STGM_READ or STGM_DIRECT
or STGM_SHARE_EXCLUSIVE,
nil, 0, Root);
OLECheck(Hr);
Root.Commit(STGC_DEFAULT);
SubStor := Root;
//нужно найти этот поток по названию
TempStr := "/1/2/3/";
first := True;
DelPos := Pos("/", TempStr);
while DelPos <> 0 do
begin
//выделяем очередное имя папки
StgName := Copy(TempStr, 1, DelPos - 1);
TempStr := Copy(TempStr, DelPos + 1, Length(TempStr) - DelPos);
DelPos := Pos("/", TempStr);
if first then
begin
First := False;
Continue;
end;
SubStor := GetSubStorage(SubStor, StgName);//- <На третьем вызове - Экзепшн:Попытка использовать обьект прекративший....
end;
end;
Что не так?
← →
K_O_T (2003-07-04 00:02) [7]Все Все Все ясно!!!!!
Спасибо! Вы мне открыли глаза:)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.07.17;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c