Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
ВнизРабота с динамически созданными объектами Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.052 c