Текущий архив: 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.46 MB
Время: 0.011 c