PDA

Ver la Versión Completa : Guardar un evento


Angel.Matilla
04-01-2017, 12:54:23
Buenas y feliz año nuevo a todos.

Tengo una función definida de la siguiente forma:
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í:
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:


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:


// Asignar el evento
Lista.OnChange := ListaChange;


Hacer algo así:


// 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


procedure ListaChange....
begin
// Al inicio o al finalll
if Assigned(OldChangeEvent) then begin
OldChangeEvent(...
end;

...

end;