Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

– Neil J. Rubenking

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

Delphi 1

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

Поделиться с друзьями: