![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Hola.
Si escafandra, si se va a aplicar eventualmente a un control, esta última opción que mencionas la considero mas práctica por lo sencilla de implementar . header Código PHP:
Código PHP:
Es decir, si voy a usar algo una vez en una aplicación y muy rara vez nuevamente, escribiría el código mas corto y simple si con él obtengo el mismo resultado (pero es mi humilde opinion). Saludos ![]()
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
|
#2
|
||||
|
||||
|
ecfisa, no hablo de cambiar la función sino de sobreescribir la función virtual WndProc del control que estamos creando, derivado de un descendente TWinControl. Es mi técnica preferida.
Saludos. |
|
#3
|
||||
|
||||
|
interesante, ¿Como seria eso amigo? ¿Puedes crear un ejemplo básico?
|
|
#4
|
||||
|
||||
|
Cita:
No veo en línea al amigo escafandra, pero te pongo un ejemplo muy básico de lo que creo a que se refiere (luego me corregirá si me equivoco): header: Código PHP:
Código PHP:
![]()
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
|
#5
|
||||
|
||||
|
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.
|
|
#6
|
||||
|
||||
|
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?
|
|
#7
|
||||
|
||||
|
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);
}
}
//---------------------------------------------------------------------------
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. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
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 |
|