![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как обратиться к объекту в цикле [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;