Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Aufruifen von Generic Anonymous methods (https://www.delphipraxis.net/202275-aufruifen-von-generic-anonymous-methods.html)

TigerLilly 15. Okt 2019 16:40

Delphi-Version: 10.2 Tokyo

Aufruifen von Generic Anonymous methods
 
Ich habe

Code:
 TBaseForm = class(TForm)
    procedure ShowHourGlass(Proc: TProc);
  ...
 end;

TbaseForm.ShowHourGlass(Proc: TProc);
begin
  Proc;
end;
Das funktioniert gut. Daselbe wollte ich für Methoden mit einem Parameter machen:

Code:
 TBaseForm = class(TForm)
    procedure ShowHourGlass(Proc: TProc<string>);
  ...
 end;

TbaseForm.ShowHourGlass(Proc: TProc<string>);
begin
  Proc(?);
end;
Aber wie rufe ich die Prozedur dann auf? Was übersehe ich?
Danke für jede Erleuchtung!

Der schöne Günther 15. Okt 2019 16:53

AW: Aufruifen von Generic Anonymous methods
 
Delphi-Quellcode:
  TProc<T> = reference to procedure (Arg1: T);
  TProc<T1,T2> = reference to procedure (Arg1: T1; Arg2: T2);
  TProc<T1,T2,T3> = reference to procedure (Arg1: T1; Arg2: T2; Arg3: T3);
  TProc<T1,T2,T3,T4> = reference to procedure (Arg1: T1; Arg2: T2; Arg3: T3; Arg4: T4);

Folglich:
Delphi-Quellcode:
Proc('Hallo Welt');

TigerLilly 15. Okt 2019 17:19

AW: Aufruifen von Generic Anonymous methods
 
Das hilft mir nicht. Ich möchte ja den Parameter weiterreichen.

Ich habe woanders eine Prozedur TuWas(s:string); und diese übergebe ich an ShowHourGlass(TuWas('Hallo'));

Ich hätte ja auf Proc(Arg1); getippt, aber das war falsch.

peterbelow 15. Okt 2019 19:06

AW: Aufruifen von Generic Anonymous methods
 
Zitat:

Zitat von TigerLilly (Beitrag 1449699)
Ich habe

Code:
 TBaseForm = class(TForm)
    procedure ShowHourGlass(Proc: TProc);
  ...
 end;

TbaseForm.ShowHourGlass(Proc: TProc);
begin
  Proc;
end;
Das funktioniert gut. Daselbe wollte ich für Methoden mit einem Parameter machen:

Code:
 TBaseForm = class(TForm)
    procedure ShowHourGlass(Proc: TProc<string>);
  ...
 end;

TbaseForm.ShowHourGlass(Proc: TProc<string>);
begin
  Proc(?);
end;
Aber wie rufe ich die Prozedur dann auf? Was übersehe ich?
Danke für jede Erleuchtung!

Du brauchst halt eine String-Variable oder Konstante, die innerhalb von Showhourglass sichtbar ist und die übergibst Du an Proc.

Der schöne Günther 15. Okt 2019 19:07

AW: Aufruifen von Generic Anonymous methods
 
Ich verstehe nicht ganz. Du willst ShowHourGlass(..) deine TProc<String> geben und was der String sein soll? Dann brauchst du zwei Parameter.

procedure ShowHourGlass(proc: TProc<String>; procParameter: String);
begin
proc(procParameter);
end;

TigerLilly 15. Okt 2019 20:41

AW: Aufruifen von Generic Anonymous methods
 
Mit einer parameterlosen Prozedur geht das einfach:

proc A;
begin
end;

proc B(Proc:TProc);
begin
Proc;
end;

Der Aufruf: B(A);

Wie geht das, wenn A Parameter hat?

proc A(s:string);

proc B(Proc:TProc<string>);

Der Aufruf: B(A('x'));

Wie sieht die Implementierung in B aus?

proc B(Proc:TProc<string>);
begin
Proc(?); < ---
end;

Der schöne Günther 15. Okt 2019 20:47

AW: Aufruifen von Generic Anonymous methods
 
Nochmal: Der Aufruf "B(A('x'))" heißt: Ich rufe Methode B auf und stecke den Rückgabewert vom Aufruf A('x') als Parameter rein. A gibt aber überhaupt nichts zurück, es ist eine
Delphi-Quellcode:
procedure
, keine
Delphi-Quellcode:
function
. Sie hat keine Rückgabe.

Kann es sein dass du nicht nach TProc<T> suchst sondern nach TFunc<T>?

Ansonsten, falls nicht: Entweder du findest dich damit ab dein B(..) um den String als Parameter erweitern zu wollen, oder du machst es so:

Delphi-Quellcode:
B(
   procedure()
   begin
      A('x');
   end
);
was gleichwertig wäre mit

Delphi-Quellcode:
var
   c: TProc;
begin
   c :=
      procedure()
      begin
         A('X');
      end;
   A(c);
end;

TigerLilly 15. Okt 2019 20:54

AW: Aufruifen von Generic Anonymous methods
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1449721)

Delphi-Quellcode:
B(
   procedure()
   begin
      A('x');
   end
);

Das ist es! Du hast recht, ich hab den Aufruf falsch angesetzt, ich habe Aufruf unbd Übergabe gleich gesetzt. :wall:

Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:52 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