Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.03.2015, 08:47
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию Перегрузить конструктор

Создаю свой класс на основе TComponent (constructor Create(AOwner: TComponent); virtual;) в конструктор нужно добавить еще один параметр
Код:
type
 TFB2File = class(TComponent)
  private
   FFileName: String;
  public
   constructor Create(AOwner: TComponent; const FileName: String); override;
   property FileName: String read FFileName;
 end;
подскажите, пожалуйста, как правльно сделать?
Ответить с цитированием
  #2  
Старый 26.03.2015, 09:28
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Например так
Код:
type
 TFB2File = class(TComponent)
  private
   FFileName: String;
  public
   constructor CreateFromFile(AOwner: TComponent; const AFileName: String);overload; 
   property FileName: String read FFileName;
 end;
Код:
constructor TFB2File.CreateFromFile(AOwner: TComponent; const AFileName: String);
begin
  inherited Create(AOwner);
  FFileName:=AFileName;
end;
Конструктор компоненты Create должен иметь только такую сигнатуру.
Код:
constructor Create(AOwner: TComponent);override;
Но никто не мешает создавать конструкторы с другими именами
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
Помидоркин (27.03.2015)
  #3  
Старый 26.03.2015, 09:28
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

так:
Код:
type
  TZzzComponent = class(TComponent)
  private
    FParam: string;
  public
    property Param: string read FParam;
    constructor Create(AOwner: TComponent; const AParam: string); reintroduce;
  end;
...
{ TZzzComponent }

constructor TZzzComponent.Create(AOwner: TComponent; const AParam: string);
begin
  inherited Create(AOwner);
  FParam:=AParam;
end;

использование:
Код:
TZzzComponent.Create(Self, 'hello world');
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Помидоркин (27.03.2015)
  #4  
Старый 26.03.2015, 09:49
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Цитата:
Сообщение от icWasya
Например так
Код:
type
 TFB2File = class(TComponent)
  private
   FFileName: String;
  public
   constructor CreateFromFile(AOwner: TComponent; const AFileName: String);overload; 
   property FileName: String read FFileName;
 end;
Код:
constructor TFB2File.CreateFromFile(AOwner: TComponent; const AFileName: String);
begin
  inherited Create(AOwner);
  FFileName:=AFileName;
end;
Конструктор компоненты Create должен иметь только такую сигнатуру.
Код:
constructor Create(AOwner: TComponent);override;
Но никто не мешает создавать конструкторы с другими именами

В случае с перегрузкой, не обязательно inherited, достаточно вызвать перегруженный конструктор.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #5  
Старый 26.03.2015, 13:08
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Цитата:
В случае с перегрузкой, не обязательно inherited, достаточно вызвать перегруженный конструктор.
inherited Create делает инициализацию "компонентной" части.
Так что вызывать его обязательно.
Ответить с цитированием
  #6  
Старый 26.03.2015, 13:31
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

inherited передает управление в конструктор предка; в данном случае конструктор перегружен, второй перегруженный конструктор и есть предковый, так что inherited не обязателен.
Тем более, у тебя оверлоад, а не реинтродьюс; вот при реинтродьюсе нужен inherited.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #7  
Старый 26.03.2015, 13:54
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Ничто не мешает из одного конструктора вызвать другой.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #8  
Старый 26.03.2015, 19:11
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от NumLock
так:
Код:
type
  TZzzComponent = class(TComponent)
  private
    FParam: string;
  public
    property Param: string read FParam;
    constructor Create(AOwner: TComponent; const AParam: string); reintroduce;
  end;
...
{ TZzzComponent }

constructor TZzzComponent.Create(AOwner: TComponent; const AParam: string);
begin
  inherited Create(AOwner);
  FParam:=AParam;
end;

использование:
Код:
TZzzComponent.Create(Self, 'hello world');

Нам, а не подскажешь, с какой версии ввели reintroduce?
Ответить с цитированием
  #9  
Старый 27.03.2015, 08:08
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от lmikle
Нам, а не подскажешь, с какой версии ввели reintroduce?
По логике, reintroduce должен был быть введен вместе с overload, то есть в Delphi 4. Работающего Delphi 4 под рукой нет, есть Delphi 6, в нем reintroduce уже есть.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #10  
Старый 27.03.2015, 08:11
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

с ходу не могу сказать. да и проверить сейчас только минимум на Delphi 7 есть возможность. старенькие версии (Delphi 4, 5, 6) дома на архивных болванках есть, но нужно время их найти, установить.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:40.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter