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