Cześć. Mam sobie pewną klasę: TCzytnik.
A w niej m.in.

TCzytnikRead = procedure(Sender: TObject; Str: string) of object;

private    
    FCzytnikRead: TCzytnikRead;
    FLastCzytnikRead: TCzytnikRead;
public
   procedure Unprepare;
   property OnCzytnikRead: TCzytnikRead read FCzytnikRead write SetCzytnikRead;

Procedura SetCzytnikRead wygląda tak:

procedure TCzytnik.SetCzytnikRead(ACzytnikRead: TCzytnikRead);
begin
  if @ACzytnikRead<>@FCzytnikRead then
  begin
    FLastCzytnikRead:=FCzytnikRead;
    FCzytnikRead:=ACzytnikRead;
  end;
end;

Czyli po prostu zmiana procedury zdarzeniowej.
Zamysł jest taki, żeby dotychczasowy adres procedury przechować w zmiennej FLastCzytnikRead
Tutaj wszystko gra. Ładnie.

Następnie w pewnym miejscu należy wywołać procedurę Unprepare(żeby przywrócić poprzednią procedurę):

procedure TCzytnik.Unprepare;
begin
  if @FLastCzytnikRead<>nil then Self.OnCzytnikRead:=FLastCzytnikRead else
     Self.OnCzytnikRead:=DefaultCzytnikRead;
end;

I w tym miejscu już @FLastCzytnikRead ma zupełnie inny adres, niż w SetCzytnikRead. Czemu?
Nigdzie indziej tej zmiennej nie zmieniam.