Естественно, эта технология подразумевает написание некоторого кода, поэтому, если вы не расположены к этому действию, пропустите мое дальнейшее повествование.
TMyForm = class(TForm)
…
private
FormVar: ^TMyForm;
public
constructorCreate(AOwner: TComponent; varAFormVar: TMyForm);
destructorDestroy; override;
end;
constructorTMyForm.Create(AOwner: TComponent; varAFormVar: TMyForm);
begin
FormVar := @AFormVar;
inheritedCreate;
.....
end;
destructorTMyForm.Destroy;
begin
FormVar^ := nil;
inheritedDestroy;
end;
MyForm := TMyForm.Create(Self, MyForm);
MyOtherForm := TMyForm.Create(Self, MyOtherForm);
Этот код при разрушении окна автоматически сбрасывает все, что вы передаете в AFormVar, в nil.
Как вы, наверное, заметили, частный член FormVar реально является указателем на указатель. Так, читая содержимое памяти, адрес которой содержится в FormVar, мы реально получаем переменную формы. Таким образом мы можем просто установить ее в nil.
– Jeff Fisher
Условие создания главной формы?
Существует ли в Delphi возможность создавать главную форму по условию? Я хочу использовать условие IF (в зависимости от передаваемого параметра) для того, чтобы определить какая форма будет главной при старте приложения. Фактически «другую» форму НЕ нужно будет загружать.
Хитрость здесь заключается в том, что мы предоставляем компилятору весь необходимый для создания форм код, но не допускаем его выполнения (IF FALSE THEN), при этом компилятор не ругается, а мы тем временем (во время выполнения приложения) выбираем и создаем главную форму. Вот пример кода, измененный .DPR-файл, который при старте случайным образом выбирает из друх форм главную:
begin
IF FALSE THEN BEGIN
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
END;
Randomize;
IFRandom < 0.5 THENApplication.CreateForm(TForm1, Form1)
ELSEApplication.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;
whileR <> 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;
caseR of
MrNext : Inc(CurForm);
MrPrevious : Dec(CurForm);
end;
// эти 2 строчки позволят нам не выходить за границы
ifCurForm < 1 thenCurForm := 2
else ifCurForm > 2 thenCurForm := 1;
end; // while
end;
Шаг 3. Добавьте формы 1 и 2 (и любые другие, какие вы хотите иметь) в список используемых модулей формы mainform.
Шаг 4. В форме Form1 и Form2 добавьте MainForm в список используемых модулей (чтобы они видели константы.)
Шаг 5. На форму Form1, Form2, и все последующие, добавьте 2 TBitBtn'а, с заголовками «Next» и «Previous». In the Onclick Events for these buttons add the following line of code.
Если это кнопка Next, добавьте: ModalResult := mrNext;
Читать дальше