ecfisa, a eso me refería.
Pongo un ejemplo sobre el control de
aguml:
Código:
//---------------------------------------------------------------------------
#ifndef NewScrollBoxH
#define NewScrollBoxH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class PACKAGE TNewScrollBox : public TScrollBox
{
public:
__fastcall TNewScrollBox(TComponent* Owner);
private:
TNotifyEvent FOnVerticalScroll;
TNotifyEvent FOnHorizontalScroll;
protected:
virtual void __fastcall WndProc(TMessage& msg);
__published:
__property TNotifyEvent OnVerticalScroll =
{read=FOnVerticalScroll,
write=FOnVerticalScroll};
__property TNotifyEvent OnHorizontalScroll =
{read=FOnHorizontalScroll,
write=FOnHorizontalScroll};
};
//---------------------------------------------------------------------------
#endif
Código:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "NewScrollBox.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//
static inline void ValidCtrCheck(TNewScrollBox *)
{
new TNewScrollBox(NULL);
}
//---------------------------------------------------------------------------
__fastcall TNewScrollBox::TNewScrollBox(TComponent* Owner)
: TScrollBox(Owner)
{
FOnHorizontalScroll = 0;
FOnVerticalScroll = 0;
}
void __fastcall TNewScrollBox::WndProc(TMessage& msg)
{
if(msg.Msg == WM_HSCROLL && FOnHorizontalScroll) FOnHorizontalScroll(this);
if(msg.Msg == WM_VSCROLL && FOnVerticalScroll) FOnVerticalScroll(this);
TScrollBox::WndProc(msg);
}
//---------------------------------------------------------------------------
namespace Newscrollbox
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TNewScrollBox)};
RegisterComponents("Samples", classes, 0);
}
}
//---------------------------------------------------------------------------
aguml,
ecfisa si crea una nueva clase puesto que TForm1 ya es derivada de TForm, lo que pasa es que la crea Builder.
Una explicación sencilla de una función virtual: una función virtual tiene la característica que se hereda, como todas, pero si la sobreescribes funciona la de la clase hija, incluso si la llamas desde un puntero a la clase hija pero del tipo clase madre. El compilador averigua a quién te refieres y aplica la función correcta. En este caso la función WinProc es virtual desde TWinControl y es la encargada del tratamiento de mensajes de Windows. En este caso, la sobreescritura debe terminar llamando a la función de la clase madre para que trate el resto de mensajes.
Fíjate en esto:
Código:
TNewScrollBox *SC = new TNewScrollBox(this);
TWinControl *WC = SC;
SC->WndProc(msg); // LLama a la función WinProc de TNewScrollBox porque SC lo es.
Saludos.