Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамическое создание кнопок [D6, WinXP]


Страницы:   1 2

Destroyer ©   (2004-06-23 17:40:00) 

Я создаю динамически кнопки в своей процедуре :

procedure createbuttons;
var mainbuttons:array [1..42] of TSpeedButton;
begin    
mainbuttons[n]:=tSpeedButton.create(self);!!!
// ^--здесь ругается на self, undeclared undentifier
mainbuttons[n].top:=1;
mainbuttons[n].left:=mainbuttons[n].width+2;
mainbuttons[n].Parent:=form1.panel3;
end;
Как сделать так, чтобы компилятор не ругался?


evvcom   (2004-06-24 11:08:00) [1]


> Но автор вообще ставил другой вопрос,

В посте [7] автор задал дополнительный вопрос. Соглашусь, что по правилам он должен был сделать это в отдельном топике.


YurikGL   (2004-06-24 10:55:00) [2]

Автор еще спрашивал "В каком месте?"

:)


Anatoly Podgoretsky   (2004-06-24 10:53:00) [3]

Но автор вообще ставил другой вопрос, напоминаю " Как сделать так, чтобы компилятор не ругался?"


evvcom   (2004-06-24 10:38:00) [4]


> т.е как узнать ее номер в массиве

Это действительно удобно сделать через Tag, но автор вопроса и не ставил такой задачи. Ему нужно было получить доступ к свойству нажатой кнопки, а для этого не требуется знать местоположение кнопки в созданном массиве.


YurikGL   (2004-06-24 10:13:00) [5]


> evvcom ©   (24.06.04 09:29) [19]

А как отличить одну от другой т.е как узнать ее номер в массиве?


evvcom   (2004-06-24 09:29:00) [6]


> какая кнопка была нажата

это Sender без дополнительного огорода


YurikGL   (2004-06-24 09:11:00) [7]


> А можно, пожалуйста, поподробнее. Что за двухмерный массив
> (var Buttons[1..n,1..2] of TMyButton ?)
> Почему используем именно 2 в Buttons[2,i1] ?
> Что такое i1?

Да, у меня в программе двухмерный массив [1..n,1..3] три уровня кнопок.
В предложенном коде создавался второй уровень в цикле
for i1:=1 to n do begin
Buttons[2,i1]:=TMyButton.Create(Form1);
Buttons[2,i1].OnClick:=OnClickProc;
Buttons[2,i1].num:=i1;
Buttons[2,i1].lev:=2;
...
end.

Для любого элемента Buttuns[i,j] имеем
Buttuns[i,j].num=j
Buttuns[i,j].lev=i

и по num и lev я потом узнаю, какая кнопка была нажата.


evvcom   (2004-06-24 09:04:00) [8]

Блин, Вы чё? Какой Tag? Чего парню мозги пудрите?

procedure TForm1.specmainbuttonCDClick(Sender: TObject);
begin
 if Sender is TSpeedButton then
   ShowMessage(TSpeedButton(Sender).Text);
end;

И никаких Tag! Не нужен он здесь.


Destroyer   (2004-06-24 00:00:00) [9]

2 jack128 да, именно это и кажется, спасибо! Все работает!


GuAV   (2004-06-23 23:58:00) [10]


> тебе не кажется, что это эквивалентно TSpeedButton(Sender)
> ?

Я же написал:

> Ну вот нравится мне этот Tag :)

Конечно, ты прав, я уже туплю...


jack128   (2004-06-23 23:55:00) [11]


> mainbuttons[TComponent(Sender).Tag].

тебе не кажется, что это эквивалентно TSpeedButton(Sender) ?

а выводить текст (учитывая  mainbuttons[nCD].Tag:=nCD;)

ShowMessage(editCD[TComponent(Sender).Tag].Text);


Destroyer   (2004-06-23 23:55:00) [12]


> Tag. свойтво Tag. TComponent(Sender).Tag

Спасибо!!! Пойду обрабатывать.


GuAV   (2004-06-23 23:47:00) [13]

А чтоб всё стало совсем понятно:
mainbuttons[nCD].Tag:=nCD;
...
mainbuttons[TComponent(Sender).Tag].Parent:=form1.panel1;

YurikGL ©   (23.06.04 22:08) [9]
Я бы в tag втулил два SmallInt. Ну вот нравится мне этот Tag :)


GuAV   (2004-06-23 23:42:00) [14]

Tag. свойтво Tag. TComponent(Sender).Tag


Destroyer   (2004-06-23 23:23:00) [15]


> Tag. свойтво Tag.

Tag можно будет узнать только задав номер элемента массива, а мне нужно по Tag узнавать номар элемента массива.

> Использовал двухмерный массив


А можно, пожалуйста, поподробнее. Что за двухмерный массив (var Buttons[1..n,1..2] of TMyButton ?)
Почему используем именно 2 в Buttons[2,i1] ?
Что такое i1?


YurikGL   (2004-06-23 22:08:00) [16]

Использовал двухмерный массив

//объявление типа
 TMyButton=class(TBitBtn)
 public
   lev, num:integer;
 end;
//создание кнопок
 Buttons[2,i1]:=TMyButton.Create(Form1);
 Buttons[2,i1].OnClick:=OnClickProc;
 Buttons[2,i1].num:=i1;
 Buttons[2,i1].lev:=2;

//процедура обработки нажатия
Procedure TForm1.OnClickProc(Sender :TObject);
  with Form1.ActiveControl as TMyButton do begin
    n:=num;
    l:=lev;
                                        end;
теперь в n и l имеем координаты нажатой кнопки и по ним выполняем нужные действия


GuAV   (2004-06-23 22:02:00) [17]


> А есть какой-нибудь способ без использования скрытой кнопки?

Удали ёе, она уже не нужна :)

> Есть мысли?

Tag. свойтво Tag.


Destroyer   (2004-06-23 21:59:00) [18]

И еще вопрос.
Я создал динамически много кнопок и эдитов, теперь надо при нажатии на каждую кнопку считать из соответствующего эдита текст. Например при нажатии на первую кнопку считывается текст из первого эдита и т.д. Я делал так:
procedure createbuttonsCD;
begin  
mainbuttons[nCD]:=tSpeedButton.create(application);
mainbuttons[nCD].left:=nCD*mainbuttons[nCD].width+5;
mainbuttons[nCD].OnClick:=form1.specmainbuttonCDclick;
mainbuttons[nCD].Parent:=form1.panel1;
end;
mainbuttons - массив из кнопок
событию OnClick присваивается событие скрытой кнопки form1.specmainbuttonCDclick :

procedure TForm1.specmainbuttonCDClick(Sender: TObject);
begin
showmessage(editCD[nCD].Text);
end;

nCD - это номер элемента массива кнопок.
Но так у меня при нажатии на любую кнопку выводится текст эдита под номером  nCD, а я хочу чтобы выводился текст эдита под номером соответствующим этой кнопке.
Есть мысли?
А есть какой-нибудь способ без использования скрытой кнопки?


Destroyer   (2004-06-23 19:20:00) [19]

Всем спасибо!


Aramis   (2004-06-23 19:11:00) [20]

Еще один выход из положения
В определений класса Tform1 (например, до PRIVATE)поставь обьявление:
procedure createbuttons;

а заголовок твоей процедуры переделай так:

procedure tform1.createbuttons;

begin
//тут на self ругаться не будут уже  :)
end;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо