Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-09-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
mmmm es muy similar a la de sustituir la funcion. En el ejemplo que pusiste, al ser un form, ¿Cmo harias para cear un form y que sea el unico form del proyecto? Cuando creas una aplicacion el c++builder ya te añade el form pero si quieres que use el tuyo modificado en vez del estandar ¿Como lo haces? Ya se que no tiene nada que ver y que es un ejemplo pero me dio curiosidad.
Responder Con Cita
  #2  
Antiguo 27-09-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
bien, lo he vuelto a ver y me di cuenta que no creas ninguna clase sino que modificas la que hay. En ese caso es muy facil porque es la unidad .cpp y .h del form1 pero si fuese por ejemplo de un timage no está el .cpp ni el .h por lo que para hacer eso mismo tendrias que crear una derivada ¿No? Ademas ¿Que ventaja tiene sobreescribir la funcion contra reemplazarla? Supongo que se obtiene exactamente el mismo resultado ¿No?
Responder Con Cita
  #3  
Antiguo 27-09-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 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
  #4  
Antiguo 27-09-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Perdón, el último código de ejemplo sería así
Código:
TNewScrollBox *SC = new TNewScrollBox(this);
TWinControl *WC = SC;
WC->WndProc(msg);  // LLama a la función WinProc de TNewScrollBox porque SC lo es
Saludos.
Responder Con Cita
  #5  
Antiguo 27-09-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
gracias por la aclaracion.
Responder Con Cita
  #6  
Antiguo 27-09-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Ya conoces dos formas de tratamiento de mensajes, una de más alto nivel y la otra más cercana a la API de Windows. Usa la que te guste o te convenga.
Al realizar subclassing en ventanas de Windows (mediante inyección de código), el conocimiento de la segunda te será más útil. En tus aplicaciones, cualquiera de las formas te resultará eficaz.

Saludos.

Última edición por escafandra fecha: 28-09-2014 a las 00:05:17.
Responder Con Cita
  #7  
Antiguo 28-09-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
cuando dices hacer subclasing de ventanas windows ¿Te refieres a hacer un inline a un proceso externo? ¿Algo asi como un hook pero en vez de a una api hacerlo sobre el mismo codigo del proceso?
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿Existe algún error en FireMonkey en el evento OnClosePopup de un ComboBox? RedVenom FireMonkey 0 10-02-2014 18:56:43
Frames. ¿Existe un evento similar a onActivate? adebonis Varios 19 21-11-2008 13:26:50
Comprobar en evento OnExit si valor de campo ya existe JMGR Conexión con bases de datos 9 18-05-2008 03:42:31
Llamar evento desde otro evento nachito_tuc OOP 1 23-08-2006 21:37:43
Existe ? Descendents Varios 1 20-10-2003 18:04:25


La franja horaria es GMT +2. Ahora son las 15:52:37.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi