Форум: "Основная";
Текущий архив: 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.004 c