Ver Mensaje Individual
  #2  
Antiguo 17-04-2026
dani36652 dani36652 is offline
Miembro
 
Registrado: abr 2019
Posts: 78
Reputación: 8
dani36652 Va camino a la fama
Cita:
Empezado por jhonalone Ver Mensaje
Gracias de nuevo por el código.

Lo puse en OnCreate y compila bien, pero me tira la app en el arranque.
Llevo un rato dando vueltas, pero no consigo averiguar la causa. Es una aplicación Android14
Un saludo.
Que onda amigazo... tu app se rompe por que Android emite una excepción de tipo ANR "Android No Responde" al ejecutar procesos pesados en el hilo principal, te sugiero usar siempre Threads para procesos pesados NO VISUALES en android como consumir webservices, peticiones hhtp, etc.

Lo qe yo haría en tu caso es:
Código Delphi [-]
 uses
  System.SysUtils, System.Net.HttpClient, System.DateUtils;

function HoraLocalManipulada: Boolean;
var
  HttpClient: TNetHTTPClient;
  t0, t1: TDateTime;
  Respuesta: string;
  HoraServidor: TDateTime;
  HoraLocalAprox: TDateTime;
  Diferencia: Double;
  FS: TFormatSettings;
begin
  Result := False;
  HttpClient := TNetHTTPClient.Create(nil);
  try
    try
      t0 := Now;

      Respuesta := HttpClient.Get('https://intitec.com/debug/getahora.php').ContentAsString(TEncoding.UTF8);
      Respuesta := Trim(Respuesta);

      t1 := Now;

      FS := TFormatSettings.Create;
      FS.DateSeparator := '-';
      FS.TimeSeparator := ':';
      FS.ShortDateFormat := 'yyyy-mm-dd';
      FS.ShortTimeFormat := 'hh:nn:ss';

      if not TryStrToDateTime(Respuesta, HoraServidor, FS) then
        Exit;

      HoraLocalAprox := (t0 + t1) / 2;

      Diferencia := SecondsBetween(HoraServidor, HoraLocalAprox);

      Result := Abs(Diferencia) > 60;
    except
      Result := False;
    end;
  finally
    HttpClient.Free;
  end;
end;


//Forma de uso: 

procedure Algo;
var 
   Thread: TThread;
begin 
   //Puedes mostrar pantalla de carga
   Thread:= TThread.CreateAnonymousThread(procedure
       var 
          HraManipulada: boolean;
       begin 
           HraManipulada:= HoraLocalManipulada;
           TThread.Synchronize(nil, 
           procedure
           begin         
                //Aqui ocultar pantalla de carga o hacerlo en el Evento OnTerminate.
               //Mostrar mensajes, o cualquier cosa que sea meramente visual aquí  
               if HraManipulada = True then 
                  ShowMessage('No le mueva a la hora si no le sabe :P');
           end);
       end);
      Thread.FreeOnTerminate:= True;
      //Thread.OnTerminate := MyOnTerminate (Puedes declararlo así: procedure MyOnTerminate(Sender: TObject);
      Thread.Start;
end;
Responder Con Cita