Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2019, 21:14   #1
snegok74
Пользователь
 
Регистрация: 26.11.2007
Сообщений: 11
По умолчанию Как хранить интерфейсные ссылки в StringGrid?

Есть описание двух интерфейсов
Код:
  ILine = interface
    ['{AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAA1234}']
  end;
  IBlock = interface
    ['{BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBB1234}']
  end;
есть описание объекта для хранения интерфейсной ссылки в объектной переменной StrigGrid'а
Код:
  TDataObject = class
  public
    DataInterface: IUnknown;
    // при создании объекта переданая интерфейсная ссылка записывается в
    // переменную DataInterface
    constructor Create(AInterface: IUnknown);
  end;
теперь я могу хранить интерфейсные ссылки в ячейках StringGrid'а
Код:
var
  Line:  ILine;
  Block: IBlock;

  StringGrid1.Objects[1,1] := TDataObject.Create(Line);
  StringGrid1.Objects[2,2] := TDataObject.Create(Block);
теперь получаю интерфейс из объектов из StringGrid'а
Код:
var
  IObject: IUnknown;
  ..
  IObject := TDataObject(StringGrid1.Objects[1, 1]).DataInterface;
и теперь проверяя содержит ли моя интерфейсная ссылка нужный мне интерфейс ВСЕГДА получаю True
Код:
  if Supports(IObject, ILine) then
    ShowMessage('ILine');
  if Supports(IObject, IBlock) then
    ShowMessage('IBlock');
Что я делаю не так? Может вообще хранение ссылок интерфейсных не так делается в StringGrid'е?

Последний раз редактировалось snegok74; 04.07.2019 в 21:45. Причина: добавил PS
snegok74 вне форума Ответить с цитированием
Старый 04.07.2019, 21:41   #2
snegok74
Пользователь
 
Регистрация: 26.11.2007
Сообщений: 11
По умолчанию

можно, наверное, эти интерфейсы наследовать от одного общего интерфейса в котором описать функцию, которая будет возвращать имя или GUID интерфейса:
Код:
  IData = interface
    ['{00000000-0000-0000-0000-AAAAAAAA1234}']
    function InterfaceName: WideString;
    // или
    function InterfaceGUID: TGUID;
  end;
  ILine = interface(IData)
    ['{AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAA1234}']
    ...
  end;
  IBlock = interface(IData)
    ['{BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBB1234}']
    ...
  end;
но как то это, "неправильно", чтоли

Последний раз редактировалось snegok74; 04.07.2019 в 21:53.
snegok74 вне форума Ответить с цитированием
Старый 05.07.2019, 09:08   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
и теперь проверяя содержит ли моя интерфейсная ссылка нужный мне интерфейс ВСЕГДА получаю True
почему мы бы и не получать, если ...
объект на который ссылается интерфейс поддерживает ОБА интерфейса.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 05.07.2019, 13:02   #4
snegok74
Пользователь
 
Регистрация: 26.11.2007
Сообщений: 11
По умолчанию

объект поддерживает оба интерфейса, но содержит в данный момент только один.
а как тогда быть, как узнать какой именно он хранит в себе ?
snegok74 вне форума Ответить с цитированием
Старый 05.07.2019, 14:00   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
объект поддерживает оба интерфейса, но содержит в данный момент только один.
если объект поддерживает, значит он содержит.

Цитата:
как узнать какой именно он хранит в себе ?
интерфейсная ссылка хранит в себе ОБЪЕКТ, который ...

а какая разница-то вам. вы можете работать по любому приглянувшемуся вам(тому который имеет нужный функционал) и доступному.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 05.07.2019, 19:43   #6
snegok74
Пользователь
 
Регистрация: 26.11.2007
Сообщений: 11
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
а какая разница-то вам. вы можете работать по любому приглянувшемуся вам(тому который имеет нужный функционал) и доступному.
для того чтобы работать по "любому приглянувшемуся" мне и надо знать, по какому.
у разных интерфейсов разные свойства.
Код:
  if Supports(IObject, ILine) then
    SubCount := ILine(IObject).CharsCount
  else if Supports(IObject, IBlock) then
    SubCount := IBlock(IObject).LinesCount;
вот только я не понял, вы таки не знаете как в моем случае получить тип/имя/GUID интерфеса по ссылке, или так искуссно меня к ответу подводите?
snegok74 вне форума Ответить с цитированием
Старый 06.07.2019, 10:48   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
для того чтобы работать по "любому приглянувшемуся" мне и надо знать, по какому.
Код:
  if Supports(IObject, ILine, Lines) then // если поддержан интерфейс с ИМЕНЕМ Iline занести его в Lines
    SubCount := ILine(IObject)Lines.CharsCount //далее работаем по интефейсу Iline в переменной Lines
  else if Supports(IObject, IBlock, Bloks) then  // а если не можем
    SubCount := IBlock(IObject)Bloks.LinesCount; // работаем по интефейсу IBlock
Код:
if Lines<>nil then
  Lines.....
else if Bloks<>nil then
  Bloks....
а еще можно этим самым интерфейсам "обучить" TDataObject.
точнее обучить "общим" функциям и в программе работать исключительно с TDataObject(data).subCount
а уж TDataObject пусть "сам" решает чем (каким интерфейсом) он будет пользоваться.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 06.07.2019 в 11:11.
evg_m на форуме Ответить с цитированием
Старый 07.07.2019, 12:24   #8
snegok74
Пользователь
 
Регистрация: 26.11.2007
Сообщений: 11
По умолчанию

так и не получилось у меня отловить, что за интерфейс(а за ним объект) скрывается за IUnknown...
Код:
var
  IObject: IUnknown;
  Text: string;
  Blocks: IBlock;
  Lines: ILine;
begin
  IObject := TDataObject(IntGrid.Objects[ACol, ARow]).DataInterface;

  // вариант 1, проверяем тип по результату Supports
  {$IFDEF VARIANT1}
    if Supports( IObject, ILine,  Lines) then
      Text := 'Ln'
    else if Supports( IObject, IBlock, Blocks) then
      Text := 'Bl';

  // вариант 2, проверяем тип по возвращенной переменной из Supports
  {$ELSE}
    Supports( IObject, ILine,  Lines);
    Supports( IObject, IBlock, Blocks);
    if Lines <> nil then
      Text := 'Ln'
    else if Blocks <> nil then
      Text := 'Bl';
  {$ENDIF}
и в первом ...
003.png
и во втором случаях...
004.PNG
отладчик точно видит что за объект кроется за интерфейсом, но...
что то я делаю не так.

А поэтому, и по Вашей рекомендации, я решил "обучить" TDataObject пониманию того, что за интерфейс у него хранится.

evg_m, спасибо за советы и поддержку.

Последний раз редактировалось snegok74; 07.07.2019 в 12:29.
snegok74 вне форума Ответить с цитированием
Старый 07.07.2019, 20:25   #9
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от snegok74 Посмотреть сообщение
что за интерфейс(а за ним объект) скрывается за IUnknown...
У Вас какая-то каша в голове.. IUnknown - это минимальный интерфейс, его должен уметь поддерживать любой объект. Через него приложение, создавшее объект, получает ссылки на другие интерфейсы
Black Fregat вне форума Ответить с цитированием
Старый 10.07.2019, 22:32   #10
snegok74
Пользователь
 
Регистрация: 26.11.2007
Сообщений: 11
По умолчанию

Конечно каша.
Было бы все понятно, кодил бы и вопросов не задавал.
И, именно поэтому, пытался выяснить как хранить в StringGrid1.Objects разные интерфейсные ссылки, верне сказать, как потом распознавать какая хранится в определенной ячейке.
В любом случае, задача решена, хоть и другим способом.
snegok74 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалили все фотографии в mail.ru облако Где хранить и не хранить данные? в облачных сервисах? как восстанавливать в случае удаления? tatkaleo Свободное общение 11 08.03.2019 22:27
Где хранить данные StringGrid? Vyacheslav. Общие вопросы Delphi 39 13.12.2017 12:33
Как и где хранить Ruslasy PHP 1 16.09.2014 10:57
как хранить изображение DarkMage Win Api 3 24.12.2011 15:41
интерфейсные классы(ДЛЛ) Пепел Феникса Общие вопросы C/C++ 11 13.12.2010 17:30