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

ЖАНРЫ

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

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

Шрифт:

Освобождение экземпляров формы

Delphi 1

В нашем примере для решения задачи мы передаем конструктору переменную формы. Затем, при закрытии формы, мы сбрасываем эту переменную.

Естественно, эта технология подразумевает написание некоторого кода, поэтому, если вы не расположены к этому действию, пропустите мое дальнейшее повествование.

TMyForm = class(TForm)

private

 FormVar: ^TMyForm;

public

 constructor Create(AOwner: TComponent; var AFormVar: TMyForm);

 destructor Destroy; override;

end;

constructor TMyForm.Create(AOwner: TComponent; var AFormVar: TMyForm);

begin

 FormVar := @AFormVar;

 inherited Create;

 .....

end;

destructor TMyForm.Destroy;

begin

 FormVar^ := nil;

 inherited Destroy;

end;

MyForm := TMyForm.Create(Self, MyForm);

MyOtherForm := TMyForm.Create(Self, MyOtherForm);

Этот

код при разрушении окна автоматически сбрасывает все, что вы передаете в AFormVar, в nil.

Как вы, наверное, заметили, частный член FormVar реально является указателем на указатель. Так, читая содержимое памяти, адрес которой содержится в FormVar, мы реально получаем переменную формы. Таким образом мы можем просто установить ее в nil.

– Jeff Fisher 

Условие создания главной формы?

Delphi 2 

Существует ли в Delphi возможность создавать главную форму по условию? Я хочу использовать условие IF (в зависимости от передаваемого параметра) для того, чтобы определить какая форма будет главной при старте приложения. Фактически «другую» форму НЕ нужно будет загружать.

Хитрость здесь заключается в том, что мы предоставляем компилятору весь необходимый для создания форм код, но не допускаем его выполнения (IF FALSE THEN), при этом компилятор не ругается, а мы тем временем (во время выполнения приложения) выбираем и создаем главную форму. Вот пример кода, измененный .DPR-файл, который при старте случайным образом выбирает из друх форм главную:

begin

 IF FALSE THEN BEGIN

Application.CreateForm(TForm1, Form1);

Application.CreateForm(TForm2, Form2);

 END;

 Randomize;

 IF Random < 0.5 THEN Application.CreateForm(TForm1, Form1)

 ELSE Application.CreateForm(TForm2, Form2);

 Application.Run;

end.

Пара

«подходящих» для CreateForm форм заключено в никогда не выполнимый блок, тем самым приводя компилятор в состояние свинячего восторга.

– Neil Rubenking

Динамическое создание и циклическое связывание форм

Тема: Динамическое создание и циклическое связывание форм

Как сделать простой метод, переключающий между формами?

Как мне добавить возвращаемые результаты к моей ShowModal-форме?

Как мне создавать экземпляры форм во время выполнения приложения?

Необходимый для осуществления этого метод очень прост. В моем примере я использую 3 формы с именами Mainform, Form1 и Form2. На Mainform я установил кнопку, которая выводит Form1, из нее вы можете вызвать любое количество форм (перемещаться между ними) через соответствующие кнопки, расположенные на этих формах. В моем примере "переключение" происходит между формами Form1 и Form2.

Шаг 1. Разместите следующие две строчки в секции interface той формы, которая у вас будет главной:

const

 mrNext = 100;

 mrPrevious = 101;

Шаг 2. Разместите на главной форме кнопку и добавьте следующий код в обработчик события ее нажатия:

var

 MyForm: TForm;

 R, CurForm: Integer;

begin

 R := 0;

 CurForm := 1;

 while R <> mrCancel do begin

Case CurForm of

1: MyForm := TForm1.Create(Application);

2: MyForm := TForm2.Create(Application);

end;

try

R := MyForm.ShowModal;

finally

MyForm.Free;

end;

case R of

MrNext : Inc(CurForm);

MrPrevious : Dec(CurForm);

end;

// эти 2 строчки позволят нам не выходить за границы

if CurForm < 1 then CurForm := 2

else if CurForm > 2 then CurForm := 1;

 end; // while

end;

Шаг 3. Добавьте формы 1 и 2 (и любые другие, какие вы хотите иметь) в список используемых модулей формы mainform.

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