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

Вниз

Динамическое создание кнопок   Найти похожие ветки 

 
Destroyer   (2004-06-23 17:40) [0]

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

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;
Как сделать так, чтобы компилятор не ругался?


 
YurikGL ©   (2004-06-23 17:42) [1]


> // ^--здесь ругается на self, undeclared undentifier

поставь application.


 
Destroyer   (2004-06-23 17:58) [2]

В каком месте?


 
YurikGL ©   (2004-06-23 18:02) [3]


> mainbuttons[n]:=tSpeedButton.create(self);

mainbuttons[n]:=tSpeedButton.create(application);


 
TUser ©   (2004-06-23 18:18) [4]

А self ты действительно не определил. В классе TForm1 али еще где-нибудь, self - это данный экземпляр класса. А здесь у тебя класса нет.


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

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

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

procedure tform1.createbuttons;

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


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

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


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

И еще вопрос.
Я создал динамически много кнопок и эдитов, теперь надо при нажатии на каждую кнопку считать из соответствующего эдита текст. Например при нажатии на первую кнопку считывается текст из первого эдита и т.д. Я делал так:
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, а я хочу чтобы выводился текст эдита под номером соответствующим этой кнопке.
Есть мысли?
А есть какой-нибудь способ без использования скрытой кнопки?


 
GuAV ©   (2004-06-23 22:02) [8]


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

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

> Есть мысли?

Tag. свойтво Tag.


 
YurikGL ©   (2004-06-23 22:08) [9]

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

//объявление типа
 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 имеем координаты нажатой кнопки и по ним выполняем нужные действия


 
Destroyer   (2004-06-23 23:23) [10]


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

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

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


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


 
GuAV ©   (2004-06-23 23:42) [11]

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


 
GuAV ©   (2004-06-23 23:47) [12]

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

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


 
jack128 ©   (2004-06-23 23:55) [13]


> mainbuttons[TComponent(Sender).Tag].

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

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

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


 
Destroyer   (2004-06-23 23:55) [14]


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

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


 
GuAV ©   (2004-06-23 23:58) [15]


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

Я же написал:

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

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


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

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


 
evvcom ©   (2004-06-24 09:04) [17]

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

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

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


 
YurikGL ©   (2004-06-24 09:11) [18]


> А можно, пожалуйста, поподробнее. Что за двухмерный массив
> (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:29) [19]


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

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


 
YurikGL ©   (2004-06-24 10:13) [20]


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

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


 
evvcom ©   (2004-06-24 10:38) [21]


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

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


 
Anatoly Podgoretsky ©   (2004-06-24 10:53) [22]

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


 
YurikGL ©   (2004-06-24 10:55) [23]

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

:)


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


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

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



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

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

Наверх




Память: 0.52 MB
Время: 0.04 c
6-1084265573
gedd
2004-05-11 12:52
2004.07.11
Загрузить файл из интернет через прокси требующий авторизации.


1-1087820527
Klerk
2004-06-21 16:22
2004.07.11
Про Excel


3-1086366374
ceval
2004-06-04 20:26
2004.07.11
Подскажите как организовать поиск


1-1088139220
Vilux
2004-06-25 08:53
2004.07.11
Как мне послать компоненту комбинацию клавиш Ctrl+V или Shift+Ins


10-1013844574
flash1
2002-02-16 10:29
2004.07.11
Тот же рузультат :(