| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 04 Ene, 2017 12:52 pm Asunto: Guardar un evento |
|
|
Buenas y feliz año nuevo a todos.
Tengo una función definida de la siguiente forma:
| Código: | bool ClickLista(TListView *evLista)
{
if ((evLista->Items->Item[0]->Caption == "SELECCIONAR TODOS" || evLista->Items->Item[0]->Caption == "SELECCIONAR NINGUNO") && evLista->Items->Item[0]->Checked)
{
evLista->Items->Item[0]->Checked = false;
for (int nValor = 1; nValor <evLista>Items->Count; nValor ++)
evLista->Items->Item[nValor]->Checked = evLista->Items->Item[0]->Caption == "SELECCIONAR TODOS" ? true : false;
evLista->Items->Item[0]->Caption = evLista->Items->Item[0]->Caption == "SELECCIONAR TODOS" ? "SELECCIONAR NINGUNO" : "SELECCIONAR TODOS";
}
for (int nValor = 0; nValor <evLista>Items->Count; nValor ++)
if (evLista->Items->Item[nValor]->Checked)
{
evLista->Items->Item[nValor]->Selected;
return true;
}
return false;
}
//--------------------------------------------------------------------------- |
La uso en varias TListView que tengo en la aplicación para ahorrarme código. En cada uno de estos TListView tengo definidos los eventos OnChange y OnClick así:
| Código: | void __fastcall TfCamAfi::ListaChange(TObject *Sender, TListItem *Item, TItemChange Change)
{
ListaClick(NULL);
}
//---------------------------------------------------------------------------
void __fastcall TfCamAfi::ListaClick(TObject *Sender)
{
Lista->OnChange = NULL;
Button3->Enabled = ClickLista(Lista);
Lista->OnChange = ListaChange;
}
//--------------------------------------------------------------------------- |
Para ahorrarme código y, sobre todo, evitar que se me olviden esas líneas en el segundo evento sobre el OnChange me pregunto si habría alguna forma en la función ClickLista de "guardar" de alguna forma el evento asociado al OnChange de forma que al entrar en esa función ClickLista se pusiera a NULL y al completarse volviera a tener su valor orginal. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 04 Ene, 2017 5:03 pm Asunto: |
|
|
Puedes usar esta pequeña clase:
| Código: | class DisableChangeEvent {
TListView* lv_;
TLVChangeEvent OnChange_;
public:
DisableChangeEvent(TListView* lv) : lv_(lv) {
OnChange_ = lv->OnChange;
lv_->OnChange = NULL;
}
~DisableChangeEvent() {
lv_->OnChange = OnChange_;
}
}; |
Y para usarla simplemente:
| Código: | void __fastcall TfCamAfi::ListaClick(TObject *Sender)
{
// La ponemos al principio, y automáticamente al
// salir vuelve a restaurar el evento original
DisableChangeEvent d(Lista);
Button3->Enabled = ClickLista(Lista);
} |
|
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 04 Ene, 2017 5:33 pm Asunto: |
|
|
Muchas gracias Leo; una idea muy elegante. Pero ¿dónde hago esa declaración? El problema, creo, es que estas funciones que llamo en varios sitios las tengo declaras en un módulo y las llamo como extern ... desde los formularios.
| Código: | //---------------------------------------------------------------------------
#include <vcl>
#pragma hdrstop
#include "CamAfi.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfCamAfi *fCamAfi;
extern bool ClickLista(TListView *evLista);
//---------------------------------------------------------------------------
__fastcall TfCamAfi::TfCamAfi(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------------- |
_________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 04 Ene, 2017 5:40 pm Asunto: |
|
|
| Angel escribió: | | Pero ¿dónde hago esa declaración? |
Puedes declararlo en alguna cabecera común, o en una propia. Yo tengo la costumbre de crear un módulo de "utilidades" o "varios" donde voy declarando clases y funciones así pequeñas como esta que luego uso muchas veces a lo largo de un programa. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mar 17 Ene, 2017 10:08 am Asunto: |
|
|
Retomo este tema.
Leo: el código que pusiste antes funciona de fábula pero voy un paso más allá. He visto en la ayuda de Builder que hay muchas entradas del tipo TLV... referidas a todas a eventos de un TListView. ¿Dónde podría encontrar ayuda para este mismo tipo de cosas de otros elementos?
Me explico mejor: ¿cómo podría hacer para guardar / restaurar, por ejemplo, el evento OnExit de un TEdit o el OnClick de un TRadioGroup? He estado dando vueltas por la ayuda y no he visto nada más allá de TNotifyEvent.
He probado esto, cogiendo un poco la idea de tu código anterior:
| Código: | TComponent *Source;
TNotifyEvent OnExit_;
for (nItem = 0; nItem < this->ComponentCount; nItem ++)
{
Source = this->FindComponent("Boton");
if (Source != NULL)
if (Source->ClassNameIs("TEdit") || Source->ClassNameIs("TLabeledEdit"))
{
AyuEdit = static_cast<TCustomEdit *>(Source);
OnExit_ = AyuEdit->OnExit;
break;
}
} |
pero me da un error
| Cita: | | E2247 'TWinControl::OnExit' is not accessible |
Repito que no quiero que me lo resuelvas, quiero saber dónde puedo encontrar ayuda. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 19 Ene, 2017 2:52 pm Asunto: |
|
|
Hola Ángel, lo siento, no puedo recomendarte ninguna ayuda ya que aparte de echar un vistacillo por la red, lo que suelo hacer mucho es mirar las cabeceras del propio Builder y a veces curiosear en el código fuente que viene incluido.
Esta gente de Embarcadero debe pensar que han mejorado la ayuda, pero a mí me sigue pareciendo bastante malilla. Era bastante mejor en los viejos tiempos de Borland (hasta que se les cruzaron los cables). Además de ser incapaces de crear algo para integrarla mejor en el IDE y no tener que estar soportando tantos retardos. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
|