Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Procedure-Aufruf mit Reference (https://www.delphipraxis.net/206666-procedure-aufruf-mit-reference.html)

Ykcim 16. Jan 2021 09:57

Procedure-Aufruf mit Reference
 
Hallo Zusammen,

ich habe wieder ein Brett vor dem Kopf...

Ich muss Proceduren in einer bestimmten Reihenfolge aufrufen und muss daher mit CallBacks arbeiten...

Delphi-Quellcode:
type
   TDataRecievedCallback = reference to procedure;
   TDataRecieved_JSResult = reference to procedure(JSResult: string);
   TDataRecieved_JSBoolean = reference to procedure(JSBoolean: Boolean);


procedure TMySQL.xData_Main_ConnectConnect(Sender: TObject);
var  Design: TDesign_App;
begin
   Design:= TDesign_App.create;
   Try
      Get_Sprachen(nil);
      Get_Land(nil);
      Get_Company_Details(                //TDataRecievedCallback
         @Get_CustProperties(             //TDataRecievedCallback
            @Check_login_code(            //TDataRecieved_JSBoolean .........    Diese Zeile markiert der Compiler und meint wahrscheinlich @Design.Create_Form_TVApp
               @Design.Create_Form_TVApp
            )
         )
      );
   Finally
      Design.Free;
   End;
end;
Beim Compilieren bekomme ich die Fehlermeldung:
Code:
[Fehler] TTVA_Data_ModuleUnit.pas(188): Incompatible type arg no. 1: Got "procedure(TDataRecieved_JSBoolean) of Object", expected "reference to procedure()"
Das sind die relvanten Procedure:
Delphi-Quellcode:
procedure TMySQL.Get_Company_Details(AOnDataRecieved: TDataRecievedCallback);
   procedure OnResponse(Response: TXDataClientResponse);
   begin
      //Daten verarbeiten
      if Assigned(AOnDataRecieved) then begin
         AOnDataRecieved();
      end;
   end;
begin
   //Aufruf eines Service
end;


procedure TMySQL.Get_CustProperties(AOnDataRecieved: TDataRecievedCallback);
   procedure OnResponse(Response: TXDataClientResponse);
   begin
      //Daten verarbeiten
      if Assigned(AOnDataRecieved) then begin
         AOnDataRecieved();
      end;
   end;
begin
   //Aufruf eines Services
end;

//Hier scheint etwas nicht zu stimmen - oder mit der angegebenen AOnDataRecieved Procedure, die danach folgt
procedure TMySQL.Check_login_code(AOnDataRecieved: TDataRecieved_JSBoolean);
   procedure OnResponse(Response: TXDataClientResponse);
   var  JSObj: TJSObject;
         Ergebnis: boolean;
   begin
      JSObj:=TJSJSON.parseObject(Response.ResponseText);
      Ergebnis:= StrToBool(String(JSObj['value']));
      if (Assigned(AOnDataRecieved)) then begin
         AOnDataRecieved(Ergebnis);
      end;
   end;
begin
   //Aufruf eines Services
end;


procedure TDesign_App.Create_Form_TVApp(login_valid: boolean);
begin
   if login_valid=false then
      Create_LogIn;
   if Assigned(Form_TheVisitApp) then begin
      Form_TheVisitApp.WIC_Logo.URL:=MySQL.xWDS_Customerlogo_image.AsString;
   end;
end;
Könnt ihr mir helfen, das Ding zum Fliegen zu bringen?

Vielen Dank
Patrick

Incocnito 18. Jan 2021 07:04

AW: Procedure-Aufruf mit Reference
 
Ohne jetzt alles im Detail zu prüfen ...
Auch habe ich null Erfahrung mit "reference to X" ...
Aber Im Kommentar steht, dass Get_Company_Details vom Typ TDataRecievedCallback sein soll.
Nur TDataRecievedCallback hat keine Übergabeparameter.
Das dürfte schon das Problem sein.
Die Typen für die Prozeduren/Funktionen, die definiert sind, passen nicht zur Verwendung.

Das geht nicht:
Delphi-Quellcode:
type TMyProc = procedure;

Procedure DoSomething(theProc : TMyProc);
Begin
  theProc('Hallo');
End;
Das geht:
Delphi-Quellcode:
type TMyProc = procedure(const sText : String);

Procedure DoSomething(theProc : TMyProc);
Begin
  theProc('Hallo');
End;
Ich hoffe das hilft schon.

MfG Incocnito

Der schöne Günther 18. Jan 2021 07:15

AW: Procedure-Aufruf mit Reference
 
PS: Die ganzen Typen muss man nicht selbst definieren, es gibt in System.SysUtils schon
Delphi-Quellcode:
TProc = reference to procedure()
und
Delphi-Quellcode:
TProc<T> = reference to procedure(arg: T)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:46 Uhr.

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