Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.03 c
9-1079842301
Poison man
2004-03-21 07:11
2004.07.11
Анимация в GLScene


3-1086671031
Makyha
2004-06-08 09:03
2004.07.11
SQL in Delphi


1-1088071668
Aleksandr.
2004-06-24 14:07
2004.07.11
Как определить, является файл бинарным или текстовым?


1-1088374858
a[x]el
2004-06-28 02:20
2004.07.11
!= Работа с памятью StarCraft:BW=!


1-1087819075
tamagavk
2004-06-21 15:57
2004.07.11
Cохранение StringGrid





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский