Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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;



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

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

Наверх





Память: 0.47 MB
Время: 0.005 c
14-80683
McSimm
2002-02-11 12:01
2002.03.25
Задачка с подвохом


1-80552
--Reporter--
2002-03-09 12:16
2002.03.25
Проблемы с res-файлом


14-80670
Merlin
2002-02-08 13:42
2002.03.25
Логотип


3-80447
KIR
2002-02-27 00:36
2002.03.25
Вопрос специалистам по FastReport


1-80484
Alexandr
2002-03-12 15:05
2002.03.25
Парсинг





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский