Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
11-1249461142
Jon
2009-08-05 12:32
2014.02.09
OnClick Perform Message


15-1377368884
Необычный Порошок
2013-08-24 22:28
2014.02.09
Микропроцессор в игрушечных роботах от WowWee


15-1377534392
картман
2013-08-26 20:26
2014.02.09
защита приложения


2-1364643389
TStas
2013-03-30 15:36
2014.02.09
Как нажать кнопку в чужом Ворде?


2-1365018269
ProgRAMmer Dimonych
2013-04-03 23:44
2014.02.09
Как правильно реализовать AutoSize?





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