Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
4 / 2 / 2
Регистрация: 02.02.2021
Сообщений: 206

Создать кнопки програмно

30.06.2022, 06:40. Показов 1760. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток форумчане, подскажите как правильно создавать програмно кнопки ?
Делаю расчёт ширины/ высоты Panel1, исходя из её размеров создется количество кнопок в ряд и сколько будет рядов. Делается запрос к БД - сколько всего кнопок. И начинаю их создавать. Но при создании кнопок - второй ряд не получается создать, он всегда съезжает, подскажете как правильно создавать. И если будет, например количество кнопок более 2х/3х рядов - посоветуйте как правильно реализовать?

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, md, Data.DB, Vcl.Grids, Vcl.DBGrids,
  Vcl.StdCtrls, Buttons, Vcl.ExtCtrls;
 
type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Panel1: TPanel;
    Label1: TLabel;
    Memo1: TMemo;
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  but:TBitBtn;
  lab1, lab2:Tlabel;
implementation
 
{$R *.dfm}
 
procedure MyGridSize(Grid: Tdbgrid);
const
  DEFBORDER = 10;
var
  temp, n, k: Integer;
  lmax: array of Integer;
begin
  with Grid do
  begin
    Canvas.Font := Font;
    setlength(lmax,(Columns.Count)); //задаем размер массива в зависимости от количества полей
    for n := 0 to Columns.Count - 1 do                        //
      lmax[n] := Canvas.TextWidth(Columns[n].Title.Caption);  //заносим в массив размеры имен полей
    grid.DataSource.DataSet.First;
    while not grid.DataSource.DataSet.EOF do
    begin
      for n := 0 to Columns.Count - 1 do                                   //
      begin                                                                //Сравниваем, если длина текста в ячейках поля
        temp := Canvas.TextWidth(trim(Columns[n].Field.DisplayText));      // больше чем длина имени поля
        if temp > lmax[n] then lmax[n] := temp;                            // Тогда перезаписываем значение в массиве на большее
      end; {for}
      grid.DataSource.DataSet.Next;
    end;
    grid.DataSource.DataSet.First;
    for n := 0 to Columns.Count - 1 do
    begin
 
       if lmax[n] >0  then                              //Собственно меняем размер колонок
        Columns[n].Width := lmax[n] + DEFBORDER
        else
        Columns[n].Width := DEFBORDER
       end;
    end;
 
end;
 
procedure pusk();
begin
DM.ADOQuery1.Close;
DM.ADOQuery1.SQL.Clear;
DM.ADOQuery1.SQL.Add('SELECT * FROM table1');
DM.ADOQuery1.Open;
MyGridSize(Form1.DBGrid1);
end;
 
procedure knopki(kn:TButton; d:Tlabel; k:TLabel);
begin
DM.ADOQuery_kn.Close;
DM.ADOQuery_kn.SQL.Clear;
DM.ADOQuery_kn.SQL.Add('SELECT status, n FROM button WHERE n='''+kn.Caption+'''');
DM.ADOQuery_kn.Open;
if DM.ADOQuery_kn.Fields[0].AsInteger =0 then
 begin
 kn.Enabled:=false;
 end
  else
  begin
   kn.Caption:=DM.ADOQuery_kn.Fields[1].AsString;
   kn.Enabled:=true;;
   DM.ADOQuery_kn.Close;
   DM.ADOQuery_kn.SQL.Clear;
   DM.ADOQuery_kn.SQL.Add('SELECT otkr, vtare  FROM sprav WHERE n='''+kn.Caption+'''');
   DM.ADOQuery_kn.Open;
 
   d.Caption:=DM.ADOQuery_kn.Fields[0].AsString;
   k.Caption:=DM.ADOQuery_kn.Fields[1].AsString;
 
  end;
end;
 
procedure create1();  //создаем кнопки
var
t2, l2, i1, i2, kol_kn_h,t,l,h,w,i:integer;
p1,p2:real;
begin
i:=0;
h:=60;
w:=75;
t:=0;
l:=0;
l2:=0;
t2:=h;
kol_kn_h:=0;
       p1:=Trunc(Form1.Panel1.Width/w);
       p2:=Trunc(Form1.Panel1.Height/h);
       Form1.Memo1.Lines.Add('в ряд : '+FloatToStr(p1)+' | По горизонтали: '+FloatTOStr(p2)); //тут смотрим сколько в ряд
      DM.ADOQuery_kn.Close;
      DM.ADOQuery_kn.SQL.Clear;
      DM.ADOQuery_kn.SQL.Add('SELECT nomer, n  FROM button');
      DM.ADOQuery_kn.Open;
      DM.ADOQuery_kn.First;
      i1:=Round(p1);
      i2:=Round(p2);
       while not DM.ADOQuery_kn.Eof  do begin//создание кнопок
         i:=i+1;
         lab1:=TLabel.Create(Application);
         lab1.Parent:=Form1;
         
         lab2:=TLabel.Create(Application);
         lab2.Parent:=Form1;
         
         but:=TBitBtn.Create(Application);
         but.Parent:=Form1.Panel1;
              
         but.Height:=h;
         but.Width:=w;
                
         if (DM.ADOQuery_kn.Fields[0].AsInteger<=i1) then
         begin
           Form1.Memo1.Lines.Add(DM.ADOQuery_kn.Fields[0].AsString);
           but.Left:=l;
           but.Top:=t;
           l:=w*i;
         end
         else
         if (DM.ADOQuery_kn.Fields[0].AsInteger>=i2) then //тут съезжает, если количество кнопок из БД больше чем влазит в ряд
         begin
           Form1.Memo1.Lines.Add('Вниз '+DM.ADOQuery_kn.Fields[0].AsString);
           but.Left:=l2+w;
           but.Top:=t2;
           l2:=w*i;
         end;
              but.caption:=DM.ADOQuery_kn.Fields[1].AsString;
              DM.ADOQuery_kn.Next;
       end;
 
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
create1();
end;
 
end.
Вложения
Тип файла: 7z Proj.7z (78.9 Кб, 2 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.06.2022, 06:40
Ответы с готовыми решениями:

Создать программу програмно
привет всем! у меня такой вопрос возник, можно ли в делфи создать программу в определенной папке в ходе программы. например: программа...

Програмно создать image
как програмно создать компонент imege в PageControl и залить в imege картинку??? зарание благодарен.

Как можно програмно создать папку?
Как можно програмно создать папку?

21
4 / 2 / 2
Регистрация: 02.02.2021
Сообщений: 206
01.07.2022, 10:45  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от AzAtom Посмотреть сообщение
вроде, созданный grid надо настроить. Хотя бы, задать количество строк и столбцов, о чём выше уже писали. И уже потом добавлять туда эти 3 элемента.
Именно это у меня то и не получается =D, хотя я указываю параметры вновь создаваемого GridPanel, они в строку или по порядку создаются(стр 38-39), но не в нужном мне порядке

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
procedure panel_create();
var
  rowCount, colCount, i : integer;
  aButton: TButton;
  item : TControlItem;
begin
 
 
  rowCount:= 2;  //ячеек
  colCount:= 5; // колонок
  Form1.GridPanel1.RowCollection.BeginUpdate;
  Form1.GridPanel1.ColumnCollection.BeginUpdate;
 
  for i := 0 to -1 + Form1.GridPanel1.ControlCount do
    Form1.GridPanel1.Controls[0].Free;
 
  //btw, cannot clear if there are controls, so first remove "old" controls above
  Form1.GridPanel1.RowCollection.Clear;
  Form1.GridPanel1.ColumnCollection.Clear;
 
  for i := 1 to rowCount do
    with Form1.GridPanel1.RowCollection.Add do
    begin
      SizeStyle := ssPercent;
      Value := 100 / rowCount; //have cells evenly distributed
    end;
 
  for i := 1 to colCount do
    with Form1.GridPanel1.ColumnCollection.Add do
    begin
      SizeStyle := ssPercent;
      Value := 100 / colCount; //have cells evenly distributed
    end;
 
  for i := 0 to -1 + rowCount * colCount do
  begin
    grid:=TgridPanel.Create(Form1.GridPanel1);
    grid.ColumnCollection.Add.Index:=0; //одно колонка
    grid.RowCollection.Add.Index:=2;  //строки
    grid.Parent := Form1.GridPanel1; //magic: place in the next empty cell
 
    lab1 := Tlabel.Create(grid);
    lab1.Caption:='123';
    lab1.Parent := grid;
 
    aButton := TButton.Create(grid);
    aButton.Parent := grid; //magic: place in the next empty cell
    aButton.Caption := 'Btn ' + IntToStr(i);
    aButton.Align := alClient;
 
    lab2 := Tlabel.Create(grid);
    lab2.Caption:='345';
    lab2.Parent := grid;
  end;
 
  Form1.GridPanel1.RowCollection.EndUpdate;
  Form1.GridPanel1.ColumnCollection.EndUpdate;
end;
0
Нарушитель
10901 / 5835 / 1289
Регистрация: 12.03.2015
Сообщений: 26,928
01.07.2022, 12:44
Цитата Сообщение от MixanMM Посмотреть сообщение
Именно это у меня то и не получается
Я тебе готовую прогу дал, из неё скопипасть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.07.2022, 12:44

Програмно изменить стиль кнопки
Возможно ли это? Где-то (на англоязычных форумах) читал что НЕТ. :( Но может я плохо читал или придумали уже... Цель - Нажимаю на...

Создание процедуры кнопки програмно
Создаю кнопку: Worksheets(1).OLEObjects.Add ClassType:='Forms.CommandButton.1'Подскажите каким образом написать код для этой кнопки (из...

Програмно нажать кнопки на сайте
На сайте есть кнопки для выполнения задания. Нужно нажать 6 кнопок чтобы отправить запрос. Как это можно сделать программно ? За нажатие...

Как програмно нажимать кнопки на клаве
Как отправить сообщение Винде о том что нажата клавиша клавиатуры, мыши (хотя ничего нажато и не было). Combat

Програмно создать БД
Нужно создать БД программно, и пару таблиц с несколькими полями в ней же. Собственно как это сделать то? Заранее спасибо.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru