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

Вниз

Хранить интерфейсы в 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.045 c
2-1176388173
waif
2007-04-12 18:29
2007.04.29
загрузка из Access


15-1175480993
Slider007
2007-04-02 06:29
2007.04.29
С днем рождения ! 2 апреля


3-1171270785
<rm>
2007-02-12 11:59
2007.04.29
формирование страницы Excel


15-1175503029
X9
2007-04-02 12:37
2007.04.29
Ну наконец-то...


15-1175709413
Pazitron_Brain
2007-04-04 21:56
2007.04.29
Подскажите книгу