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