Форум: "Начинающим";
Текущий архив: 2014.02.09;
Скачать: [xml.tar.bz2];
ВнизКак обратиться к объекту в цикле Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.003 c