powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Из класса в компоненты (TInterfacedObject)
25 сообщений из 35, страница 1 из 2
Из класса в компоненты (TInterfacedObject)
    #39586096
Привет всем!

Имеем класс реализующий интерфейс, наследуемся от TInterfacedObject и работаем только через интерфейсные ссылки.

Теперь мне захотелось этот класс превратить в компонент VCL (Delphi5), как лучше поступить:

1 Наследоваться от TComponent вместо TInterfacedObject?

2 Сделать новый класс - наследник TComponent, который будет враппером оболочкой над старым классом ?
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39586101
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Счетовод Ссылок,

как левая пятка пожелает.
Если ты не собираешься использовать класс где-то еще - поменяй наследование на TComponent.
Если собираешься - имхо, лучше второй способ.
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39586119
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Счетовод СсылокПривет всем!

Имеем класс реализующий интерфейс, наследуемся от TInterfacedObject и работаем только через интерфейсные ссылки.

Теперь мне захотелось этот класс превратить в компонент VCL (Delphi5), как лучше поступить:

1 Наследоваться от TComponent вместо TInterfacedObject?

2 Сделать новый класс - наследник TComponent, который будет враппером оболочкой над старым классом ? Cочетание разных механизмов управления временем жизни чревато большими неприятностями, особенно с учетом того, что компилятор Дельфи в ряде случаев делает скрытые интерфейсные ссылки.

Поэтому, в общем случае
3. Просто добавить в наследник TInterfacedObject ссылку на компонент.
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39586368
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский БорисПоэтому, в общем случае
3. Просто добавить в наследник TInterfacedObject ссылку на компонент.
ему вроде как наоборот нужно

я за 2-й вариант, концепция рабочая и часто применяется
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39586371
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)ему вроде как наоборот нужно

Ему нужно то, что делать не стоит.

kealon(Ruslan) я за 2-й вариант, концепция рабочая и часто применяется А в чем преимущество компонент-оболочки по сравнению с некомпонент-оболочкой?
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39586475
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борисkealon(Ruslan) я за 2-й вариант, концепция рабочая и часто применяется А в чем преимущество компонент-оболочки по сравнению с некомпонент-оболочкой? Кнопкокликателей много, и им так легче использовать - следовательно так легче продать.
Для серьёзных людей можно предоставить апи без этой шелухи
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39586712
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Кнопкокликателей много, и им так легче использовать - следовательно так легче продать. cофт, который падает при завершении?
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39586742
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борисcофт, который падает при завершении?Почему он будет падать?
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39586981
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Соколинский Борисcофт, который падает при завершении?Почему он будет падать? Потому что непременно возникнет ситуация, когда компонент уничтожится раньше ссылки
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39587164
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский БорисПотому что непременно возникнет ситуация, когда компонент уничтожится раньше ссылкиЕсли интерфейс никак не обращается к компоненту, а компонент только дублирует свойства интерфейса
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
IMyIntf = interface
  procedure DoProc;
  function DoFunc(AVal: Integer): WideString;
end;

TMyComponent = class(TComponent)
strict private
  FIntf: IMyIntf;
public
  procedure DoProc;
  function DoFunc(AVal: Integer): string;
end;

procedure TMyComponent.DoProc;
begin
  FMyIntf.DoProc;
end;

function TMyComponent.DoFunc(AVal: Integer): string;
begin
  Result := FMyIntf.DoFunc(AVal);
end;


то процесс уничтожения компонента и интерфейса вещи абсолютно не коррелируемые
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39587183
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
Проблема в другом. Предположим, что для компонента, реализующего интерфейс, компилятор сгенерировал скрытую ссылку, которая будет освобождаться уже после того, как компонент уничтожится.
Тогда этот код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
function TComponent._Release: Integer;
begin
  if FVCLComObject = nil then
    Result := -1   // -1 indicates no reference counting is taking place
  else
    Result := IVCLComObject(FVCLComObject)._Release;
end;


отработает без ошибки только если менеджер памяти не вернет соответствующий блок в пул и он не будет заполнен чем-то еще.
Такое предположение я бы охарактеризовал как неоправданно оптимистичное.
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39587283
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис. Предположим, что для компонента, реализующего интерфейс
_Vasilisk_
Код: pascal
1.
2.
3.
TMyComponent = class(TComponent)
strict private
  FIntf: IMyIntf;

Где? Компонент не реализует интерфейс. Это адаптер к интерфейсу
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39587286
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
Я подумал, что просто код не дописан.
Тут ошибки не будет, но смысла в такой конструкции не вижу совсем.
ИМХО, намного проще и понятнее просто вставлять ссылку на компонент в класс интерфейса.
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39587865
Хмм, спасибо всем!

Вкратце, класс от TInterfacedObject, реализует один сетевой протокол для хитрой железяки. Я его спокойно пользовал в своем коде, все прекрасно диспозилось, даже автоматически.

Теперь коллеги попросили и будут пользоваться этим протоколом, но для них нужно это оформить в виде компонента, из-за чего теперь встала необходимость наследоваться уже от TComponent.

Решил все же пойти вторым способом, просто оберну. Нужно будет хорошенько потестить DUnit'ом, на предмет крашей.
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39588160
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Счетовод СсылокТеперь коллеги попросили и будут пользоваться этим протоколом, но для них нужно это оформить в виде компонентаСтранные коллеги. У меня фантазии не хватает зачем сетевой протокол оформлять в виде компонента
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39588622
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Счетовод СсылокТеперь мне захотелось этот класс превратить в компонент VCL (Delphi5), как лучше поступить:
Не помню, было ли это уже в Delphi 5, а вообще - сделать компонент, и в нём с помощью директивы implements подключить класс, реализующий интерфейс.
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39588633
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
22.01.2018 18:47, softwarer пишет:
> Не помню, было ли это уже в Delphi 5, а вообще - сделать компонент, и в нём с помощью директивы implements подключить класс, реализующий интерфейс.

да, в D5 уже было
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39588637
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerс помощью директивы implements подключить класс, реализующий интерфейс. 21120793
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39588647
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_softwarerс помощью директивы implements подключить класс, реализующий интерфейс. 21120793
Я не очень понимаю, при чём тут это. Насколько мне помнится, во времена D5 всякие TComponent._Release просто тупо возвращали -1.
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39588650
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

интерфейс то ты подцепишь, а как пользоваться будешь компонентом? приводить к интерфейсу? зачем тогда весь сыр-бор?

PS: кроме того в компиляторе до XE2 вкл. серьёзная бага с implements
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39588675
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)интерфейс то ты подцепишь, а как пользоваться будешь компонентом? приводить к интерфейсу?
Зачем? Просто вызывать его методы как методы компонента.

kealon(Ruslan)зачем тогда весь сыр-бор?
Зачем топикстартеру вся эта свистопляска, я хз. По идее, компонент нужен затем, чтобы в дизайн-тайме его настроить и, может быть, проверить работоспособность без запуска приложения.
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39588697
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerkealon(Ruslan)интерфейс то ты подцепишь, а как пользоваться будешь компонентом? приводить к интерфейсу?
Зачем? Просто вызывать его методы как методы компонента. хм, это как? и при чём тут Implements?
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39588701
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)хм, это как? и при чём тут Implements?
Что-то я не сразу сообразил. Хочешь сказать, что если интерфейс приделан через implements, то вызов типа Component.InterfacedMethod не проходит? Тогда да, согласен, фигня. Ну разве что можно делать Component.I.InterfacedMethod, где I, соответственно - интерфейсное свойство.
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39588703
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

ну да, множественное наследование не реализовано в полном объёме
...
Рейтинг: 0 / 0
Из класса в компоненты (TInterfacedObject)
    #39591116
_Vasilisk_Счетовод СсылокТеперь коллеги попросили и будут пользоваться этим протоколом, но для них нужно это оформить в виде компонентаСтранные коллеги. У меня фантазии не хватает зачем сетевой протокол оформлять в виде компонента Согласен, можно было и пережить лишний криэйт и настройку пропертей в коде, но публика хочет чтобы как инди либа например.
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Из класса в компоненты (TInterfacedObject)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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