Вниз
Скачать: 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.015 c
14-55813
Мазут Береговой
2003-07-01 03:54
2003.07.17
Кажется у меня атипичная пневмония (SARS).


14-55714
Мазут Береговой
2003-07-01 19:03
2003.07.17
Притча от Мазута. Быль. 20 век.


14-55724
AndyNik
2003-07-01 17:03
2003.07.17
Dalphi&Cache


1-55581
Jurmich
2003-07-03 10:20
2003.07.17
QuickReport


3-55468
Chery
2003-06-25 14:53
2003.07.17
Отображение данных в DBLookupComboBox без клика по нему ?




   Наверх