Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Еще раз о программном создании компонентов. (Очень надо!)

289
29 октября 2001 года
Jeyson
207 / / 20.04.2000
Два схожих вопроса:
1. Как можно задать событие на кнопку, созданную программно.
Например:
В событии создания формы создается кнопка
void __fastcall FormCreate...(...)
{
TButton *pButton=new TButton(this);
pButton1->Parent=Form1
}
(Кстати, что означает в данном случае this вместо него я ставил и Form1 и Button1 - ничего не меняется)
Вопрос: как задать событие, чтобы при нажатии на pButton1, например в метку выводилось сообщение. А затем при нажатии на другую кнопку pButton1 удалялась бы. Операции типа
pButton1->Visible=false;// error
delete pButton;
приводят к ошибке.
Буду очень признателен, если вы напишите свой ответ в виде проверенного кода (думаю он будет не большим, т.к. я пытался это сделать разными способами, прога компилировалась, но событие не возникало.)

2. Можно ли (если можно то как) задавать имена объектов через циклы, а затем обращаться к каждому из них. Например:
надо программно создавать кнопки (к примеру штук 30(!))
В событии создания формы прописываем:
for(int i=0;i<30;i++)
{
Tbutton *pButtoni = new TButton(this);
pButtoni->Top=i*25;
pButtoni->Parent=Form1;
// i-это просто номер, который я хочу
// сделать частью имени
}
Этот код конечно же не работает как надо. Создается один объект, но i раз. А мне надо создать разные объекты:
pButton1, pButton2... pButton29, pButton30.
Буду весьма признателен, если свой ответ вы подкрепите кодом.

Благодарю за внимание.
449
29 октября 2001 года
Fantasist
124 / / 20.06.2000
Вот тебе полный код и того и другого.

Unit1.cpp
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop

#include &quot;Unit1.h&quot;
//---------------------------------------------------------------------------
#pragma resource &quot;*.dfm&quot;
TForm1 *Form1;
TButton *Butt;
TButton *Butt2;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Butt=new TButton(this);
Butt->Parent=this;
Butt2=new TButton(this);
Butt2->Parent=this;
Butt2->Top=100;
Butt2->onClick=Click;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Click(TObject *Sender)
{
Butt->Free();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
Butt2->Free();
}


Unit1.h
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <vcl\Classes.hpp>
#include <vcl\Controls.hpp>
#include <vcl\StdCtrls.hpp>
#include <vcl\Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
void __fastcall FormCreate(TObject *Sender);
void __fastcall Click(TObject *Sender);
void __fastcall FormDestroy(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


449
29 октября 2001 года
Fantasist
124 / / 20.06.2000
2.

this - это так сказать, указатель на контекст вызова. То есть в данном случае вызывается метод класса Form1 и соответственно this есть указатель на Form1. Точнее он равен Form1, поскольку Form1 - это тоже указатель.

В цикле можно создавать новые компоненты и именно так как ты делаешь. Только у тебя, каждый раз при указании pButton=new TButton(this) - выделяется новая область памяти под этот компонент и pButton становится указывать на эту новую область. А предыдущий компонент остается, просто не него больше никто не указывает, что чоответственно приводит к потере памяти. Используй TList например.

449
29 октября 2001 года
Fantasist
124 / / 20.06.2000
Вот так вот

Tbutton *pButtoni
TList ButtonList;

for(int i=0;i<30;i++)
{
pButtoni = new TButton(Form1);
pButtoni->Top=i*25;
pButtoni->Parent=Form1;
ButtonList.Add(pButton);
}

Потом через *TButton(ButtonList->Index) сможешь обратиться к любому компоненту.


[ Это Сообщение было отредактировано Fantasist в 2001-10-29 0629 ]
289
29 октября 2001 года
Jeyson
207 / / 20.04.2000
Большое спасибо
289
29 октября 2001 года
Jeyson
207 / / 20.04.2000
При проверке возникла проблема в ответе на второй вопрос. Как обратиться к какой либо кнопке? Я сохранил все кнопочки, как ты и говорил. Как, например первой из них в свойстве Caption присвоить какое-то значение или провести другие операции. Кстати в указателе типа TList нет свойства Index.
Благодарю за помощь

[ Это Сообщение было отредактировано Jeyson в 2001-10-29 1023 ]
449
29 октября 2001 года
Fantasist
124 / / 20.06.2000
Правильно. Откуда там Index? Там Item!!

Ну так вот. TList хранит список указателей, которые ты можешь прочитать из свойства Item(TList.Item). Указатели там безтиповые, так что тебе нужно преобразовать этот указатель к нужному типу.

В Delphi это выглядит так

MyButton=TButton(TList.Item);
MyButton.Caption='...';

в Buildere это наверное должно быть так

TButton *MyButton;
MyButton=(TButton*)TList.Item; (или (*TButton)TList.Item?)
MyButton->Caption=&quot;...&quot;;

Хотя лучше для начала проверь, не является ли в Buildere тип TButton указателем.

[ Это Сообщение было отредактировано Fantasist в 2001-10-29 2004 ]
633
30 октября 2001 года
Boka
24 / / 20.02.2000
Вернее будет так
TButton *pButton=dynamic_cast<TButton*>(Controls)
449
30 октября 2001 года
Fantasist
124 / / 20.06.2000
Это вместо чего?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог