Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как обратиться к объекту в цикле [D7, XP]


dronchik ©   (2013-04-01 14:30:00) 

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

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

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

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


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

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


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


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

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:00) [2]

ControlCount - 1 только


Dimka Maslov   (2013-04-07 21:47:00) [3]

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;


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


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


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


Ega23   (2013-04-02 13:05:00) [5]


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


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

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


O'ShinW   (2013-04-02 12:46:00) [6]


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

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


Ega23   (2013-04-02 12:02:00) [7]


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


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


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


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

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


Ega23   (2013-04-02 11:34:00) [9]


> b := TButton.Create(Self);


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


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


>  b := TButton.Create(Application);


b := TButton.Create(Self);


TStas   (2013-04-01 23:43:00) [11]

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


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

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

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

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


clickmaker   (2013-04-01 15:02:00) [13]

> [0] dronchik   (01.04.13 14:30)

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


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


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

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


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

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

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


Ega23   (2013-04-01 14:44:00) [16]


> 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.


:)


MBo   (2013-04-01 14:39:00) [17]

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


O'ShinW   (2013-04-01 14:38:00) [18]

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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо