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

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



Память: 0.49 MB
Время: 0.027 c
1-1172823834
Mikhail83
2007-03-02 11:23
2007.04.29
Пролистывание в TChart


1-1172815571
Бригадир
2007-03-02 09:06
2007.04.29
Собственная отрисовка PopupMenu


15-1175672948
mambo_dev
2007-04-04 11:49
2007.04.29
Подзабыл(


2-1176199265
allucard
2007-04-10 14:01
2007.04.29
Метод Assign класса TPersistent


2-1175839373
Mikhail83
2007-04-06 10:02
2007.04.29
Interbase Генератор/Триггер не срабатывает




   Наверх