Главная страница
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.04 c
15-1175259005
Александр1234
2007-03-30 16:50
2007.04.29
о управлении в Delphi


1-1173168166
Ques
2007-03-06 11:02
2007.04.29
SetErrorMode(SEM_FAILCRITICALERRORS) для приложения


2-1176377740
I-New
2007-04-12 15:35
2007.04.29
Динамическая загрузка картинок в TimageList


2-1176368485
-=MaxDelphi=-
2007-04-12 13:01
2007.04.29
Вопрос по TSynEdit


2-1176124586
Irishka
2007-04-09 17:16
2007.04.29
программа возведения натурального числа в квадрат