Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.04.2017, 19:38
crazyman crazyman вне форума
Новичок
 
Регистрация: 22.04.2012
Сообщения: 99
Репутация: 10
По умолчанию Создать программно много компонентов

Всем привет! Добавляю чекбоксы в групбокс. Подскажите можно ли как-то добавить их в виде двумерного массива (мне нужно разместить 200 чекбоксов по 20 в строке из 10 строк). Кусок моего кода.
Код:
...
var
  FPass: TFPass;
  NChB: TCheckBox;

...

procedure TFPass.FormCreate(Sender: TObject);
var i:integer;
NChB: Array of TCheckBox;
begin
SetLength(NChB,i+1);
SetLength(NChB,j+1);
for i := 0 to 19 do
begin
NChB[i] := TCheckBox.Create(GroupBox2);
NChB[i].Top:=80;
NChB[i].Left:= 220+(i*35);
NChB[i].Parent:=GroupBox2;
NChB[i].Name:='NChB'+IntToStr(i+1);
NChB[i].Caption:=IntToStr(i+1);
NChB[i].Visible:=True;
NChB[i].BringToFront;
end;
Ответить с цитированием
  #2  
Старый 17.04.2017, 06:38
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, у тебя почти получилось:
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    gbCheckboxes: TGroupBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    ACB : Array [1..20,1..10] Of TCheckBox;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  I, J : Integer;
begin
  For J := 1 To 10 Do
    For I := 1 To 20 Do
      Begin
        ACB[I,J] := TCheckBox.Create(Self);
        ACB[I,J].Width := ACB[I,J].Height + Self.Canvas.TextWidth('888');
        ACB[I,J].Top := 16 + (J-1)*(ACB[I,J].Height+8);
        ACB[I,J].Left := 8 + (I-1)*(ACB[I,J].Width+8);
        ACB[I,J].Caption := IntToStr((J-1)*20 + I);
        ACB[I,J].Parent := gbCheckboxes;
      End;
end;

end.

PS. Мне по кнопке удобнее отлаживать.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
crazyman (21.04.2017)
  #3  
Старый 21.04.2017, 23:01
crazyman crazyman вне форума
Новичок
 
Регистрация: 22.04.2012
Сообщения: 99
Репутация: 10
По умолчанию

Огромное спасибо за подсказку, но теперь подскажите как можно в своем дальнейшем коде обратиться к к конкретному чекбоксу.
Ответить с цитированием
  #4  
Старый 22.04.2017, 02:01
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Точно так же, как они создаются:
Код:
...
if ACB[1,1].Checked Then ...

Если надо обращаться по порядковому номеру, то, например, через такую функцию:
Код:
function TForm1.CheckBoxByNumber(N : Integer) : TCheckBox;
var
  I, J : Integer;
begin
  I := ((N-1) div 20) + 1;
  J := N - (I-1) * 20
  Try
    Result := ACB[I,J];
  Except
      Result := Nil;
  End;
end;
Вроде так.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
crazyman (22.04.2017)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:17.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter