Передача переменных форме

Помогите мне создать функцию, с помощью которой я передам переменные в 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 создаст форму, вы должны в модуле формы сделать четыре вещи:

  1. вручную измените предка формы, с TForm на TExecForm;
  2. добавьте ExecFrms в список используемых модулей;
  3. добавьте тип записи для хранения данных, необходимых диалогу; и
  4. перекрыть методы 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!