Помогите мне создать функцию, с помощью которой я передам  переменные в TFormClass? Проблема в том, что MyDlg.Execute() не захотела  компилироваться, поскольку, как сообщил мне компилятор, я не могу использовать  MyDlg (определенный как: TForm).
 Эта функция может выглядеть примерно так: 
function ExecuteDialog( FormClass:  TFormClass; var Data ): Boolean;  
Я могу вам дать еще один совет: сделать все ваши формы наследниками одного  класса, в котором объявлены виртуальные методы SetData и GetData. 
 { ----------------------- }
 unit ExecFrms;
 interface
 uses Forms, Controls;
 type
 TExecForm = class( TForm )
 public
 procedure GetData( var Data ); virtual;  abstract;
 procedure SetData( var Data ); virtual;  abstract;
 end;
 TExecFormClass = class of TExecForm;
 function ExecuteDialog( FormClass: TExecFormClass;
 var Data ): Boolean;
 implementation
 function ExecuteDialog( FormClass: TExecFormClass;
 var Data ): Boolean;
 begin
 with FormClass.Create( Application ) do
 try
 SetData( Data );
 Result := ShowModal = mrOK;
 if Result then GetData( Data );
 finally
 Release;
 end;
 end;
 end.
 { -----------------------  }
 
Как вы можете видеть, я поместил функцию ExecuteDialog в тот же самый модуль. 
После того как Delphi создаст форму, вы должны в модуле формы сделать четыре  вещи: 
- вручную измените предка формы, с TForm на TExecForm;  
- добавьте ExecFrms в список используемых модулей;  
- добавьте тип записи для хранения данных, необходимых диалогу; и  
- перекрыть методы SetData и GetData.
{ ----------------------- }
 unit MyDlgs;
 interface
 uses WinTypes, WinProcs, Classes, Graphics, Forms,
 Controls, Buttons, StdCtrls, Spin, ExtCtrls,
 ExecFrms;
 type
 { Запись для данных, необходимых модальной  форме... }
 TMyDlgData = record
 FormCaption: string;
 FormWidth: Integer;
 end;
 TMyDlg = class( TExecForm )
 OKBtn: TBitBtn;
 CancelBtn: TBitBtn;
 HelpBtn: TBitBtn;
 Bevel1: TBevel;
 Edit1: TEdit;
 SpinEdit1: TSpinEdit;
 public
 procedure SetData( var Data ); override;
 procedure GetData( var Data );  override;
 end;
 var
 MyDlg: TMyDlg;
 implementation
 {$R *.DFM}
 procedure TMyDlg.SetData( var Data );
 begin
 with TMyDlgData( Data ) do
 begin
 Edit1.Text := FormCaption;
 SpinEdit1.Value := FormWidth;
 end;
 end;
 procedure TMyDlg.GetData( var Data );
 begin
 with TMyDlgData( Data ) do
 begin
 FormCaption := Edit1.Text;
 FormWidth := SpinEdit1.Value;
 end;
 end;
 end.
 { -----------------------  }
 Затем создаем и выполняем диалог, который должен выглядеть приблизительно  так: 
 { Добавьте ExecFrms и MyDlgs в список USES  вызывающего модуля. }
 procedure TForm1.GetNewCaptionAndWidthBtnClick( Sender:  TObject );
 var
 Data: TMyDlgData;
 begin
 Data.FormCaption := Caption;
 Data.FormWidth := Width;
 if ExecuteDialog( TMyDlg, Data ) then
 begin
 Caption := Data.FormCaption;
 Width := Data.FormWidth;
 end;
 end;
 
Не поверите: данный код работает еще со времён Turbo Vision!