Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Guardar un evento

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Guardar un evento Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias Leo.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchas gracias Leo.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.