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...