Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-01-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 04-01-2017
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

En Delphi creo que algo así podría funcionar:

Código Delphi [-]
procedure DoSomething(ListView: TListView);
var
  OldChangeEvent: TLVChangeEvent;
begin
  OldChangeEvent := ListView.OnChange;
  ListView.OnChange := nil;
  try
    // Do the job
  finally
    ListView.OnChange := OldChangeEvent;
  end;
end;

O sea, básicamente, hemos de usar una variable del tipo del evento que queremos "guardar", asignar a dicha variable el evento en cuestión, después "anularlo", hacer nuestro trabajo, y, finalmente, volver a asignar el evento previamente guardado.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 04-01-2017
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.271
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Básicamente es la misma idea que ha comentado David, pero en lugar de hacerlo cada vez que ejecutas la tarea, lo que suelo hacer es quedarme con el evento antes de asignar mi procedimiento.

Es decir, donde hay esto:

Código Delphi [-]
  // Asignar el evento
  Lista.OnChange := ListaChange;

Hacer algo así:

Código Delphi [-]
  // Revisar si ya hay uno asignado
  if Assigned(Lista.OnChange) then begin
    OldChangeEvent := ListView.OnChange;
  end;
  // Asignar el evento
  Lista.OnChange := ListaChange;

De esta forma ya tienes un apuntador al evento antiguo, si es que estaba asignado.

Ahora al inicio o al final de tu procedimiento ListaChange, llamas al evento antiguo si está asignado

Código Delphi [-]
procedure ListaChange....
begin
  // Al inicio o al finalll
  if Assigned(OldChangeEvent) then begin
    OldChangeEvent(... 
  end;

  ...

end;
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta



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
DBGrid: Guardar y No guardar + Validar juliannemiro Varios 2 06-01-2012 06:49:19
Guardar cambios y no guardar ayuda!! THACKER Varios 1 21-07-2008 17:49:52
capturar evento guardar de openDialog crack_neon Varios 6 23-06-2007 19:22:12
Llamar evento desde otro evento nachito_tuc OOP 1 23-08-2006 21:37:43
Capturar el evento de guardar en disco magm2000 Impresión 1 29-07-2004 16:14:47


La franja horaria es GMT +2. Ahora son las 01:44:33.


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