Einzelnen Beitrag anzeigen

Ykcim

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

AW: Programm-Aufbau bei asynchronem DB-zugriff

  Alt 29. Nov 2019, 08:22
Vielen Dank!

Ich bin neu in der asynchrone Kommunikation und tue mich damit noch echt schwer...
Die Videos sind bei mir alle in den Lesezeichen, weil ich sie mir sooft ansehe...

Der Support von TMS hat mich in einem anderen Thema unterstützt, was aber die gleich Ursache hatte. Ich muss einfach lernen, andersherum zu denken. Bis jetzt waren bei meinen Programmen die Daten immer sofort da. Jetzt muss ich auf sie warten.

Aber man bekommt automatisch viele Verschachtlungen, oder?

Ich habe es jetzt so gelöst:

Delphi-Quellcode:
procedure TForm_NMain.WebFormShow(Sender: TObject);
begin
   Create_frmLogIn;
end;

procedure TForm_NMain.Create_frmLogIn;
begin
   Frame_Control.TabIndex:=0;
   if not Assigned(Form_LogIn) then begin
      Form_LogIn := TForm_LogIn.CreateNew(Sheet_LogIn.ElementID, nil);
      Form_LogIn.OnLogIn_Run:=Run_LogIn;
      Data_Module.xConnection_connect(procedure
         begin
            Data_Module.Get_Sprache(Design.Design_LogIn);
         end
         );
   end;
end;


//in TDataUnit
type
   TConnectCallback = reference to procedure;
   TDataRecievedCallback = reference to procedure;


procedure TData_Module.xConnection_connect (AOnConnect: TConnectCallback);
   procedure OnConnect;
   begin
      if Assigned(AOnConnect) then AOnConnect();
   end;
   procedure OnError(Error: TXDataWebConnectionError);
   begin
      ShowMessage('XData server connection failed with error: ' +
      Error.ErrorMessage);
   end;
begin
   if xConnection.Connected then begin
      if Assigned(AOnConnect) then AOnConnect();
   end
   else begin
      xConnection.Open(@OnConnect, @OnError);
   end;
end;

procedure TData_Module.Get_Sprache(AOnDataRecieved: TDataRecievedCallback);
   procedure OnResponse(Response: TXDataClientResponse);
   begin
      xDST_Sprache.Close;
      {xDST_Sprache_SetFields;}
      xDST_Sprache.SetJsonData(TJSArray(Response.Result));
      xDST_Sprache.Open;
      if Assigned(AOnDataRecieved) then AOnDataRecieved();
   end;
begin
   xClient.RawInvoke('IData_xChangeService.Get_Sprache',[], @OnResponse);
end;

Damit klappt es jetzt gut. Aber wenn jemand noch Verbesserungen und Vereinfachungen sieht, bin ich für Lernunterstützung immer dankbar!

Ich habe allerdings {xDST_Sprache_SetFields; auskommentiert, weil ich die Felder des DataSet noch nicht zur Laufzeit erstellt bekomme.

Delphi-Quellcode:
procedure TData_Module.xDST_Sprache_SetFields;
begin
   xDST_Sprache.Fields.Clear;
   with xDST_Sprache.FieldDefs do begin
      Add('sprache_id', ftInteger, 0, false);
      Add('sprache', ftString, 45, false);
      Add('login_Titel', ftString, 45, false);
      Add('login_label_username', ftString, 45, false);
      Add('ftString', ftString, 45, false);
      Add('login_btn_login', ftString, 45, false);
      Add('login_btn_abbruch', ftString, 45, false);
      Add('uebersicht_titel', ftString, 45, false);
      Add('grid_schnellsuche', ftString, 45, false);
   end;
end;
Da kommt dann immer der Fehler
Zitat:
fMessage::EntitySetName not specified.
Den EntitySetNamen setze ich nicht, weil ich das DataSet ja manuell bestücke...
Hat da jemand eine Idee, wie ich das korrekt machen muss?

Vielen Dank
Patrick
Patrick

Geändert von Ykcim (29. Nov 2019 um 08:27 Uhr)
  Mit Zitat antworten Zitat