Еще раз о программном создании компонентов. (Очень надо!)
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.
Буду весьма признателен, если свой ответ вы подкрепите кодом.
Благодарю за внимание.
Unit1.cpp
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
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
this - это так сказать, указатель на контекст вызова. То есть в данном случае вызывается метод класса Form1 и соответственно this есть указатель на Form1. Точнее он равен Form1, поскольку Form1 - это тоже указатель.
В цикле можно создавать новые компоненты и именно так как ты делаешь. Только у тебя, каждый раз при указании pButton=new TButton(this) - выделяется новая область памяти под этот компонент и pButton становится указывать на эту новую область. А предыдущий компонент остается, просто не него больше никто не указывает, что чоответственно приводит к потере памяти. Используй TList например.
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 ]
Большое спасибо
Благодарю за помощь
[ Это Сообщение было отредактировано Jeyson в 2001-10-29 1023 ]
Ну так вот. TList хранит список указателей, которые ты можешь прочитать из свойства Item(TList.Item). Указатели там безтиповые, так что тебе нужно преобразовать этот указатель к нужному типу.
В Delphi это выглядит так
MyButton=TButton(TList.Item);
MyButton.Caption='...';
в Buildere это наверное должно быть так
TButton *MyButton;
MyButton=(TButton*)TList.Item; (или (*TButton)TList.Item?)
MyButton->Caption="...";
Хотя лучше для начала проверь, не является ли в Buildere тип TButton указателем.
[ Это Сообщение было отредактировано Fantasist в 2001-10-29 2004 ]
TButton *pButton=dynamic_cast<TButton*>(Controls)
Это вместо чего?