Главная страница
    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.48 MB
Время: 0.039 c
4-1164976076
SS-ALX
2006-12-01 15:27
2007.04.29
Как с помощью WinAPI (EDM) программно оключить устройство


3-1170928868
maxmaxov
2007-02-08 13:01
2007.04.29
простой вопрос по PL SQL


15-1175486351
Jar
2007-04-02 07:59
2007.04.29
Не работает программа под Windows Vista


15-1175408250
Sind
2007-04-01 10:17
2007.04.29
Тест на delphi7


15-1173797879
oldman
2007-03-13 17:57
2007.04.29
Эх, нам бы так.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский