Для вашей первой проблемы: добавьте еще один конструктор, например CreateAsMDI, например:
constructor TModalAndMDIForm.CreateAsMDI(AOwner: TComponent);
begin
f_blChild := true;
GlobalNameSpace.BeginWrite;
try
inherited CreateNew(AOwner);
if(not(csDesigning in ComponentState)) then begin
Include(FFormState, fsCreating);
try
FormStyle := fsMDIChild;
if(not(InitInheritedComponent(self, TForm))) then
raise Exception.CreateFmt('Can't create %s as MDI child', [ClassName]);
finally
Exclude(FFormState, fsCreating);
end;
end;
finally
GlobalNameSpace.EndWrite;
end;
end;
В обычном конструкторе просто установите переменную f_blChild в false и вызовите унаследованное создание.
Вам нужны еще две вещи, скорее самообъясняющие:
procedure TModalAndMDIForm.Loaded;
begin
inherited;
if(f_blChild) then
Position := poDefault
else begin
Position := poOwnerFormCenter;
BorderStyle := bsDialog;
end;
end;
//-----------------------------------------------------------------------------
procedure TModalAndMDIForm.DoClose(var Action: TCloseAction);
begin
if(f_blChild) then
Action := caFree;
inherited DoClose(Action);
end;
Теперь вы можете вызывать форму модальной, если она создана с помощью стандартного конструктора, и как дочернюю форму MDI, если она создана с помощью CreateAsMDI.
Если вы включите это в объявление формы
property IsChild: boolean read f_blChild;
вы даже можете делать что-то в зависимости от того, является ли форма дочерним элементом MDI или нет, просто опрашивая свойство isChild.
Что касается вашей второй проблемы: не используйте Application.CreateForm, а создайте свою форму самостоятельно:
Вот два творения для модала и MDI:
//Modal
frmDialog := TMyForm.Create(self);
// Your Code
frmDialog.ShowModal;
frmDialog.Release;
//MDI-Child
frmDialog := TMyForm.CreateChild(self);
// Your code
frmDialog.Show;
Я перевел этот ответ из статьи на сайте DelphiPraxis.
person
Ralph M. Rickenbach
schedule
22.09.2009