Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.039 c
2-1175879629
Первакласник Вася
2007-04-06 21:13
2007.04.29
Отследить появление окна


3-1171020714
Kyn66
2007-02-09 14:31
2007.04.29
Summa Calculated полей


2-1175976749
Officeman
2007-04-08 00:12
2007.04.29
Работа со строками (как удалить из строки рус.буквы)


15-1175364772
cyborg
2007-03-31 22:12
2007.04.29
По поводу закрытия


15-1175833346
Steep
2007-04-06 08:22
2007.04.29
Build with RunTime Packages





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский