powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FindClass -> TObject -> IInterface
25 сообщений из 26, страница 1 из 2
FindClass -> TObject -> IInterface
    #39999729
KinsT_UA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Как корректно привести Объект к Интерфейсу после того, как класс объекта был получен через FindClass?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
{ unit uBaseInterfaces; }
…
  IMyInterface = interface(IInterface)
    procedure Init(ATxt:string);
  end;



{ unit uFormTest; }
…
type

  TFormTest = class(TForm, IMyInterface)
    lCpt: TLabel;
  public
    procedure Init(ATxt:string);
  end;

implementation

{$R *.dfm}

procedure TFormTest.Init(ATxt: string);
begin
  lCpt.Caption := ATxt;
  ShowModal;
end;

initialization
  RegisterClass(TFormTest);

end.



{ unit uMainForm; }
…
type

  TMainForm = class(TForm)
    btnInterfaceCall: TButton;
    procedure btnInterfaceCallClick(Sender: TObject);
  end;

implementation

uses uBaseInterfaces;

{$R *.dfm}

procedure TMainForm.btnInterfaceCallClick(Sender: TObject);
var vClass : TClass;
  vObj : TObject;
  vForm : TForm;
begin
  vClass := FindClass('TFormTest');
  vObj := vClass.Create;
  vForm := TForm(vObj).Create(nil);

  // Вызывает ошибку компиляции:
  // E2010 Incompatible types: 'IMyInterface' and 'TForm'
  //IMyInterface(vForm).Init('My message!');

  // Вызывает RunTimeError;
  //IMyInterface(@vForm).Init('My message!');
end;
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #39999730
KinsT_UA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Какую проблему пытаюсь решить
В проекте, который складывался годами существует 400+ юнитов (385 визуальных форм).
Между большинством из этих форм есть сильная связность, т.е. убери один - остальные не скомпилятся.
Прилетела задача собрать урезанную версию ПО с возможностью последующего подключения дополнительного функционала. Сидеть комментировать куски кода или же визуально скрывать кнопочки вообще не комильфо…

Вариант решения
Хочу применить паттерн Фасад (возможно не один в зависимости от бизнес-логики).
Чтобы обеспечить слабую связность между формами, планировал при подключении юнитов наследовать классы от интерфейса, регистрировать их через RegisterClass и вызывать создание объектов по имени класса.
Всё это в зависимости от того, какие модули руководство компании разрешит включить в релиз.

Буду сердечно благодарен:
1) За внятный ответ на вопрос из первого поста :)
2) Совет по общей организации архитектуры ПО в данном случае.
Возможно я не в ту сторону копаю )))

Заранее огромное спасибо!
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #39999741
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KinsT_UA,
Код: pascal
1.
2.
3.
4.
5.
 vObj : IMyInterface;

...
vObj := vClass.Create;
...
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #39999745
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор IMyInterface = interface(IInterface)
procedure Init(ATxt:string);
end;


Интерфейс ещё желательно бы оснащать строкой IID. Иначе как объект сможет отыскать у себя запрашиваемый интерфейс?
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #39999747
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KinsT_UA,

У объектов есть метод GetInterface. Интерфейс нужно декларировать с GUID, иначе запросы работать не будут.
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #39999757
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KinsT_UA,

Объявить как InterfacedObject и запрашивать интерфейс по IID, не рассматривается?
Не досмотрел....
ИМХО, Нужен интерфейс именно и TForm? Просто я огреб проблем от TComponent с интерфейсами.
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #39999811
KinsT_UA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ziv-2014
Код: pascal
1.
2.
3.
4.
5.
 vObj : IMyInterface;

...
vObj := vClass.Create;
...

Это точно не будет работать:
E2010 Incompatible types: 'IMyInterface' and 'TObject' неизбежен...

DmSerИнтерфейс ещё желательно бы оснащать строкой IIDСпасибо! Пока писал пример, тоже про это подумал, но чёт втыканул.
Ctrl + Shift + G мне в помощь, но это не решает проблему.

Kazantsev AlexeyУ объектов есть метод GetInterface.Спасибо, попробую покрутить, позже отпишусь.

DesWindИМХО, Нужен интерфейс именно и TForm?Там вообще все что угодно может быть: и фреймы, и собственные классы-контейнеры, и прочие сорта коричневого )))
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #39999828
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KinsT_UA,

Будет работать.
Код: pascal
1.
vObj := vClass.Create as IMyInterface 



Ты задал детский вопрос. Бросай лучше программирование, оно точно не для тебя.

А еще есть функция Supports - можешь ей воспользоваться.
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #39999854
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KinsT_UA
планировал при подключении юнитов наследовать классы от интерфейса
Подтяни матчасть. Классы не наследуются от интерфейсов, а реализуют их. А ты можешь запросить у объекта через supports требуемый интерфейс, значение функции покажет поддерживается ли он.
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #39999894
KinsT_UA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ziv-2014, спасибо большое за пинок в нужном направлении!

white_niggerПодтяни матчасть. Классы не наследуются от интерфейсов, а реализуют их.
Согласен. Чушь написал. Спасибо :)
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #39999970
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17.09.2020 13:10, DesWind пишет:
> Просто я огреб проблем от TComponent с интерфейсами.

чего? где? как?
(просто интересно)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #39999979
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
чего? где? как?
Подозреваю, что товарищ понадеялся на автоматический счетчик ссылок
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #40002059
KinsT_UA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, неделя ковыряний ни к чему не привела :(
Делаю по старинке: жестко прописываю юниты в модуле фасада.
Т.е. по сути из одного места переложил в другое, но теперь хотя бы связность "многие к одному", а не "многие ко многим".

Если у кого-нибудь из Светлых Голов будет время/возможность/желание посмотреть в чем же именно может быть мой косяк,
то прикладываю исходники мини-проекта.

ЗЫ: Всё, что предлагали выше попробовал - не помогает.
Supports всегда говорит, что объект/форма не поддерживает мой интерфейс.
Код: pascal
1.
vObj := vClass.Create as IMyInterface 

Это не работает.

Буду благодарен за конструктивные советы!
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #40002065
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
24.09.2020 12:14, KinsT_UA пишет:
> ЗЫ: Всё, что предлагали выше попробовал - не помогает.

А скворечники вы делать умеете?
А костры разводить?
Ну а маршировать вы умеете?
Вот видите - рано вам ещё в пионеры!

(С) м/ф "Чебурашка"
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #40002108
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
  //vObj := vClass.Create;
  vForm := TFormClass(vClass).Create(Application);

  if Supports(vForm, IMyInterface, vI)
  then ShowMessage('vObj support IMyInterface')
  else ShowMessage('vObj NOT support IMyInterface');


Ах, да. vForm это TForm.

Но азы как-то нужно подтянуть. Ибо швах какой-то.
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #40002113
KinsT_UA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman, Золотой Вы Человек!

Спасибо огромное!

Т.е. проблема была в том, что задачу нужно было решать через метакласс формы?
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #40002123
KinsT_UA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman
Но азы как-то нужно подтянуть. Ибо швах какой-то.
Похоже это тот случай, когда больше 7 лет автоматизируешь хитровымудренную бизнесс-логику, но ни разу не читал базовую документацию по Делфи :(
Простите если сможете! Такая задача первый раз возникла и вскрыла пробелы в базовых знаниях...
Есть над чем задуматься!
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #40002131
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бывает. Работа с интерфейсами - это отдельная парадигма в программировании, в общем отвязанная от конкретного ЯП. Пока не столкнешься - не изучишь
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #40002140
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пока шишек не набьёшь
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #40002155
KinsT_UA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, красота же!
Код: pascal
1.
2.
3.
4.
5.
6.
7.
var vClass : TClass;
  vI : IMyInterface;
begin
  vClass := FindClass('TFormTest');
  TFormClass(vClass).Create(Application).GetInterface(IMyInterface, vI);
  TFacade.ShowMsg(vI, 'My test message!');
end;


Теперь работает так, как я и задумал =)
Можно даже еще красивее сделать. Ух, ща как размахнусь )))

Спасибо всем огромное! Вы лучшие!
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #40002161
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KinsT_UA
Ну, красота же!
1. Очень опасно так делать. Можно легко получить утечку памяти. Созданная форма уничтожится аж при завершении работы приложения.

2. Кастовать достаточно к TComponentClass

3. GetInterface это функция. И нужно проверять, что она возвращает
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #40002307
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger
Бывает. Работа с интерфейсами - это отдельная парадигма в программировании, в общем отвязанная от конкретного ЯП. Пока не столкнешься - не изучишь


А в случае Delphi ещё и с пачкой своих тараканов!
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #40002330
AWSVladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KinsT_UA
Вообще интерфейсы используются для внешних вызовов, длл, другие приложения.
Ну или когда коллекции надо объединять из объектов которые фиг знает как, когда и где создаются.
Нафига их использовать внутри своего приложения как ты используешь, что не хватает в ООП?
Замаешься потом.
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #40002411
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AWSVladimir

Нафига их использовать внутри своего приложения как ты используешь, что не хватает в ООП?
Замаешься потом.

Ещё иногда с фреймами бывает удобно, потому что наследование фреймов в делфи работает через жопу.
...
Рейтинг: 0 / 0
FindClass -> TObject -> IInterface
    #40002436
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
AWSVladimir

Нафига их использовать внутри своего приложения как ты используешь, что не хватает в ООП?
Замаешься потом.

Ещё иногда с фреймами бывает удобно, потому что наследование фреймов в делфи работает через жопу.

Без фреймов проще. Любую форму можно забиндить к любому контролу. Например, на панельку.
Это и ТС-у будет полезно.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TfrmFactoryReport.BindTo(const AParent: TWinControl);
begin
  if Assigned(AParent) then begin
    Parent := AParent;
    Align := alClient;
    BorderStyle := bsNone;
    Show;
  end;
end;
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FindClass -> TObject -> IInterface
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]