Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Procedurale Typen auf Stack speichern (https://www.delphipraxis.net/200086-procedurale-typen-auf-stack-speichern.html)

bernau 18. Mär 2019 18:19

Delphi-Version: 10.2 Tokyo

Procedurale Typen auf Stack speichern
 
Einem Event ist eine Procedure zugewiesen. Macht man tausend mal im Code.

Was ich nun möchte ist kurzzeitig eine andere Procedure zuweisen und später wieder die vorherige Zuweisung haben. Ich dachte man kann da gut mit Generics arbeiten. Also habe ich mal etwas rumgespielt. Klappt aber nicht so ganz.

Hier der BeispielCode:

Delphi-Quellcode:
type
  TFormEventStackTest = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    fOnActiveEvent: TNotifyEvent;
    fEventStack: TStack<TNotifyEvent>;
  public
    property OnActiveEvent:TNotifyEvent read fOnActiveEvent write fOnActiveEvent;
    Procedure PushEvent(aEvent:TNotifyEvent);
    procedure PopEvent;
  end;

var
  FormEventStackTest: TFormEventStackTest;

implementation

{$R *.dfm}

procedure TFormEventStackTest.FormCreate(Sender: TObject);
begin
  fEventStack:=TStack<TNotifyEvent>.Create;
end;

procedure TFormEventStackTest.FormDestroy(Sender: TObject);
begin
  fEventStack.Free;
end;

procedure TFormEventStackTest.PushEvent(aEvent: TNotifyEvent);
begin
  // Actives Event auf den Stack
  fEventStack.Push(fOnActiveEvent);
  // Nun ist das neue zugewiesen
  fOnActiveEvent := aEvent;
end;

procedure TFormEventStackTest.PopEvent;
begin
  // vorheriges Event wieder aktivieren.
  fOnActiveEvent := fEventStack.Pop; //  E2010 Inkompatible Typen: 'procedure, untyped pointer or untyped parameter' und 'TNotifyEvent'
end;
Warum bleibt der Compiler beim Pop hängen? Umgekehrt beim Push geht es doch.

Uwe Raabe 18. Mär 2019 18:58

AW: Procedurale Typen auf Stack speichern
 
Der Compiler denkt, du möchtest der Variablen
Delphi-Quellcode:
FOnNotifyEvent
die
Delphi-Quellcode:
function TStack.Pop
zuweisen und lässt das nicht zu. So geht's aber doch:

Delphi-Quellcode:
fOnActiveEvent := fEventStack.Pop();

bernau 18. Mär 2019 19:15

AW: Procedurale Typen auf Stack speichern
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1428028)
Der Compiler denkt, du möchtest der Variablen
Delphi-Quellcode:
FOnNotifyEvent
die
Delphi-Quellcode:
function TStack.Pop
zuweisen und lässt das nicht zu. So geht's aber doch:

Delphi-Quellcode:
fOnActiveEvent := fEventStack.Pop();

Da muss man erst einmal drauf kommen.

Danke dir.:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz