Форум: "Основная";
Текущий архив: 2007.04.29;
Скачать: [xml.tar.bz2];
ВнизХранить интерфейсы в TStrings Найти похожие ветки
← →
Ш-К (2007-03-02 18:28) [0]Есть у меня, допустим, TListBox (или любой объект у которого Items реализованы через TStringList).
Так же у меня имеется множество IDefault = interface(IInterface) интерфейсов, каждый из которых я хочу связать с TListBox.Items.
Делаю так:iDef : IDefault;
...
ListBox.Items.AddObject("bla bla", TObject(Cardinal(iDef)));
И соответственно получаю:iDef := IDefault(Cardinal(ListBox.Items.Objects[I]));
Нет ли здесь глюков с подсчетом ссылок? И вообще как лучше реализовывать САБЖ?
← →
Суслик © (2007-03-02 18:36) [1]так нельзя
Если ты напишешь такvar
iDef : IDefault;
begin
iDef := TMyClass.Create();
ListBox.Items.AddObject("bla bla", TObject(Cardinal(iDef)));
end;
то объект будет уничтожен после end
нужно такvar
iDef : IDefault;
begin
iDef := TMyClass.Create();
iDef._AddRef();
ListBox.Items.AddObject("bla bla", TObject(Cardinal(iDef)));
end;
ИЛИ такvar
iDef : IDefault;
begin
iDef := TMyClass.Create();
ListBox.Items.AddObject("bla bla", TObject(Cardinal(iDef)));
Pointer(iDef) := nil;
end;
Получать значения нужно так (как и у тебя)var
iDef : IDefault;
begin
iDef := IDefault(Cardinal(ListBox.Items.Objects[I]));
end;
← →
Суслик © (2007-03-02 18:36) [2]Удалено модератором
Примечание: дубль
← →
Суслик © (2007-03-02 18:36) [3]Удалено модератором
Примечание: трипль
← →
Ш-К (2007-03-02 18:44) [4]Мысль повторенная трижды становится истиной.
iDef : IDefault - не локальная переменная. Это один из кучи разных объектов, реализующих IDefault, и не имеющих общего предка.
← →
Суслик © (2007-03-02 18:48) [5]все равно нельзя :)
ибо при изменении значения idef будет вызван _release для предыдущего значения - объект будет удален.
т.е.var
iDef: IDefault; // GLOBAL VAR
...
begin
iDef := TMyClass.Create();
ListBox.Items.AddObject("bla bla", TObject(Cardinal(iDef)));
iDef := TMyClass.Create();
// Все - здесь объект созданный выше умер
ListBox.Items.AddObject("bla bla", TObject(Cardinal(iDef)));
end;
PS Троит меня провайдер - я не специально
← →
Суслик © (2007-03-02 18:48) [6]Удалено модератором
Примечание: дубль
← →
Суслик © (2007-03-02 18:48) [7]Удалено модератором
Примечание: трипль
← →
Ш-К (2007-03-02 19:04) [8]Да не собираюсь я создавать объекты непосредственно перед вставкой. Да еще, почему-то, через одну переменную. Они у меня живут своей жизнью: где-то создаются, где-то убиваются. Мне их надо просто отобразить в ListBox.
iDef0: IDefault;
iDef1: IDefault;
iDef2: IDefault;
...
ListBox.Items.AddObject("bla bla", TObject(Cardinal(iDef0)));
ListBox.Items.AddObject("bla bla", TObject(Cardinal(iDef1)));
ListBox.Items.AddObject("bla bla", TObject(Cardinal(iDef2)));
Правильный вариант - хранить объекты в Items как TObject, а потом где надо через QueryInterface приводить к IDefault.
Но дело в том, что нек. объекты я вижу только как IDefault.
← →
Суслик © (2007-03-02 19:10) [9](ты тоже троить начал :)))
Ты спрашивал про подсчет ссылок? Я тебе сказал, что в общем случае ты делаешь неверно. Если у тебя всего три объекта, то можно и как ты делаешь. Но в общем случае нужно делать тоньше.
ЗЫ Можно вообще подсчет ссылок отключить :)
← →
Суслик © (2007-03-02 19:10) [10]Удалено модератором
Примечание: дубль
← →
Суслик © (2007-03-02 19:10) [11]Удалено модератором
Примечание: трипль
← →
Ш-К (2007-03-02 19:19) [12]
> ЗЫ Можно вообще подсчет ссылок отключить :)
Вто то и дело, что мне нельзя. Я б отключил.
← →
Суслик © (2007-03-02 19:31) [13]
> [12] Ш-К (02.03.07 19:19)
если интересно, напиши мне timokhov@gmail.com
я тебя по этому вопросу проконсультирую - вроде как я это хорошо понимаю :)
← →
Суслик © (2007-03-02 19:31) [14]Удалено модератором
Примечание: дубль
← →
Суслик © (2007-03-02 19:31) [15]Удалено модератором
Примечание: трипль
← →
Palladin © (2007-03-02 20:10) [16]
> Суслик ©
как это у тебя получается?
← →
DrPass © (2007-03-02 20:44) [17]А это не только у него
← →
DrPass © (2007-03-02 20:44) [18]Удалено модератором
← →
DrPass © (2007-03-02 20:44) [19]Удалено модератором
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.04.29;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.044 c