Ver Mensaje Individual
  #16  
Antiguo 27-09-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Reputación: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita