Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.11.22;
Скачать: CL | DM;

Вниз

Перебор форм   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.02 c
15-1253910608
Юрий
2009-09-26 00:30
2009.11.22
С днем рождения ! 26 сентября 2009 суббота


15-1253632350
Дмитрий Белькевич
2009-09-22 19:12
2009.11.22
Компонент, выглядящий как создать таблицу в office 2007


2-1255005256
Nub83
2009-10-08 16:34
2009.11.22
Линия на мониторе без формы


15-1253621448
Артур Пирожков
2009-09-22 16:10
2009.11.22
Можно ли записать радио?


2-1254729868
Virgo_Style
2009-10-05 12:04
2009.11.22
Взаимодействие с программой из открытого браузером html-документа