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

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: Ed Jordan

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

{/codecitation}

Добавить комментарий