Советы по Delphi

         

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


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

- Ed Jordan [001052]



Содержание раздела