Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-1114869698
psa247
2005-04-30 18:01
2005.06.29
Изменения реестра


1-1117798590
Николай
2005-06-03 15:36
2005.06.29
Удаление записей помеченных на удаление из базы


1-1117738255
Profi
2005-06-02 22:50
2005.06.29
Проблема при использовании dll в качестве plugina


3-1116836139
Cat
2005-05-23 12:15
2005.06.29
extract


14-1117649997
Вольный Стрелок
2005-06-01 22:19
2005.06.29
чем отличаются ToolBar, CoolBar, ControlBar?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский