Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.17;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.014 c
14-55782
stalker780
2003-06-30 13:59
2003.07.17
Пароль юзера из Винды


3-55426
Rel_
2003-06-24 08:48
2003.07.17
запрос SQL


14-55845
Карелин Артем
2003-07-01 15:36
2003.07.17
Алгоритмы обработки изображений. Где найти описания?


3-55412
Evgenij Kardash
2003-06-22 19:18
2003.07.17
Запрос по двум таблицам


14-55791
Карлсон
2003-06-29 21:36
2003.07.17
хинт в Win2K.