Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Guardar un evento (https://www.clubdelphi.com/foros/showthread.php?t=91326)

Angel.Matilla 04-01-2017 12:54:23

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.

dec 04-01-2017 13:53:39

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.

Neftali [Germán.Estévez] 04-01-2017 16:24:53

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;


La franja horaria es GMT +2. Ahora son las 10:02:09.

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