AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi TNotifyEvent Objektbezogen in Variable speichern
Thema durchsuchen
Ansicht
Themen-Optionen

TNotifyEvent Objektbezogen in Variable speichern

Ein Thema von berens · begonnen am 2. Sep 2009 · letzter Beitrag vom 23. Sep 2009
 
KrasserChecker

Registriert seit: 21. Jul 2004
120 Beiträge
 
#3

Re: TNotifyEvent Objektbezogen in Variable speichern

  Alt 3. Sep 2009, 06:14
Scheinbar scheint ein Event "in Delphi" doch irgendwie anders gehandhabt zu werden, als ausschließlich über einen Zeiger.

Bzgl. einer Alternative würde ich daher vorschlagen einfach das Event über einen Wrapper zu kapseln:

Delphi-Quellcode:
type
  THAL_ObserverItem = class(TObject)
  private
    FEvent: TNotifyEvent;
  public
    constructor Create(iEvent: TNotifyEvent);
  public
    property Event: TNotifyEvent read FEvent write FEvent;
  end;

  THAL_Observer = class(TComponent)
  private
    FListSubscriber: TObjectList;
  protected
    function IndexOfEvent(_Event: TNotifyEvent): Integer;
  public
    procedure NotifySubscriber(_Sender: TObject);

    procedure RegisterSubscriber(_Event: TNotifyEvent);
    procedure UnRegisterSubscriber(_Event: TNotifyEvent);

    constructor Create(_Sender: TComponent); override;
    destructor Destroy; override;
  end;

[...]

{ THAL_ObserverItem }

constructor THAL_ObserverItem.Create(iEvent: TNotifyEvent);
begin
  inherited Create;
  FEvent := iEvent;
end;

{==============================================================================}

{$Region 'constructor THAL_Observer.Create(_Sender: TComponent);'}
constructor THAL_Observer.Create(_Sender: TComponent);
begin
  try
    inherited Create(_Sender);

    FListSubscriber := TObjectList.Create;
  except
    on E: Exception do begin
    end;
  end;
end;
{$EndRegion}

{==============================================================================}

{$Region 'destructor THAL_Observer.Destroy;'}
destructor THAL_Observer.Destroy;
begin
  try
    FreeAndNil(FListSubscriber);

    inherited Destroy;
  except
    on E: Exception do begin
    end;
  end;
end;

function THAL_Observer.IndexOfEvent(_Event: TNotifyEvent): Integer;
var i: Integer;
begin
  for i := 0 to FListSubscriber.Count - 1 do
    if @THAL_ObserverItem(FListSubscriber[i]).Event = @_Event then
    begin
      Result := i;
      Exit;
    end;
  Result := -1;
end;

{$EndRegion}

{==============================================================================}

{$Region 'procedure THAL_Observer.NotifySubscriber(_Sender: TObject);'}
procedure THAL_Observer.NotifySubscriber(_Sender: TObject);
var
  i: integer;
begin
  try
    for i := 0 to FListSubscriber.Count - 1 do begin
      THAL_ObserverItem(FListSubscriber[i]).Event(Self);
    end;
  except
    on E: Exception do begin
    end;
  end;
end;
{$EndRegion}

{==============================================================================}

{$Region 'procedure THAL_Observer.RegisterSubscriber(_Event: TNotifyEvent);'}
procedure THAL_Observer.RegisterSubscriber(_Event: TNotifyEvent);
begin
  try
    if IndexOfEvent(_Event) = -1 then
      FListSubscriber.Add(THAL_ObserverItem.Create(_Event));

  except
    on E: Exception do begin
    end;
  end;
end;
{$EndRegion}

{==============================================================================}

{$Region 'procedure THAL_Observer.UnRegisterSubscriber(_Event: TNotifyEvent);'}
procedure THAL_Observer.UnRegisterSubscriber(_Event: TNotifyEvent);
begin
  try
    if IndexOfEvent(_Event) > -1 then begin
      FListSubscriber.Delete(IndexOfEvent(_Event));
    end;
  except
    on E: Exception do begin
    end;
  end;
end;
{$EndRegion}

{==============================================================================}
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz