Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.013 c
14-55744
vopros
2003-06-30 11:49
2003.07.17
Какую карту видео лучше купитб до 90$


3-55423
Lexa2504
2003-06-24 10:07
2003.07.17
Формат ячеек в StringGrid


1-55527
Cranium
2003-07-04 21:40
2003.07.17
Простой вопрос о TreeView


1-55630
Immortal_Death
2003-07-03 12:02
2003.07.17
Уникальнное имя компонента...


4-55901
Fotog
2003-05-16 21:19
2003.07.17
CreateProcess




   Наверх