Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.14;
Скачать: CL | DM;

Вниз

Создание разных форм в одной процедуре   Найти похожие ветки 

 
DmitryNekl ©   (2004-01-23 13:32) [0]

Здравствуйте.

Подскажите, пожалуйста.

Есть MDI-приложение. Форма Form1 (класса TForm1) - главная форма, формы Form2 (TForm_1) и Form3 (TForm_2) - дочерние.
Формы в приложении должны быть в единственном экземпляре и создаются при кликах на пункты меню. Использую код:

procedure TForm1.N1Click(Sender: TObject);
var
frm: TForm_1;
i: integer;
IsFrmExists: boolean;
begin
IsFrmExists:=false;
for i:=0 to MDIChildCount-1 do
if (MDIChildren[i] is TForm_1) then IsFrmExists:=true;
if not IsFrmExists then
begin
frm:=TForm_1.Create(Application);
frm.Show;
end
end;

procedure TForm1.N2Click(Sender: TObject);
var
frm: TForm_2;
i: integer;
IsFrmExists: boolean;
begin
IsFrmExists:=false;
for i:=0 to MDIChildCount-1 do
if (MDIChildren[i] is TForm_2) then IsFrmExists:=true;
if not IsFrmExists then
begin
frm:=TForm_2.Create(Application);
frm.Show;
end
end;


Процедуры отличаются только типом переменной frm, хочется объединить их.

Как сделать это оптимальным образом? Я перепробовал кучу вариантов, и ни один мне не удалось заставить нормально работать.

И второй вопрос: в строке frm:=TForm_2.Create(Application);
оптимальнее использовать Application, Form1 или что-то еще?

Заранее спасибо.


 
Юрий Зотов ©   (2004-03-03 18:06) [1]

procedure TForm1.N1N2Click(Sender: TObject);
var
FormClass: TFormClass;
i: integer;
begin
if Sender = N1 then
FormClass := TForm_1
else FormClass := TForm_2;
for i := 0 to MDIChildCount - 1 do
if MDIChildren[i] is FormClass then Exit;
FormClass.Create(Application).Show
end;


 
Семен Сорокин ©   (2004-03-03 18:13) [2]

2DmitryNekl
а зачем MDIChild"у делать Show, он же и так видимым создается?


 
DmitryNekl ©   (2004-03-03 18:13) [3]

Огромное спасибо! А насчет второго вопроса? В качестве параметра для Create что лучше использовать?


 
Семен Сорокин ©   (2004-03-03 18:16) [4]

DmitryNekl © (03.03.04 18:13) [3]
В качестве параметра для Create используй объект, при уничтожении которого, будет уничтожаться твоя форму. Если сам ее убиваешь, то можно передавать nil.


 
DmitryNekl ©   (2004-03-03 18:40) [5]

Еще раз спасибо! Но появился новый вопрос. Чувствую, что глупый - но решение не приходит.

Добавил на форму ActionList, в соответствующих пунктах меню определил обработчик события - процедуру, приведенную Юрием Зотовым. Но Sender теперь - TAction... вводить разные обработчики для разных пунктов меню не очень хочется...

Есть ли какой элегантный способ внутри обработчика TForm1.CreateFormExecute(Sender: TObject) узнать, в результате нажатия на какой пункт меню произошло это событие?


 
Defunct ©   (2004-03-03 18:58) [6]

В качестве Sender отправлять MenuItem, а лучше Action который вызвал создание.

Далее в обработчике:
If Sender is TMenuItem Then
With Sender as TMenuItem Do
Begin
...
...
End Else
If Sender is TAction Then
With Sender as TAction Do
Begin
...
...
End;


 
Юрий Зотов ©   (2004-03-03 19:28) [7]

> DmitryNekl © (03.03.04 18:40) [5]
> Есть ли какой элегантный способ...

Расставьте свойство Tag (в связке Action1-MenuItem1-Button1 у всех Tag = 1, в связке Action2-MenuItem2-Button2 у всех Tag = 2 и т. д.). Затем просто используйте case вместо if:

case TComponent(Sender).Tag of
1: FormClass := TForm_1;
2: FormClass := TForm_2;
...
else Exit
end;



Страницы: 1 вся ветка

Текущий архив: 2004.03.14;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.02 c
3-43383
SergP
2004-02-14 14:35
2004.03.14
Как сделать что-то типа LIMIT в Access


8-43695
Sceleton
2003-11-10 08:07
2004.03.14
Как дать имя хранителю экрана.


1-43617
fatal
2004-03-02 15:11
2004.03.14
Вложить файл.


1-43488
Роман К
2004-02-29 14:01
2004.03.14
Можно ли включить визуальный стиль XP только для своей программы


4-43965
yorik
2004-01-04 12:26
2004.03.14
Переименовать папку