Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];




Вниз

Создание нескольких экземпляров формы 


DmitryPV   (2002-03-08 14:54) [0]

Добрый день! Столкнулся со следующей проблемой:
В моем приложении две формы:
Main - главная
Plan - обычная типа TPlan :)
На OnCreate главной формы вешаю создание и размещение на ней 5и кнопок btn_1...btn_5 и назначаю им обработчик OnClickbtn. Здесь все в порядке. Далее необходимо создать 5 экземпляров формы Plan, но так,чтобы они не только создались, но и имели - бы Name не Plan, а Plan1...Plan5.
Пишу такой код: (сокращенный вариант)
var New_plan: TForm;

for i:=1 to 5 do begin
Application.CreateForm(TPlan, New_plan);
New_plan.Name:="Plan"+IntToStr(i);
New_plan.Caption:="План N"+IntToStr(i);
end;
Так вот, 5 форм создаются, но имеют одно имя Plan. Как обойти эти грабли? Суть в том, что-бы при нажатии, допустим, btn_1 должен выводится Plan1 и т.д.. А число этих вещей задается при начальном конфигурировании т.е. не известно заранее сколько их будет.



Anatoly Podgoretsky   (2002-03-08 20:28) [1]

Никаких проблем ни с именами ни с заголовками нет. А почему ты рещил, что есть проблема?
У тебя проблема явно в обработчике OnClickbtn.
Единственно не ясно где ты их создаешь, надеюсь не в OnCreate главной формы?

Короче ты привел недостаточно информации, для определения проблемы.



LLL   (2002-03-08 21:34) [2]

>Anatoly Podgoretsky
Почему нельзя в OnCreate главной формы?



Anatoly Podgoretsky   (2002-03-08 22:58) [3]

Потому что первая созданная форма станет главной, а главная совсем не откроется. Можешь проверить на простом проекте.



DmitryPV   (2002-03-09 01:35) [4]

2 Anatoly Podgoretsky
"Единственно не ясно где ты их создаешь, надеюсь не в OnCreate главной формы?"

Разумеется! Они создаются на Main.OnShow. Немного модифицировал код:

for i:=1 to 5 do begin
Application.CreateForm(TPlan, New_plan);
New_plan.Caption:="План N"+IntToStr(i);
end;

Теперь формы создаются и имеют имена P_1..P_5. Будь любезен, подзкажи пожалуйста, как правильно написать обработчик OnClickbtn, что-бы все получалось как я описал в первом постинге!
Экспериментировал в течение дня, но ничего путного не получилось!

2 LLL
Anatoly Podgoretsky совершенно прав!



Sergey_n   (2002-03-09 01:57) [5]

Ну например в цикл вставить строчку
New_plan.Tag := I;
Ну и соответственно обрабботчик

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage("Plan"+IntToStr(TForm1(TButton(Sender).Parent).Tag));
end;



Anatoly Podgoretsky   (2002-03-09 02:23) [6]

DmitryPV (09.03.02 01:35)
Ну теперь они у тебя совсем без имен создаются :-)
Насчет обработчика, ты до сих пор не привел свой код, поэтому пока не о чем говорить.
К тому же лучще создавать не с помощью

Application.CreateForm(TPlan, New_plan);

а, with TPlan.Create(Self) do

не нужна переменная New_plan



reonid   (2002-03-09 11:40) [7]

Сделай в TPlan процедуру BtnClick(Sender) {в ней - ShowModal, например},
и в цикле

New_Button := TButton.Create(Self);
New_Button.Parent := Self;
New_Plan := TPlan.Create(Self);
New_Button.OnClick := New_Plan.BtnClick; // каждая кнопка вызовет свою форму



DmitryPV   (2002-03-09 13:01) [8]

2 Anatoly Podgoretsky
В обработчике события нажатия на кнопку с определением какая кнопка нажата проблем нет.
if TControl(Sender).Name и т.д.
Вопрос состоит в том, как мне получить ссылку на нужный мне эземпляр формы Plan. Делал так:

for i:=1 to 5 do begin
with TPlan.Create(Self) do begin
Name:="Plan"+IntToStr(i);
Tag:=i;
Caption:="План N"+IntToStr(i);
Show;
end;

Формы выводятся, с Caption-ми - порядок.
Eсли при разработке на форму Plan поместить Label и в
TPlan.OnShow прописать Label.Caption:=Name;, то на всех формах
отображается: Plan1...Plan5. То-же порядок.

Как в обработчике события нажатия на кнопку вывести хотя-бы, например, Plan1? Если при разработке написать: Plan1.Show;, то компилятор ругается - все правильно, такой формы пока нет. А если
написать with Application.FindComponent("Plan1") do Show; , то ничего не происходит.

Далее, хотелось-бы узнать как вообще в цикле организовать обращение к формам приложения, на подобие как это делается при работе с массивами контролов на форме типа FindComponent и т.п..
В книгах и поиске, что-то пока ничего не найти, хотя как-то эта тема здесь проскакивала.



Anatoly Podgoretsky   (2002-03-09 13:17) [9]

Ты можешь просто держать ссылки на формы в {динамическом} массиве/списке, вместо with TPlan.Create(Self) do begin напиши

List[I] := TPlan.Create(Self);
List[I].xxx := yyy;
...
List[I].Show;



DmitryPV   (2002-03-09 15:16) [10]

Господа, большое спасибо!
Проблема решена действительно с помощью динамического массива:

var Plans: array of TForm;

SetLength(Plans, 5);

for i:=0 to 4 do begin
Plans[i]:=TPlan.Create(Self);
with Plans[i] do begin
Name:="Plan"+IntToStr(i+1);
Caption:="План N"+IntToStr(i+1);
end;
end;

А обработчик нажатия кнопки (можно, конечно и изящнее):

var A: integer;

A:=StrToInt(Copy(TControl(Sender).Name,2,1));
Plans[i-1].Show;




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.033 c
1-80566           SuperIgor             2002-03-10 02:03  2002.03.25  
CreateFile


1-80607           Ольга                 2002-02-28 11:15  2002.03.25  
Outlook


1-80601           Kozhanov              2002-03-11 13:21  2002.03.25  
проблема с MouseEnter и MouseLeave


1-80557           Lion                  2002-03-09 23:49  2002.03.25  
StringGrid


1-80529           Лена                  2002-03-13 10:05  2002.03.25  
Построение графика в Chart