Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1254990753
palva
2009-10-08 12:32
2009.11.22
Ошибка при работе с ADODataSet Access тип DEC


2-1255265203
AlexDan
2009-10-11 16:46
2009.11.22
form2.memoN в rave reports..


2-1254927060
Алексей Зотов
2009-10-07 18:51
2009.11.22
Как доработать или использовать функцию Поиска?


15-1253426542
oldman
2009-09-20 10:02
2009.11.22
Отсутствие аварийных сигналов при старте


11-1204721952
Сашик
2008-03-05 15:59
2009.11.22
Активный Control





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