Форум: "Начинающим";
Текущий архив: 2009.11.22;
Скачать: [xml.tar.bz2];
ВнизПеребор форм Найти похожие ветки
← →
Fr (2009-09-22 17:34) [0]Приложение создает несколько однотипных форм Form1. Как перебрать все созданные формы в цикле?
← →
{RASkov} © (2009-09-22 17:36) [1]Screen.FormCount
Screen.Forms[]
← →
Сергей М. © (2009-09-22 17:37) [2]Существующими в ран-тайм формами заведует объект Screen и его св-ва FormCount, Forms
← →
Fr (2009-09-22 17:44) [3]спасибо
← →
Fr (2009-09-25 16:38) [4]Есть форма, на ней 2 кнопки. По нажатию на первую плодятся формы на экране. При нажатии на вторую думал, что поменяется надпись на панели у формы с заголовком "3". В результате надпись меняется всегда у последней формы цикла for i:=0 to ... Почему? И как заставить смениться надпись напанели у нужной формы, а остальные оставить без изменения?:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
for i:=0 to 7 do begin
Form2:=TForm2.Create(Application);
Form2.Caption:=IntToStr(i);
Form2.Show;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var i: integer;
begin
for i:=0 to Screen.FormCount-1 do
if Screen.Forms[i].Caption="3" then begin
Form2.Panel2.Caption:="Сменили надпись";
break;
end;
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm2 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
end.
← →
Германн © (2009-09-25 16:46) [5]
> В результате надпись меняется всегда у последней формы цикла
> for i:=0 to ... Почему?
Потому что Form2.Panel2.Caption:="Сменили надпись";
← →
Thrashead (2009-09-25 16:48) [6]После создания новых Form2 ссылается на последнюю форму.
procedure TForm1.Button2Click(Sender: TObject);
var i: integer;
begin
for i:=0 to Screen.FormCount-1 do
if Screen.Forms[i].Caption="3" then begin
Screen.Forms[i].Panel2.Caption:="Сменили надпись";
break;
end;
end;
← →
Fr (2009-09-25 16:53) [7]
> Screen.Forms[i].Panel2.Caption:="Сменили надпись";
компилятор не пропускает
> Потому что Form2.Panel2.Caption:="Сменили надпись";
Как правильно плодить формы, чтобы потом ссылаться на нужную?
← →
Германн © (2009-09-25 16:55) [8]
> > Screen.Forms[i].Panel2.Caption:="Сменили надпись";
>
> компилятор не пропускает
>
TForm2(Screen.Forms[i]).Panel2.Caption:="Сменили надпись";
← →
Anatoly Podgoretsky © (2009-09-25 16:55) [9]> Fr (25.09.2009 16:38:04) [4]
Глобальные переменные до добра не доведут.
Для начала убери Form2: TForm2;
← →
Сергей М. © (2009-09-25 16:56) [10]
> надпись меняется всегда у последней формы цикла
А какая разница, какая по счету форма в списке Screen.Forms оказалась подходящей под условие Caption="3" ?
Если подписи у форм, которые ты наплодил, разные - а они действительно разные, судя по циклу, создающему формы, - то подпись панели изменится именно у той формы, которая тебя как раз и интересует, т.е. у формы с подписью "3"
← →
Германн © (2009-09-25 16:59) [11]
> Как правильно плодить формы, чтобы потом ссылаться на нужную?
>
>
Вариантов много. Массивы, списки и т.д.
← →
Anatoly Podgoretsky © (2009-09-25 17:02) [12]> Германн (25.09.2009 16:59:11) [11]
Вариантов один - Screen.Forms, остальное извращения.
← →
Германн © (2009-09-25 17:05) [13]
> Anatoly Podgoretsky © (25.09.09 17:02) [12]
>
> > Германн (25.09.2009 16:59:11) [11]
>
> Вариантов один - Screen.Forms, остальное извращения.
>
Слишком обобщаешь, имхо.
← →
Fr (2009-09-25 17:08) [14]
> Германн © (25.09.09 16:55) [8]
Это помогло :). Спасибо.
> Anatoly Podgoretsky © (25.09.09 16:55) [9]
Как тогда создавать однотипные формы? И как обращаться к их свойствам/методам?
← →
Сергей М. © (2009-09-25 17:14) [15]
> Это помогло
Как это могло помочь, если список - он и в Африке список ?)
Что собственный, что Screen.Forms - один шиш список)
← →
Leonid Troyanovsky © (2009-09-25 17:17) [16]
> Германн © (25.09.09 17:05) [13]
> Слишком обобщаешь, имхо.
Массивы и списки нужно еще снабжать механизмом
поддержания актуальности хранимого.
У Screen.Forms он есть.
Нах велосипеды с квадратными колесами.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2009-09-25 17:21) [17]
> Fr (25.09.09 17:08) [14]
> Как тогда создавать однотипные формы? И как обращаться к
> их свойствам/методам?
Однотипные - однотипно, IMHO.
А обращаться исходя из их типа.
--
Regards, LVT.
← →
Германн © (2009-09-25 17:23) [18]
> Leonid Troyanovsky © (25.09.09 17:17) [16]
Слишком обобщаешь, имхо. :)
← →
Leonid Troyanovsky © (2009-09-25 17:54) [19]
> Германн © (25.09.09 17:23) [18]
> Слишком обобщаешь, имхо. :)
Замахнулся на треугольные? :)
--
Regards, LVT.
← →
Германн © (2009-09-25 18:05) [20]
> Leonid Troyanovsky © (25.09.09 17:54) [19]
>
> Замахнулся на треугольные? :)
А почему бы и не?
:)
← →
Leonid Troyanovsky © (2009-09-25 18:11) [21]
> Германн © (25.09.09 18:05) [20]
> А почему бы и не?
]
Ну, ладно, долаживай, или, как там,
по новоязу положено.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2009-09-25 18:13) [22]Кочерга случайно прицепилась, sorry.
Виимо, нажал на что-то.
← →
Германн © (2009-09-25 18:18) [23]
> Виимо, нажал на что-то.
А нынче не нажал :)
← →
Leonid Troyanovsky © (2009-09-25 18:25) [24]
> Германн © (25.09.09 18:18) [23]
> > Виимо, нажал на что-то.
> А нынче не нажал :)
Неа, жал что-то, все не упомнишь.
Мобыть в твердое попал, иль в упругое.
--
Regards, LVT.
← →
Омлет (2009-09-25 22:52) [25]Я использую фреймы, наследованные от базового фрейма с абстрактными методами.
Возможно и формы можно наследовать.
← →
Fr (2009-10-09 17:10) [26]Не стал создавать новую тему, т.к. новый вопрос пересекается с первым.
Есть 2 формы. На первой кнопка и TEdit. На второй кнопка.
Первая:
...
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
for i:=0 to 4 do begin
TForm2.Create(Application);
end;
end;
...
Вторая:
...
type
TForm2 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
tmpArr: array[0..7] of integer;
end;
procedure v1();
implementation
uses Unit1;
{$R *.dfm}
procedure v1();
begin
ShowMessage(IntToStr(tmpArr[0])) // здесь ошибка компиляции
end;
procedure TForm2.FormCreate(Sender: TObject);
var i,j:Integer;
begin
j:=0;
for i:=0 to Screen.FormCount-1 do
if Pos("Form2",Screen.Forms[i].Name)>0 then inc(j);
Caption:=IntToStr(j);
tmpArr[0]:=j;
tmpArr[1]:=j*j;
Show;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
with TForm2(Screen.ActiveForm) do begin
Form1.Edit1.Text:=Caption+" "+IntToStr(tmpArr[0])+" "+
IntToStr(tmpArr[1]);
tmpArr[0]:=tmpArr[0]*15;
tmpArr[1]:=tmpArr[1]*15;
v1();
end;
end;
...
Вопрос: как запустить процедуру v1() из TForm2.Button1Click без перебора в ней Screen.Forms для определения нужной формы и доступа к tmpArr? Таких процедур будет много и в каждой перебирать экранные формы, по-моему, неправильно...
← →
Германн © (2009-10-09 17:44) [27]TButton(Sender).Parent
← →
anonims (2009-10-09 18:32) [28]слелать процклцру v1 методом
type
TForm2 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure v1;
public
{ Public declarations }
tmpArr: array[0..7] of integer;
end;
procedure v1();
implementation
uses Unit1;
{$R *.dfm}
procedure tform1.v1();
begin
ShowMessage(IntToStr(tmpArr[0]))
end;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.11.22;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.009 c