Форум: "Основная";
Поиск по всему сайту: 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.015 c
1-80484           Alexandr              2002-03-12 15:05  2002.03.25  
Парсинг


1-80592           Hermit                2002-03-06 10:04  2002.03.25  
Ищется дискета к книге


14-80693          nick_vstu             2002-02-11 03:24  2002.03.25  
Что такое сабж?


1-80480           Lenidus               2002-03-08 00:53  2002.03.25  
Как узнать что мышь вошла/вышла с компонента, если у этого компонента нет события OnMouseMove?


14-80674          dmitriyk              2002-02-12 04:37  2002.03.25  
Дельфи и распечатка исходного текста на принтере