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

Вниз

Как обратиться к объекту в цикле   Найти похожие ветки 

 
dronchik   (2013-04-01 14:30) [0]

Добрый день, уважаемые гуру. Необходима ваша помощь!!!

Суть задачи такова: Допустим имеется на форме 1000 объектов типа TButton  с именами Button1, Button2, Button3 ... Button1000.

Мне необходимо каждому объекту изменить свойства:

Form1.Button1.Caption:="Кнопка";
Form1.Button1.Font.Color:= clRed;
...  ну и еще с 10 свойств (к примеру)


Так  вот вопрос, как это сделать в цикле?
Где значение переменной I соответствовало бы числу в названии кнопки.

For i:= 1 to 1000 do
 begin
  Form1.ButtonI.Caption:="Кнопка";
  Form1.ButtonI.Font.Color:= clRed;
  ...
 end;


Подскажите пожалуйста, как это реализовать.
Пока ничего не приходит на ум.
Заранее благодарен.


 
O'ShinW ©   (2013-04-01 14:38) [1]

For i:= 0 to form1.ComponentCount - 1 do
begin
  if form1.Components[i] is TButton then
if TButton( form1.Components[i]).name = "Button" + strtoint(I) then

end;


 
MBo ©   (2013-04-01 14:39) [2]

FindComponent найдёт компонент по имени, но такой дизайн программы неудачен.


 
Ega23 ©   (2013-04-01 14:44) [3]


> O"ShinW ©   (01.04.13 14:38) [1]



unit Unit48;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm48 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form48: TForm48;

implementation

{$R *.dfm}

procedure TForm48.Button1Click(Sender: TObject);
var
 i, j: Integer;
begin
 j := 0;
 for i := 0 to ComponentCount - 1 do
   if Components[i] is TButton then
     Inc(j);
 ShowMessage(Format("ButtonCount = %d", [j]));
end;

procedure TForm48.FormCreate(Sender: TObject);
var
 b: TButton;
begin
 b := TButton.Create(Application);
 b.Parent := Self;
 b.SetBounds(100, 100, 100, 25);
 b.OnClick := Button1Click;
end;

end.


:)


 
Григорьев Антон ©   (2013-04-01 14:45) [4]

http://www.delphikingdom.com/asp/answer.asp?IDAnswer=71458

Но тысяча кнопок на форме - это жесть


 
Ega23 ©   (2013-04-01 14:47) [5]


> Но тысяча кнопок на форме - это жесть

Minsweeper, чо тут думать-то :)


 
clickmaker ©   (2013-04-01 15:02) [6]

> [0] dronchik   (01.04.13 14:30)

для оптимизации рекомендуют разворачивать циклы. Тебе же несложно 1000 раз ctrl+c-ctrl+v нажать, а прога будет шустрее работать


 
dronchik   (2013-04-01 15:24) [7]

> Но тысяча кнопок на форме - это жесть

Да, я согласен.
Но, 1000 это я взял для примера. Что их не одна, не 10 а очень много.
Ну, и не кнопка, а другие разные объекты. Но смысл тот же.

Спасибо за ссылки (извините, что сам не нашел) и за советы благодарю.
Сейчас попробую переварить. Вышеизложенное


 
TStas ©   (2013-04-01 23:43) [8]

Только вот цикл по ComponentCount будет работать, только если все объекты созданы в Design time, у них тогда владелец - форма. А если Вы их Run time создаёте в зависимости от чего-то, то надо их владельца учитавать или спечиально создавать от формы. Просто когда куча объектов, они обычно на PageControl бывают.


 
Игорь Шевченко ©   (2013-04-02 11:22) [9]


>  b := TButton.Create(Application);


b := TButton.Create(Self);


 
Ega23 ©   (2013-04-02 11:34) [10]


> b := TButton.Create(Self);


Я это сделал намеренно, дабы Владу "предъявить". :)
Это к тому, что в общем случае поиск по ComponentCount не совсем корректен.
Я могу ведь и от nil создать, а сами кнопки в TObjectList запихать с очисткой на Form.Destroy.


 
O'ShinW ©   (2013-04-02 12:00) [11]


> Я могу ведь и от nil создать

:)
- Доктор, я когда вот так делаю
/*встает на четвереньки, закидывает пятку за голову
то мне больно в боку.
- не делайте так. Следующий!


 
Ega23 ©   (2013-04-02 12:02) [12]


> - не делайте так. Следующий!


На самом деле - сплошь и рядом, особенно в плане не визуальных компонентов.


 
O'ShinW ©   (2013-04-02 12:46) [13]


> На самом деле - сплошь и рядом, особенно в плане не визуальных
> компонентов.

А потом их самостоятельно прибиваешь?
вместо InsertControl/InsertComponent


 
Ega23 ©   (2013-04-02 13:05) [14]


> А потом их самостоятельно прибиваешь?


Естественно.

 with TOpenDialog.Create(nil) do
  try
    if Execute then
      Something.LoadFrom(FileName);
  finally
    Free;
  end;


 
Очень Злой   (2013-04-07 18:08) [15]


> Да, я согласен.
> Но, 1000 это я взял для примера. Что их не одна, не 10 а
> очень много.
> Ну, и не кнопка, а другие разные объекты. Но смысл тот же.
>


Ты эти объекты в таких количествах как создаешь?


 
Dimka Maslov ©   (2013-04-07 21:47) [16]

procedure ListButtons(Ctrl: TWinControl; List: TList)
var
 i: Integer;
begin
 with Ctrl do for i := 0 to ControlCount do begin
   if Controls[i] is TButton then List.Add(Controls[i]) else
   if Controls[i] is TWinControl then ListButtons(Controls[i]);
end;
end;

procedure TForm1.Button1Click(Sender: TObject)
var
 List: TList;
 i: Integer;
begin
 List := TList.Create;
 try
   ListButtons(Self, List);
   for i := 0 to List.Count - 1 do with TButton(List[i]) do begin
     Caption := "Кнопко";
     Font.Color := clRed;
   end;
 finally
   List.Free;
 end;
end;


 
Dimka Maslov ©   (2013-04-07 21:48) [17]

ControlCount - 1 только


 
Игорь Шевченко ©   (2013-04-07 22:49) [18]

procedure TForm1.Button1Click(Sender: TObject)
var
List: TList;
i: Integer;
begin
List := TList.Create; try ListButtons(Self, List);
  for i := 0 to List.Count - 1 do with TButton(List[i]) do begin Caption := "Кнопко"; Font.Color := clRed; end;
finally List.Free; end;
end;


Так лучше :)



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

Текущий архив: 2014.02.09;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.013 c
1-1320579862
DmitriyG.
2011-11-06 14:44
2014.02.09
Regexp в бинарниках


2-1364804378
dmitry87
2013-04-01 12:19
2014.02.09
работа с sqlite в xe3


15-1377514696
istok
2013-08-26 14:58
2014.02.09
ищем системного программиста...


8-1233922362
DesWind
2009-02-06 15:12
2014.02.09
Выделение полезного сигнала


2-1358728095
ad1951
2013-01-21 04:28
2014.02.09
Тест на Делфи