Форум программистов, компьютерный форум, киберфорум
Наши страницы

Lazarus

Войти
Регистрация
Восстановить пароль
 
shyub
344 / 144 / 31
Регистрация: 11.07.2013
Сообщений: 791
#1

Если можно создать массив TButton, то как создать массив их событий? - Lazarus

13.07.2015, 01:03. Просмотров 1120. Ответов 5
Метки нет (Все метки)

Пишу программу в которой много однообразных Едитов и кнопок. Чтобы "облегчить сбе жизнь" создал MyEdit: array[1..64] of TEdit. Аналогично можно поступить и с кнопками: MyButton: array[1..64] of TButton. Теперь самое интересное: обработка событий кнопок везде одинаковая (допустим, при нажатии кнопки N необходимо записать в Едит N число 1). Как можно создать событие типа procedure TForm1.BitBtnNClick(Sender: TObject; N: integer);, чтобы можно было узнать какая кнопка была нажата и записать в соответвующий Едит?

Добавлено через 14 минут
Здесь, даже, можно поступить как-то проще:
Создать один обработчик для всех кнопок, например:
Delphi
1
2
3
procedure TForm1.Button1Click(Sender: TObject);
begin
......
Но как узнать, какая из 64 кнопок была нажата?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2015, 01:03
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Если можно создать массив TButton, то как создать массив их событий? (Lazarus):

Создать типизированный файл, куда записать n целых чисел. Из файла создать массив, элементы которого являются - Lazarus
Создать типизированный файл, куда записать n целых чисел. Из файла создать массив, элементы которого являются простыми числами и...

Как создать массив элементов управления - Lazarus
Такая вот проблема. Имею небольшой опыт кодирования в VB и там, как бы это все было предельно просто. У каждого элемента управления в VB...

Обработчик событий для компонента (TLabel, TButton) - Lazarus
Привет. Задание создать Design-Time форму, создать Run-Time форму. На дезайн тайм есть какие-то компоненты, например три надписи TLabel....

Создать массив всех элементов формы - Lazarus
Есть форма, на которую динамически добавляются, в зависимости от нажатой кнопки, TFileNameEdit, TDirectoryEdit или TEdit. При попытке...

Создать массив сведений о пассажирах заданного рейса - Delphi
Сведения о пассажирах состоит из номера рейса,его фамилии,кол-ва вещей и общего весе вещей. Дан массив,содержащий сведения о некоторых...

Создать одномерный массив из элементов контура матрицы - Lazarus
Дана числовая матрица 7*7, создать одномерный массив состоящий из элементов контура 1,3-1,4-2,4-3,5-5,3-5,2-4,2-4,1-3,1-3,2-2,3-1,3.

5
Puporev
Модератор
54037 / 41670 / 14750
Регистрация: 18.05.2008
Сообщений: 97,986
13.07.2015, 07:28 #2
Например так.
Pascal
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
var
  Form1: TForm1;
  RunTimeButtons: array[1..10] of TButton;
  RunTimeEdit: array[1..10] of TEdit;
implementation
 
{$R *.lfm}
 
{ TForm1 }
procedure TForm1.RunTimeButtonClick(Sender: TObject);
begin
RunTimeEdit[(Sender as TButton).Tag].Text :='Нажата кнопка '+IntToStr((Sender as TButton).Tag)
end;
procedure TForm1.Button1Click(Sender: TObject);
var i: Byte;
begin
for i := 1 to 10 do
  begin
   RunTimeButtons[i] := TButton.Create(Self);
   with RunTimeButtons[i] do
    begin
     Parent  := Form1;
     Caption := 'Button ' + IntToStr(i);
     Width:=100;
     Top:=i*Height;
     Tag:=i;
     OnClick := @RunTimeButtonClick;
     Visible := True;
    end;
   RunTimeEdit[i] := TEdit.Create(Self);
   with RunTimeEdit[i] do
    begin
     Parent  := Form1;
     Text := '';
     Left:=150;
     Top :=i*(Height+4);
     Width:=150;
    end;
  end;
end;
1
shyub
344 / 144 / 31
Регистрация: 11.07.2013
Сообщений: 791
13.07.2015, 11:29  [ТС] #3
Puporev, большое Вам спасибо.
Вы создаёте динамически Кнопки и Едиты. Я немного изменил Ваш код, чтобы данная идеология работала для статически созданных компонентов. Получилось вот так:
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
.  .  .  .  .  .
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure MyButtonClick(Sender: TObject); // Обработка события нажатой кнопки.
  private
    MyEdit: array[1..5] of TEdit;
    MyButton: array[1..5] of TButton;
  public
    { public declarations }
  end;
.  .  .  .  .  .
// Создание формы.
procedure TForm1.FormCreate(Sender: TObject);
var
  n: integer;
begin
  MyEdit[1]:=Edit1; MyEdit[2]:=Edit2; MyEdit[3]:=Edit3;
  MyEdit[4]:=Edit4; MyEdit[5]:=Edit5;
  MyButton[1]:=Button1; MyButton[2]:=Button2; MyButton[3]:=Button3;
  MyButton[4]:=Button4; MyButton[5]:=Button5;
  for n:=1 to 5 do begin
    MyButton[n].OnClick:=@MyButtonClick;
    MyButton[n].Tag:=n;
  end
end;
// Обработка события нажатой кнопки.
procedure TForm1.MyButtonClick(Sender: TObject);
begin
  MyEdit[(Sender as TButton).Tag].Text :='Нажата кнопка '+IntToStr((Sender as TButton).Tag)
end;
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25535 / 17088 / 5416
Регистрация: 22.10.2011
Сообщений: 30,257
Записей в блоге: 7
13.07.2015, 11:33 #4
Цитата Сообщение от shyub Посмотреть сообщение
Но как узнать, какая из 64 кнопок была нажата?
А Sender на что?
1
shyub
344 / 144 / 31
Регистрация: 11.07.2013
Сообщений: 791
13.07.2015, 11:41  [ТС] #5
Цитата Сообщение от volvo Посмотреть сообщение
А Sender на что?
А как им воспользоваться?
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25535 / 17088 / 5416
Регистрация: 22.10.2011
Сообщений: 30,257
Записей в блоге: 7
13.07.2015, 11:46 #6
Он хранит объект, для которого сработало событие, то есть,
Pascal
1
2
3
4
5
procedure TForm1.Button1Click(Sender: TObject);
var btn : TButton;
begin
  btn := Sender as TButton; // Вот она, кнопка, которую нажали, делай с ней что нужно
  // ...
Например, получай индекс нажатой кнопки и по нему выходи на Edit с тем же индексом:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
// uses StrUtils;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  btn : TButton;
  edit : TEdit;
begin
  btn := Sender as TButton;
  edit := FindComponent(Format('Edit%s', [TrimLeftSet(UpCase(btn.Name), ['A' .. 'Z'])])) as TEdit;
  // и пиши в edit что нужно...
  edit.Text:='hihi';
end;
1
13.07.2015, 11:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2015, 11:46
Привет! Вот еще темы с ответами:

Создать новый массив из элементов, которые являются делителями - Lazarus
дан одномерный массив.создать новый массив из элементов которые являются делителями суммы всех элементов массива. решение в паскале

Как создать двумерный массив TButton? - C++ Builder
Как создать двумерный массив из TButton . такой код у меня не прошёл... Написал ошибку в последней строчке.. int n=5,m=5; ...

можно ли и если можно, то как в сессии создать двумерный массив ?& - C# ASP.NET
нужен сабж

Создать динамический массив (Если чётных чисел больше, то массив должен быть укорочен на 2 элемента) - C++
Создать динамический массив из 8 случайных целых чисел из отрезка и вывести его на экран . Если в массиве чётных чисел оказалось...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru