trigger |
Отправлено: 08.08.2005, 10:29 |
|
Не зарегистрирован
|
подскажите пожалста
у меня есть класс. мне нужно, чтоб в одонм случае одна его функция выполняла одни действия, в другом другие. но не так чтобы там было куча условий. а както на уровне преопределения этой функции.
значит как я понимаю мне нужно создать новый класс-потомк от исходного и в определенни этого класса написать нужную мне функци. а потом создаю объект этого класса и юзаю его. я правильно понимаю всю логику?
т.е. пример:
есть форма. на ней кнопка. мне нужно создать 2 одинаковых формы, но чтоб в одном случае это кнопка выполняла одну функцию, а во втором — другую. помогите с примером плиз... |
|
trigger |
Отправлено: 08.08.2005, 11:09 |
|
Не зарегистрирован
|
есть форма Fgrid. на ней есть кнопка Button4, в обработчике которой содержится
я хочу сделать такую же форму, но с другим обработчиком этой же кнопки.
вот например написал вот так:
CODE |
class newf : TFgrid
{
public:
void __fastcall Button4Click(void)
{
ShowMessage("bbb");
};
newf();
};
newf *fn = new newf();
fn->Show();
|
но проблема в том, что новая форма не унаследовала метод Show().
что я сделал не правильно? (возможно все? ))
|
|
esh |
Отправлено: 08.08.2005, 13:23 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 71
|
class newf : public TFgrid |
|
trigger |
Отправлено: 08.08.2005, 14:05 |
|
Не зарегистрирован
|
QUOTE | class newf : public TFgrid |
да. методы формы появились. спасибо за ответ. но теперь при компиляции возникает ошибка:
[Linker Error] Unresolved external '{803}...' referenced from GRID.OBJ
[Linker Error] Unresolved external '{803}...' referenced from GRID.OBJ
не подскажете в каком направении копать?
компилятор — BCB6
|
|
Георгий |
Отправлено: 08.08.2005, 20:25 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
CODE | class abstractInterface{
public:
virtual void aFunction(void)=0;
};
class firstImplementation:public abstractInterface{
public:
void aFunction(void)
{
// make first action
};
};
class secondImplementation:public abstractInterface{
void aFunction(void)
{
// make second action
};
};
abstractInterface *ptr = 0;
// control function
void Switch(int type)
{
switch(type)
{
case 0:
delete ptr;
ptr=0;
break;
case 1:
ptr = new secondImplementation;
break;
default:
ptr=new firstImplementation;
};
// actionFunction
void Action(void)
{
if (ptr) ptr->aFunction();
}; | |
|
trigger |
Отправлено: 09.08.2005, 09:44 |
|
Не зарегистрирован
|
благодарю за ответы. вроде уловил суть но не до конца. вобщем у меня получился вот такой код. работающий, но не правильно. т.е. сама функция, которую я хочу переопределить — не переопределятся. если не влом — гляньте где ошибка...
CODE |
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
class newform : public TForm1
{
public:
void __fastcall Button3Click(TObject *Sender);
newform():TForm1(Application) {};
};
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{ // закрыть форму
Close();
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{ // создать новую форму
newform *fn = new newform();
fn->Show();
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{ // исходный обработчик формы класса TForm1
ShowMessage("aaa");
}
void __fastcall newform::Button3Click(TObject *Sender)
{ // тот обработчик который я хочу подставить
ShowMessage("bbb");
}
|
ps компилятор — BCB6, компилятор не мог создать конструктор по умолчанию, поэтому пришлось описать его самому в виде
newform():TForm1(Application) {};
может быть из-за этого не переопределяется функция? |
|
Guest |
Отправлено: 09.08.2005, 10:47 |
|
Не зарегистрирован
|
Проверено, работает (секция)
CODE |
class newform : public TForm1
{
__published:
void __fastcall BitBtn2Click(TObject *Sender);
public:
newform() : TForm1(Application) {};
};
void __fastcall newform::BitBtn2Click(TObject *Sender)
{ ShowMessage("newform"); }
newform *nfrm = NULL;
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
if (nfrm)
{ if (nfrm->Visible) nfrm->Close();
delete nfrm;
nfrm = NULL;
return;
}
nfrm = new newform();
nfrm->Show();
}
//---------------------------------------------------------------------------
| |
|
trigger |
Отправлено: 09.08.2005, 11:10 |
|
Не зарегистрирован
|
о! четко!
заработало! ))
спасибо большое! надо было мне объявить новую функцию как паблишт.
|
|
Георгий |
Отправлено: 09.08.2005, 20:55 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
только delete не забывай делать |
|