Есть действительно простой способ избежать этого. Дайте вашему новому конструктору другое имя. В отличие от некоторых других популярных языков, Delphi имеет именованных конструкторов ; вам не нужно называть их «Создать». Вы можете вызвать ваш новый CreateWithDataset и вообще не мешать виртуальному конструктору Create.
TfrmEndoscopistSearch = class(TForm)
/// original constructor kept for compatibility
constructor Create(AOwner: TComponent); override;
/// additional constructor allows for a caller-defined base data set
constructor CreateWithDataset(AOwner: TComponent; ADataSet: TDataSet; ACaption: string = '');
end;
Фактически, если вы не создаете экземпляр этого класса полиморфно, вам даже не нужен оригинальный конструктор. Вы можете объявить свой новый как это:
TfrmEndoscopistSearch = class(TForm)
/// additional constructor allows for a caller-defined base data set
constructor Create(AOwner: TComponent; ADataSet: TDataSet; ACaption: string = ''); reintroduce;
end;
Попытка вызова конструктора с одним аргументом непосредственно в TfrmEndoscopistSearch приведет к ошибке компиляции.
(Создание его полиморфно обычно включает использование Application.CreateForm:
Application.CreateForm(TfrmEndoscopistSearch, frmEndoscopistSearch);
Это всегда вызывает виртуальный конструктор с одним аргументом, представленный в TComponent. Если это не ваша основная форма, вам не нужно это делать. Я уже писал о своих чувствах на Application.CreateForm раньше.)