Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.29;
Скачать: CL | DM;

Вниз

Работа с динамически созданными объектами   Найти похожие ветки 

 
Avals-Z   (2005-05-30 12:35) [0]

Создаю кнопки, кол-во за ранее не известно, равно кол-ву элементов массива.

Uses …. , StdCtrls;

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure BtnClick(Sender:TObject);

procedure TForm1.FormCreate(Sender: TObject);
var
i:Byte;
x,y:integer;
MyMass: array of string;
begin
SetLength(MyMass,25); //25 это пример
for i:=0 to High(MyMass) do
begin
  with TButton.Create(self) do
   begin
    parent:=self;
    Left:=X;//Некое значение
    Top:=Y;//--------//-----
    caption:=MyMass[i];
    Name:=MyMass[i];
    OnClick:=BtnClick;
   end;
 end;
end;
procedure TForm1.BtnClick(Sender:TObject);
begin
   ;
end;
Вопрос, как определить  на какой кнопке был сделан клик (привязать событие к конкретной кнопке)?


 
TUser ©   (2005-05-30 12:39) [1]

Приписывать кнопкам Tag, а потом в обработчике проверять
case (Sender as TComponent).Tag


 
Avals-Z   (2005-05-30 12:55) [2]

Хорошо попробую.
Но хотелось бы по подробнее, опыта маловато пока.


 
TUser ©   (2005-05-30 13:03) [3]

Там, где присваиваешь значения св-вам кнопки пиши Кнопка.Tag:=i;
В обработчкие
case (Sender as TComponent).Tag of
1: код для кнопки 1
2: код для кнопки 2
else: код для остальных кнопок
end;

PS. Если действия совершенно различные, то проще (и правильнее) присвоить кнопкам разные обработчики.


 
Avals-Z   (2005-05-30 14:18) [4]

Меня наверно не поняли, да и сам вовремя не поправил.
Если количество контролов за ранее не известно, то case не подходит.
Но насчет     кнопка.Tag спасибо! Все замечательно получилось!

procedure TForm1.BtnClick(Sender:TObject);
var
j:integer;
begin

 for j:= 0 to HIGH(MyMass) do
  begin
    if (Sender as TButton).Tag = j then
      begin
       SubS:= MyMass[j];
       Вызываю мою функцию (SubS );
      end;
  end;

end;


 
Defunct ©   (2005-05-30 14:56) [5]

Avals-Z   (30.05.05 14:18) [4]

Гм.. А что мешает сделать так:

SubS:= MyMass[ TButton(Sender).Tag ];
Вызываю мою функцию (SubS );


 
Ega23 ©   (2005-05-30 15:12) [6]

или даже
Вызываю мою функцию (MyMass[ TButton(Sender).Tag ])
:о)


 
Avals-Z   (2005-05-30 15:54) [7]

так не прокатит.
Это не массив кнопок, а массив строк определяющих действие в обработчике.
И где писать предложенный код?


 
Defunct ©   (2005-05-30 16:01) [8]

Avals-Z   (30.05.05 15:54) [7]

Почему не "прокатит"?

ведь в [4] j = tag, зачем там еще цикл крутить когда в Tag и так находится индекс массива.


 
Игорь Шевченко ©   (2005-05-30 16:03) [9]

А то, что в коде поста [0] используется неицилизированная переменная MyMass, это не страшно ? Я к тому, что SetLength(,25) еще не совсем достаточно


 
Avals-Z   (2005-05-30 16:03) [10]

Хорошо, а получить значение как?


 
Avals-Z   (2005-05-30 16:07) [11]


> А то, что в коде поста [0] используется неицилизированная
> переменная MyMass, это не страшно ?

Там же написано что это пример, размер массива зарание не известен. его определит переменная.


 
Игорь Шевченко ©   (2005-05-30 16:16) [12]

Avals-Z   (30.05.05 16:07) [11]

Ну вот ты устанавливаешь размер массива вызовом Setlength, а потом, не делая с массивом ничего больше, значения этого массива используешь в правой части оператора присваивания. Зачем ?


 
evvcom ©   (2005-05-30 16:45) [13]


> на какой кнопке был сделан клик

По Sender-у. Ну допустим был клик по 20-й. Чем он по-твоему должен отличаться от клика по 15-ой или 25-ой?


 
jack128 ©   (2005-05-30 17:51) [14]

Avals-Z   (30.05.05 14:18) [4]
   if (Sender as TButton).Tag = j then
     begin
      SubS:= MyMass[j];


А может проще сделать SubS := Sender as TButton ?    

Господа, регулярно советующие определять, по какой кнопке кликнули, через свойство Tag - прекратите позориться, ну не для этого Tag предназначен, не для этого!!!!!!


 
Defunct ©   (2005-05-30 20:36) [15]

jack128 ©   (30.05.05 17:51) [14]

Почему?
Tag вообще чудесатое свойство и в данном случае его очень удобно использовать для хранения индекса метода/функции хранящегося в массиве.

> А может проще сделать SubS := Sender as TButton ?    
И что это будет?
и как это может быть связано с этим:
> Вызываю мою функцию (SubS );


 
jack128 ©   (2005-06-03 14:58) [16]

Defunct ©   (30.05.05 20:36) [15]
данном случае его очень удобно использовать для хранения индекса метода/функции хранящегося в массиве.

Гм. Я ошибся, мне показалось, что в массиве хранятся сами созданные кнопки хранятся. А там хранятся названия кнопок
Avals-Z   (30.05.05 12:35)
   caption:=MyMass[i];
   Name:=MyMass[i];


Тем ни мение свойство Tag тут использовать излишне

procedure TForm1.BtnClick(Sender:TObject);
begin
if Sender is TButton then
begin
  SubS:= TButton(Sender).Caption;
  Вызываю мою функцию (SubS );
end;
end;



Страницы: 1 вся ветка

Текущий архив: 2005.06.29;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.029 c
14-1117970147
Juice
2005-06-05 15:15
2005.06.29
Глючит проводник. Что делать ?


14-1117863334
Гость4
2005-06-04 09:35
2005.06.29
Россия-Латвия


3-1116225853
Fynjy1984
2005-05-16 10:44
2005.06.29
Нередактируемый запрос


14-1117292547
sasha86
2005-05-28 19:02
2005.06.29
Рекомендуемые видео ролики


14-1117269326
Kerk
2005-05-28 12:35
2005.06.29
обложка Schaufenster