Einzelnen Beitrag anzeigen

Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
824 Beiträge
 
Delphi 10.4 Sydney
 
#1

Und wieder einmal CallBack

  Alt 22. Dez 2020, 17:09
Delphi-Version: 10.4 Sydney
Hallo Zusammen,

ich habe das Thema leider immer noch nicht unter die Füße bekommen...
Callback-Procedure ohne Parameter-Übergabe laufen mittlerweile, aber jetzt müsste ich unsauber arbeiten, wenn ich es weiterhin ohne mache...

Ich habe diesen Type definiert:
Delphi-Quellcode:
type
  TDataRecieved_Param = reference to procedure(JSResult: boolean);
und eine Procedure, in dem dieser Type zur Anwendung kommen soll:
Delphi-Quellcode:
public
    { Public-Deklarationen }
    procedure Mail_Confirm(v_code: string; DataRecieved_Param: TDataRecieved_Param);
In dieser Procedure wird ein Service aufgerufen und ein Überprüfung gibt einen boolean-Wert zurück.
Delphi-Quellcode:
procedure TForm_MailConf.Mail_Confirm(v_code: string; DataRecieved_Param: TDataRecieved_Param);
   procedure OnResponse(Response: TXDataClientResponse);
   var JSResult: boolean;
         JSObj: TJSObject;
   begin
      JSObj:=TJSJSON.parseObject(Response.ResponseText);
      JSResult:= StrToBool(String(JSObj['value']));
      if (Assigned(DataRecieved_Param)) then begin
         DataRecieved_Param(JSResult);
      end;
   end;
begin
   Try
      xDWC_MailConfirmed.RawInvoke('ITV_CreateNewCustService.Valid_LogIn',[v_code], @OnResponse);
   Except
      MessageDlg('Es hat einen Fehler beim Speichern gegeben',WEBLib.Dialogs.mtError, [mbOK]);
      Exit;
   End;
end;
Jetzt möchte ich der Callback-Procedure diesen Wert übergeben. Ich dachte, dass ich das hiermit mache:
Delphi-Quellcode:
if (Assigned(DataRecieved_Param)) and (JSResult=true) then begin
         DataRecieved_Param(JSResult);
      end;
Mit dem Aufruf der habe ich meine Probleme. Bei Callbacks ohne Prameter habe ich das so gemacht:
Delphi-Quellcode:
procedure TForm_MailConf.WebButton1Click(Sender: TObject);
var v_code: string;
      JSResult: boolean;
begin
   v_code:=GetQueryParam('mail_code');
   Mail_Confirm(v_code, procedure begin Display_Result(JSResult) end); //Allerdings war dann da kein Parameter.
end;
Ich habe folgende Varianten versucht:
Delphi-Quellcode:
Mail_Confirm(v_code, procedure begin Display_Result end); //Ich dachte, dass das geht, denn er bekommt den Parameter ja in der Mail_Confirm. Fehler: [Fataler Fehler] Wrong number of parameters specified for call to "Display_Result"

Mail_Confirm(v_code, procedure begin Display_Result(JSResult) end); //Ich dachte, vielleicht muss ich einen Parameter mitgeben, der dann überschrieben wird. Fehler: [Fataler Fehler] Incompatible type arg no. 2: Got "Procedure/Function", expected "TDataRecieved_Param"
Und während ich Euch das hier aufschreibe, komme ich auf die Lösung... Ich lasse es jetzt hier drinstehen, denn vielleicht hilft es jemandem weiter...

Die Lösung:
Mail_Confirm(v_code, @Display_Result); Wenn ich das richtig verstanden habe, dann sorgt das @ dafür, dass die Procedure nur als ein Zeiger verstanden und sie nicht sofort ausgeführt wird. Den Parameter muss ich nicht übergeben, denn der wird ja beim Aufruf in Mail_Confirmed gesetzt.

Jedenfalls so funktioniert es...
Patrick
  Mit Zitat antworten Zitat