Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.014 c
14-43760
Delphin
2004-02-19 15:11
2004.03.14
Hi all!! Кто - нить знает принципы работы Нюков ? (Nuke)


7-43904
Alien
2003-12-24 05:37
2004.03.14
Как определить метку диска (дискеты...)


3-43396
nucl
2004-02-13 17:27
2004.03.14
ADO Connection


1-43660
mifril
2004-03-02 01:00
2004.03.14
COM: причуды реализации на Delphi


1-43643
snake1977
2004-03-02 08:43
2004.03.14
Паралельная работа с файлами





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский