Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TRESTRequest ExecuteAsync und FMX ShowMessage in OnAfterExecute (https://www.delphipraxis.net/197420-trestrequest-executeasync-und-fmx-showmessage-onafterexecute.html)

Codehunter 5. Aug 2018 16:19

TRESTRequest ExecuteAsync und FMX ShowMessage in OnAfterExecute
 
Ahoi,

ich bekomme im TRESTRequest eine Runtime-Exception "Meldungen müssen im Haupt-UI-Thread angezeigt werden" wenn ich innerhalb von OnAfterExecute versuche ShowMessage aufzurufen. Möglich dass ExecuteAsync OnAfterExecute aus einem Thread heraus aufruft. Aber wie bekomme ich dann am besten eine Fehlermeldung visualisiert?

PS: Es geht um FMX, nicht VCL.

Grüße
Cody

TiGü 6. Aug 2018 08:24

AW: TRESTRequest ExecuteAsync und FMX ShowMessage in OnAfterExecute
 
Schau dir mal die Parameterliste und die im Quelltext integrierte Doku von ExecuteAsync in der Klassendefinition an, dann geht dir ein Licht auf. :idea:

Delphi-Quellcode:
uses
  REST.Client,
  REST.Types,
  IPPeerClient,
  System.Json;

procedure TForm3.Button1Click(Sender: TObject);
var
  RESTClient: TRESTClient;
  RESTRequest: TRESTRequest;
  RESTResponse: TRESTResponse;
  MyCompletionHandler: TCompletionHandler;
begin
  RESTClient := TRESTClient.Create(nil);
  RESTRequest := TRESTRequest.Create(nil);
  RESTResponse := TRESTResponse.Create(nil);
  try
    RESTClient.BaseURL := 'http://www.codigopostal.gov.co';
    RESTClient.RaiseExceptionOn500 := False;

    RESTRequest.Client := RESTClient;
    RESTRequest.AddParameter('municipio', 'Santa Marta');
    RESTRequest.AddParameter('departamento', 'Magdalena');
    RESTRequest.AddParameter('direccion', 'Cra. 16 1c-20');
    RESTRequest.Resource := 'glow/param';
    RESTRequest.Response := RESTResponse;

    MyCompletionHandler := procedure
      begin
        if RESTResponse.StatusCode = 200 then
          ShowMessage(RESTResponse.Content)
        else
          ShowMessage('Ist alles oll! Ich mach Hitzefrei!');
      end;

    // der zweite Parameter "ASynchronized" ist per Default auch schon True
    RESTRequest.ExecuteAsync(MyCompletionHandler, True);
  finally
    // Um die Speicherlecks kümmern wir uns in diesem Beispiel-Quelltext mal nicht.

    // RESTClient.Free;
    // RESTRequest.Free;
    // RESTResponse.Free;
  end;
end;

TiGü 6. Aug 2018 08:28

AW: TRESTRequest ExecuteAsync und FMX ShowMessage in OnAfterExecute
 
Alternativ kannst du auch
Delphi-Quellcode:
RESTRequest.SynchronizedEvents := True;
schreiben und damit schon alles gelöst haben.

Delphi-Quellcode:
    /// <summary>
    /// Specifies if Events (such as OnAfterExecute) should run in the context of the main
    /// thread (true) or in the context of an arbitrary thread - which was created by the developer or by using
    /// ExecuteAsync.
    /// </summary>
    //  <seealso cref="TCustomRESTRequest.ExecuteAsync" />
    property SynchronizedEvents: Boolean read FSynchronizedEvents write SetSynchronizedEvents default true;


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