С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 07.08.2020
Сообщений: 16
1
RAD XE3+

Динамическое создание компонентов Trackbar и Label. Записать значение из TrackBar в Label

07.08.2020, 11:29. Показов 3663. Ответов 23

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
Ситуация следующая: нужно создать некоторое количество трэкбаров (количество задается пользователем) и иметь возможность видеть их текущее значение. Для этого написал следующий код, создаю динамически трэкбары и лэйблы, плюс обработчик событий, но не понимаю как сделать так. что бы данные "Position" отправлялись бы в нужный Label.

Мой код:

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
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls;
 
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    TrackBar1: TTrackBar;
    Label1: TLabel;
    Button1: TButton;
    procedure TrackBar1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure MyTBChange(Sender: TObject);
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Edit1Change(Sender: TObject);
begin
  Form1.Edit1.Alignment:=taCenter;
  Form1.Edit1.Width:=155;
  Form1.Edit1.Height:=26;
  Form1.Edit1.Font.Size:=11;
end;
 
 
 
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  Form1.Label1.Caption := IntToStr(TrackBar1.Position);
  Form1.Label1.Alignment := taCenter;
  Form1.Label1.Width:=155;
  Form1.Label1.Height:=26;
  Form1.Label1.Top:=80;
  Form1.TrackBar1.Top:=80+26;
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
var My_TB : TTrackbar;
My_LBL : TLabel;
i : integer;
N : integer;
begin
  N := StrToInt(Form1.Edit1.Text);
  for i := 1 to N do
    begin
    My_TB := TTrackBar.Create(Form1);
    My_TB.Parent := Form1;
    My_TB.OnChange := MyTBChange;
    My_TB.Left:=88;
    My_TB.Top:=80+(45+26)*i+26;
    My_TB.Width:=155;
    My_TB.Height:=45;
 
    My_LBL := TLabel.Create(Form1);
    My_LBL.Parent := Form1;
    My_LBL.Caption := Format('Label %d',[i]);
    My_LBL.Left:=88;
    My_LBL.Top:=80+(45+26)*i;
    My_LBL.Width:=155;
    My_LBL.Height:=26;
    My_LBL.Font.Size:=11;
    My_LBL.Alignment:=taCenter;
    My_LBL.Name:=Format('MyLabel%d',[i]);
 
    end
end;
//
procedure TForm1.MyTBChange(Sender: TObject);
var Bar : TTrackBar;
p : integer;
begin
  Bar := Sender as TTrackBar;
 
end;
 
 
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.08.2020, 11:29
Ответы с готовыми решениями:

Отображать значение TrackBar в Label
В общем тут 2 trackBar нужно сделать к нему Label где отображается значения trackBar (ползунок...

Загрузка из файла одной строки из нескольких(10) в TrackBar или Label
Всем привет) Нужно что бы по нажатию на кнопку из вручную выбранного файла(txt) в разные TrackBar1,...

Динамическое создание Label
Нужно создать программу, которая будет добавлять на форму метки с текстом. Местоположение и размеры...

Динамическое создание Label?
При таком раскладе все равно не отображается текст Label'а на форме. Почему перед типом Form...

23
5574 / 4425 / 1079
Регистрация: 29.08.2013
Сообщений: 27,692
Записей в блоге: 3
07.08.2020, 11:35 2
а в нужный это в какой?
0
0 / 0 / 0
Регистрация: 07.08.2020
Сообщений: 16
07.08.2020, 11:37  [ТС] 3
Для первого - первый, и так далее, для i-ого i-ый. Они создаются одновременно по нажатию кнопки.
0
Почетный модератор
64303 / 47600 / 32742
Регистрация: 18.05.2008
Сообщений: 115,181
07.08.2020, 11:45 4
Думаю нужно создать массивы создаваемых компонентов и в MasLabel[i] писать значение MasTB[i].
1
3048 / 1668 / 656
Регистрация: 19.03.2019
Сообщений: 5,372
07.08.2020, 11:53 5
Цитата Сообщение от pepu5 Посмотреть сообщение
Для первого - первый, и так далее, для i-ого i-ый. Они создаются одновременно по нажатию кнопки.
ну, можно сделать коряво:
1) добавить в создаваемые TTrackBar поле Name (странно, что ты его не добавил!)
2) Тогда у тебя в MyTBChange в есть имя TTrackBar - из него несложно получить номер TrackNumber и далее найти нужный label через
Delphi
1
MyLabel := TLabel( FindComponent( Format('MyLabel%d',[TrackNumber])));
а не коряво - завести массив/список c нужными label
и в My_TB.Tag прописать номер нужного Label:
Delphi
1
2
3
My_TB.Tag := i;
......
LabelList[i] := My_LBL;
1
0 / 0 / 0
Регистрация: 07.08.2020
Сообщений: 16
07.08.2020, 11:54  [ТС] 6
Цитата Сообщение от Puporev Посмотреть сообщение
Думаю нужно создать массивы создаваемых компонентов и в MasLabel[i] писать значение MasTB[i].
Буду очень признателен. если Вы сможете привести пример кода, который позволяет осуществить динамическое создание двух компонентов и запись значений одного в параметр другого Вашим способом. Я. к сожалению, пока не на столько хорошо владею языком.
0
Модератор
3756 / 2260 / 783
Регистрация: 15.11.2015
Сообщений: 8,994
07.08.2020, 12:06 7
Я бы адрес нужного Label поместил бы в Tag трэкбара.
2
Почетный модератор
64303 / 47600 / 32742
Регистрация: 18.05.2008
Сообщений: 115,181
07.08.2020, 12:16 8
Цитата Сообщение от pepu5 Посмотреть сообщение
позволяет осуществить динамическое создание двух компонентов
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
//объявим 2 динамических массива
var tb:array of TTrackBar;
      lb:array of TLabel;
.................
//вводим N
setlength(tb,n);
setlength(lb,n);
for i:=0 to n-1 do
 begin
  //присваиваем свойства для tb[i] и lb[i]
  lb[i].Caption:=inttostr(tb[[i].position);
 end;
1
Модератор
3756 / 2260 / 783
Регистрация: 15.11.2015
Сообщений: 8,994
07.08.2020, 13:52 9
Лучший ответ Сообщение было отмечено pepu5 как решение

Решение

Через Tag.

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
uses ... ComCtrls...
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    TrackList: array of TTrackBar;
    procedure TrackChange(Sender: TObject);
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  tb: TTrackBar;
  lb: TLabel;
begin
  tb := TTrackBar.Create(Self);
  tb.Parent := Self;
  // Задать размеры и положение трэкбара
  if Length(TrackList) > 0 then tb.SetBounds(8, TrackList[High(TrackList)].Top + TrackList[High(TrackList)].Height + 8, 100, 30)
                           else tb.SetBounds(8, Button1.Top + Button1.Height + 8, 100, 30);
  lb := TLabel.Create(Self);
  lb.Parent := Self;
  lb.Left := tb.Left + tb.Width + 8; // Задать положение Label
  lb.Top := tb.Top + 8;
 
  tb.Tag := dword(lb); // Поместить в Tag адрес метки
  tb.OnChange := TrackChange;
  SetLength(TrackList, Length(TrackList) + 1); // Добавить трэкбар в массив
  TrackList[High(TrackList)] := tb;
end;
 
procedure TForm1.TrackChange(Sender: TObject);
begin
  with (Sender as TTrackBar) do // обновить метку того трэкбара, который был сдвинут
    TLabel(Tag).Caption := IntToStr(Position);
end;
Добавлено через 1 час 25 минут
Ещё можно создать промежуточный класс с этим Label:
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
uses ... ComCtrls ...
 
type
  TMyTrackBar = class (TTrackBar)
  public
    Label1: TLabel; // Добавили метку
  end;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    MyTrackList: array of TMyTrackBar;
    procedure MyTrackChange(Sender: TObject);
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button2Click(Sender: TObject);
var
  tb: TMyTrackBar;
begin
  tb := TMyTrackBar.Create(Self);
  tb.Parent := Self;
  // Задать размеры и положение трэкбара
  if Length(MyTrackList) > 0 then tb.SetBounds(MyTrackList[High(MyTrackList)].Left, MyTrackList[High(MyTrackList)].Top + MyTrackList[High(MyTrackList)].Height + 8, 100, 30)
                           else tb.SetBounds(Button2.Left, Button2.Top + Button2.Height + 8, 100, 30);
  tb.Label1 := TLabel.Create(Self);
  tb.Label1.Parent := Self;
  tb.Label1.Left := tb.Left + tb.Width + 8; // Задать положение Label
  tb.Label1.Top := tb.Top + 8;
 
  tb.OnChange := MyTrackChange;
  SetLength(MyTrackList, Length(MyTrackList) + 1); // Добавить трэкбар в массив
  MyTrackList[High(MyTrackList)] := tb;
  MyTrackChange(tb); // Показали начальное значение трэкбара
end;
 
procedure TForm1.MyTrackChange(Sender: TObject);
begin
  with (Sender as TMyTrackBar) do Label1.Caption := IntToStr(Position); // Обновить метку изменившегося трэкбара
end;
Добавлено через 1 минуту
Если этот трэкбар и метка должны находится на панели, то можно создать класс от TPanel уже с трэкбаром и меткой, а в основной программе только создавать и размещать панель. Внутри уже всё будет готово.
1
Житель Земли
3001 / 3008 / 390
Регистрация: 26.07.2011
Сообщений: 11,464
Записей в блоге: 1
07.08.2020, 14:02 10
Если ты всё равно динамически создаёшь трекбары, ну создай ты наследника в пять строк и не надо будет городить огород с тэгами, ссылками, массивами и прочей лабудой. Достаточно будет только массива из самих трекбаров
Delphi
1
2
3
4
5
6
7
type
  TTrackBar = class(Vcl.ComCtrls.TTrackBar)
  private
    FLabel: TLabel;
  public
    property ChildLabel: TLabel read FLabel write FLabel;
  end;
Добавлено через 6 минут
развиваем идею. никто не мешает унаследовать обработчик Changed.
Delphi
1
2
3
4
5
6
7
8
9
type
  TTrackBar = class(Vcl.ComCtrls.TTrackBar)
  private
    FLabel: TLabel;
  protected
    procedure Changed; override;
  public
    property ChildLabel: TLabel read FLabel write FLabel;
  end;
при чём здесь два варианта
Delphi
1
2
3
4
5
6
7
procedure TTrackBar.Changed;
begin
  // сначала код из обработчка OnChange, если он назначен
  inherited;
  // затем твой код
  FLabel.Caption:= IntToStr(Position);
end;
Delphi
1
2
3
4
5
6
7
procedure TTrackBar.Changed;
begin
  // сначала твой код
  FLabel.Caption:= IntToStr(Position);
  // затем код из обработчка OnChange, если он назначен
  inherited;
end;
Добавлено через 2 минуты
Кстати, в примере есть место для жирного AV
1
0 / 0 / 0
Регистрация: 07.08.2020
Сообщений: 16
07.08.2020, 15:08  [ТС] 11
Всем спасибо большое за помощь! Появилась ногвая задача: для каждого трекбара иметь возможность менять минимум и максимум диапазона регулирования. Примерно понимаю, что надо делать. но очень путаюсь с тегами.

Код на данный момент:

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
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    TrackBar1: TTrackBar;
    Label1: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
//    procedure TrackBar1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
 
 
 
  private
    { Private declarations }
  public
    { Public declarations }
    TrackList: array of TTrackBar;
    procedure TrackChange(Sender: TObject);
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
 
 
// Верхний трэкбар делаем и настраиваем сами
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  form1.Label1.Caption:=inttostr(form1.TrackBar1.Position);
  form1.Label1.Font.Size:=11;
  form1.TrackBar1.Max := StrToInt(Form1.Edit1.Text);
  form1.TrackBar1.Min := StrToInt(Form1.Edit2.Text);
end;
 
// Динамически создаем трэкбары, лэйблы и эдиты
procedure TForm1.Button1Click(Sender: TObject);
var
  tb: TTrackBar;
  lb: TLabel;
  ed_Max: TEdit;
  ed_Min: TEdit;
begin
  tb := TTrackBar.Create(Self);
  tb.Parent := Self;
  // Задать размеры и положение трэкбара
  if Length(TrackList) > 0 then tb.SetBounds(Button1.Left, TrackList[High(TrackList)].Top + TrackList[High(TrackList)].Height + 26, 160, 45)
                           else tb.SetBounds(Button1.Left, Trackbar1.Top+45+26, 160, 45);
 
 
  lb := TLabel.Create(Self);
  lb.Parent := Self;
  lb.Left := tb.Left+80; // Задать положение Label
  lb.Top := tb.Top - 26;
  lb.Font.Size:=11;
  lb.Width:=tb.Width;
  lb.Height:=Form1.Label1.Height;
  lb.Alignment:=taCenter;
 
  tb.Tag := dword(lb); // Поместить в Tag адрес метки
  tb.OnChange := TrackChange;
  SetLength(TrackList, Length(TrackList) + 1); // Добавить трэкбар в массив
  TrackList[High(TrackList)] := tb;
 
  ed_Max := TEdit.Create(Self);
  ed_Max.Parent := Self;
  ed_Max.Left := tb.Left+tb.Width;
  ed_Max.Top := tb.Top;
  ed_Max.Width := 121;
 
  ed_Min := TEdit.Create(Self);
  ed_Min.Parent := Self;
  ed_Min.Left := Form1.Edit2.Left;
  ed_Min.Top := tb.Top;
  ed_Min.Width := 121;
end;
 
 
procedure TForm1.TrackChange(Sender: TObject);
begin
  with (Sender as TTrackBar) do // обновить метку того трэкбара, который был сдвинут
    TLabel(Tag).Caption := IntToStr(Position);
end;
 
end.
0
Модератор
3756 / 2260 / 783
Регистрация: 15.11.2015
Сообщений: 8,994
07.08.2020, 15:22 12
В массиве есть все эти трэкбары, пройтись и поставить столько надо:
Delphi
1
2
3
4
5
6
7
procedure TForm1.Button3Click(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to High(TrackList) do
    TrackList[i].Max := 200;
end;
0
0 / 0 / 0
Регистрация: 07.08.2020
Сообщений: 16
07.08.2020, 15:25  [ТС] 13
Так задача в том, чтобы была возможность задавать эти величины в процессе работы программы, из Edit, которые создаются вместе с трэкбарами.
0
3048 / 1668 / 656
Регистрация: 19.03.2019
Сообщений: 5,372
07.08.2020, 15:45 14
Лучший ответ Сообщение было отмечено pepu5 как решение

Решение

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
....
 
type
  TMyTrackBar = class (TTrackBar)
  public
    Label1: TLabel; // Добавили метку
    EditMin, EditMax : TEdit;
  end;
 
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    TrackBar1: TTrackBar;
    Label1: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
 
 
 
  private
    { Private declarations }
  public
    { Public declarations }
    TrackList: array of TMyTrackBar;
    procedure TrackChange(Sender: TObject);
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
 
 
// Верхний трэкбар делаем и настраиваем сами
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  form1.Label1.Caption:=inttostr(form1.TrackBar1.Position);
  form1.Label1.Font.Size:=11;
  form1.TrackBar1.Max := StrToInt(Form1.Edit1.Text);
  form1.TrackBar1.Min := StrToInt(Form1.Edit2.Text);
end;
 
// Динамически создаем трэкбары, лэйблы и эдиты
procedure TForm1.Button1Click(Sender: TObject);
var
  tb: TMyTrackBar;
begin
  tb := TMyTrackBar.Create(Self);
  tb.Parent := Self;
  // Задать размеры и положение трэкбара
  if Length(TrackList) > 0 then tb.SetBounds(Button1.Left, TrackList[High(TrackList)].Top + TrackList[High(TrackList)].Height + 26, 160, 45)
                           else tb.SetBounds(Button1.Left, Trackbar1.Top+45+26, 160, 45);
 
  tb.Label1 := TLabel.Create(Self);
  tb.Label1.Parent := Self;
  tb.Label1.Left := tb.Left + 80; // Задать положение Label
  tb.Label1.Top := tb.Top -26;
  tb.Label1.Font.Size:=11;
  tb.Label1.Width:=tb.Width;
  tb.Label1.Height:=Form1.Label1.Height;
  tb.Label1.Alignment:=taCenter;
 
  tb.EditMax := TEdit.Create(Self);
  tb.EditMax.Parent := Self;
  tb.EditMax.Left := tb.Left+tb.Width;
  tb.EditMax.Top := tb.Top;
  tb.EditMax.Width := 121;
  tb.EditMax.Text := '10';
 
  tb.EditMin := TEdit.Create(Self);
  tb.EditMin.Parent := Self;
  tb.EditMin.Left := Form1.Edit2.Left;
  tb.EditMin.Top := tb.Top;
  tb.EditMin.Width := 121;
  tb.EditMin.Text := '1';
 
  tb.OnChange := TrackChange;
  SetLength(TrackList, Length(TrackList) + 1); // Добавить трэкбар в массив
  TrackList[High(TrackList)] := tb;
  TrackChange(tb);
 
end;
 
 
procedure TForm1.TrackChange(Sender: TObject);
begin
  with (Sender as TMyTrackBar) do begin // обновить метку того трэкбара, который был сдвинут
    label1.Caption := IntToStr(Position);
    Max := StrToIntDef(EditMax.Text,10);
    Min := StrToIntDef(EditMin.Text,1);
  end;
end;
 
end.
Добавлено через 3 минуты
P.S. впервые вижу такую UI - менять размеры прогрессбара в момент, когда его позицию пытаются передвинуть. Очень странная логика, имхо..
0
Модератор
3756 / 2260 / 783
Регистрация: 15.11.2015
Сообщений: 8,994
07.08.2020, 16:20 15
Цитата Сообщение от pepu5 Посмотреть сообщение
из Edit, которые создаются вместе с трэкбарами.
И в чём проблема? Подставь вместо тех 200 в примере свои Edit'ы. И этот цикл в обработчик Edit'а поместить. Мы же не знаем, что ты задумал и приводим примеры как это сделать, а сам уже компонуешь, как нужно.

Тут сразу и с защитой от неправильного ввода, чтобы программа не вываливала ошибки:
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.Edit1Change(Sender: TObject);
var
  i, v: integer;
begin
  for i := 0 to High(TrackList) do begin
    if TryStrToInt(Edit1.Text, v) then TrackList[i].Min := v; // Минимум из Edit1
    if TryStrToInt(Edit2.Text, v) then TrackList[i].Max := v; // Максимум из Edit2
  end;
end;
Сообщения о неправильном числе можешь сам вывести.
Либо вместо Edit использовать SpinEdit и брать из него готовое целое число.
0
5868 / 4596 / 1448
Регистрация: 14.04.2014
Сообщений: 20,393
Записей в блоге: 20
08.08.2020, 09:12 16
Очень интересное и познавательное чтиво. Хорошо, что сразу мораль в нем видна.
Сначала есть ОДНО требование.

Один: сделать хранилище, простенькую модель данных в виде пары массивов
Все: костыль, костыль!
Один: анодированный костыль!

Появляется ВТОРОЕ требование заказчика. Он забыл его сразу сказать, или было лень.

Все: прекрасно, больше костылей богу костылей!
Все: главное не забыть лепить все в обработчик кнопки!

А будет еще ТРЕТЬЕ! Потому что откуда заказчик берет свои трекбары - нипанятна! А откуда-то берет! И этот вопрос мы тоже скоро услышим...

А если сразу делать отдельную модель данных и отдельную процедуру для визуализации этих данных, то было бы банально, скучно, неуместно...
0
414 / 143 / 27
Регистрация: 04.08.2018
Сообщений: 606
08.08.2020, 13:11 17
krapotkin, но ведь могли бы предложить проходить по списку компонентов на форме. Так что всё не настолько плохо.
Какой был вопрос, такой был получен ответ. Спросили как сделать - ответили. Если бы спросили как правильно организовать, то и ответ был бы другой. Этот раздел не коммерческая разработка с последующей поддержкой кода, не обучение как надо делать.
0
5868 / 4596 / 1448
Регистрация: 14.04.2014
Сообщений: 20,393
Записей в блоге: 20
08.08.2020, 14:04 18
Цитата Сообщение от Rayvenor Посмотреть сообщение
всё не настолько плохо
сорян, погорячился
Цитата Сообщение от Rayvenor Посмотреть сообщение
не обучение как надо делать
да, это обучение как не стоит. просто отцы так делали и деды в поле рожали... ))
0
3760 / 2264 / 705
Регистрация: 29.05.2013
Сообщений: 9,616
08.08.2020, 19:10 19
Забавная задачка. Решил тоже свой вариант сделать, без дополнительных классов.
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
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure ControlChange(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  P: TPanel;
  TB: TTrackBar;
  L: TLabel;
  E: TEdit;
  i: Integer;
begin
 P := TPanel.Create(Self);
 P.BoundsRect := Rect(2, 2, 200, 50);
 for i := 0 to ControlCount - 1
 do if Controls[i] is TPanel
    then P.Top := P.Top + Controls[i].Height;
 P.Parent := Self;
 TB := TTrackBar.Create(P);
 TB.BoundsRect := Rect(5, 5, P.Width-40, 30);
 TB.Parent := P;
 TB.OnChange := ControlChange;
 L := TLabel.Create(P);
 L.Parent := P;
 L.AutoSize := False;
 L.BoundsRect := Rect(5, 30, P.Width-40, 50);
 L.Alignment := taCenter;
 L.Caption := IntToStr(TB.Position);
 E := TEdit.Create(P);
 E.Parent := P;
 E.BoundsRect := Rect(P.Width-40, 5, P.Width-10, 20);
 E.OnChange := ControlChange;
 E := TEdit.Create(P);
 E.Parent := P;
 E.BoundsRect := Rect(P.Width-40, 25, P.Width-10, 40);
 E.OnChange := ControlChange;
end;
 
procedure TForm1.ControlChange(Sender: TObject);
var
  P: TPanel;
  TB: TTrackBar;
  E: TEdit;
  i,n: Integer;
begin
 P := TControl(Sender).Parent as TPanel;
 if Sender is TTrackBar
 then begin
      TB := TTrackBar(Sender);
      for i := 0 to P.ControlCount - 1
      do if P.Controls[i] is TLabel
         then TLabel(P.Controls[i]).Caption := IntToStr(TB.Position);
      end;
 if Sender is TEdit
 then begin
      E := TEdit(Sender);
      TryStrToInt(E.Text, n);
      for i := 0 to P.ControlCount - 1
      do if P.Controls[i] is TTrackBar
         then begin
              TB := TTrackBar(P.Controls[i]);
              case E.TabOrder
              of 1: TB.Min := n;
                 2: TB.Max := n;
              end;
              end;
      end;
end;
Добавлено через 5 минут
Открыл для себя компонент TGridPanel. Даже не обращал внимания раньше на него. Оказывается чертовски интересная штука и для этой задачи подходит идеально.
1
0 / 0 / 0
Регистрация: 07.08.2020
Сообщений: 16
09.08.2020, 18:06  [ТС] 20
Доброго времени суток все еще раз! Хотелось бы немного обновить код. На данном этапе изменение минимума и максимума трэкбаров, созданных динамически, происходит при изменении положения. Хотелось бы это исправить, чтобы менялось по нажатии кнопки Button1 например (Как у первого трэкбара) или при изменении Edit - ов, не знаю как лучше. Жду Ваших советов и решений

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
type
  TMyTrackBar = class (TTrackBar)
  public
    Label1: TLabel; // Добавили метку
    EditMin, EditMax : TEdit;
  end;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    TrackBar1: TTrackBar;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure TrackBar1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    TrackList: array of TMyTrackBar;
    procedure TrackChange(Sender: TObject);
  end;
 
var
  Form1: TForm1;
  tb: TMyTrackBar;
 
implementation
 
{$R *.dfm}
 
 
// Кнопка ОБНОВИТЬ МИНИМУМ И МАКСИМУМ
 
procedure TForm1.Button1Click(Sender: TObject);
 
begin
  form1.TrackBar1.Max := StrToInt(form1.Edit1.Text);
  form1.TrackBar1.Min := StrToInt(form1.Edit2.Text);
end;
 
 
 
 
// Первый трэкбар
 
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  Label1.Caption := IntToStr(form1.TrackBar1.Position);
end;
 
// Создание трэкбара по кнопке ДОБАВИТЬ
 
procedure TForm1.Button2Click(Sender: TObject);
 
begin
  // Создаем трэкбары
  tb := TMyTrackBar.Create(Self);
  tb.Parent := Self;
  tb.OnChange := TrackChange;
  // Задать размеры и положение трэкбара
  if Length(TrackList) > 0 then tb.SetBounds(Button1.Left, TrackList[High(TrackList)].Top + TrackList[High(TrackList)].Height + Label1.Height, 155, 45)
                           else tb.SetBounds(Button1.Left, TrackBar1.Top+TrackBar1.Height+Label1.Height, 155, 45);
 
  // Создаем лэйблы
  tb.Label1 := TLabel.Create(Self);
  tb.Label1.Parent := Self;
  // Задать положение Label
  tb.Label1.Left := Label1.Left;
  tb.Label1.Top := tb.Top - Label1.Height;
  tb.Label1.Font.Size:=11;
  tb.Label1.Width:=tb.Width;
  tb.Label1.Height:=Form1.Label1.Height;
 
  // Поле для изменения максимума
  tb.EditMax := TEdit.Create(Self);
  tb.EditMax.Parent := Self;
  tb.EditMax.Left := Form1.Edit1.Left;
  tb.EditMax.Top := tb.Top;
  tb.EditMax.Width := Edit1.Width;
  tb.EditMax.Text := '10';
  tb.EditMax.Font.Size := 11;
 
  // Поле для изменения минимума
  tb.EditMin := TEdit.Create(Self);
  tb.EditMin.Parent := Self;
  tb.EditMin.Left := Form1.Edit2.Left;
  tb.EditMin.Top := tb.Top;
  tb.EditMin.Width := Edit2.Width;
  tb.EditMin.Text := '1';
  tb.EditMin.Font.Size := 11;
 
  // Добавить трэкбар в массив
  SetLength(TrackList, Length(TrackList) + 1);
  TrackList[High(TrackList)] := tb;
  TrackChange(tb);
 
end;
 
 
 
// Обновление метки того трэкбара, который был сдвинут
 
procedure TForm1.TrackChange(Sender: TObject);
begin
  with (Sender as TMyTrackBar) do begin
    label1.Caption := IntToStr(Position);
    Max := StrToInt(EditMax.Text);
    Min := StrToInt(EditMin.Text);
 
  end;
end;
 
end.
0
09.08.2020, 18:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.08.2020, 18:06
Помогаю со студенческими работами здесь

Динамическое создание Label
Здравствуйте. Мне нужно динамически создать лейб. написал код, но в форме ничего нет. Подскажите в...

Динамическое создание label-ов
Всем привет. Хочу сделать так, что бы при нажатии кнопки создавался определенный лейб, который...

Динамическое создание Label
Нужно чтоб по нажатию кнопки мыши в том мести появлялась надпись пункт1, пункт2 и т.д. Думаю...

Динамическое создание Label
При динамическом создание Label-ов, они не видны, я так понял причина в том, что на форме...

Динамическое создание Label
вызываю функцию CreateLabels(new { 17, 17 }, new { 13, 78 }, new { "Поиск по фамилии", "Поиск по...

Динамическое создание label
Нужно написать кусок программы, чтобы при нажатии button'а, создалось столько label'ов, сколько...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru