Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Desarrollo en Delphi para Android (https://www.clubdelphi.com/foros/forumdisplay.php?f=57)
-   -   Permisos android 8. v/s android 10 (https://www.clubdelphi.com/foros/showthread.php?t=95088)

viverosjosem 23-02-2021 03:34:38

Permisos android 8. v/s android 10
 
Hola Amigos.
Tengo una aplicacion para android realizada en Delphi Rio. Funciona bien. Pero solo para android 8, o inferior. Si la instalo en android 10. La aplicacion se cuelga. Solo muestra el splash de inicio, y no hace nada.

Anteriormente habia consultado por un problema similar, en este mismo foro. La aplicacion corria bien en android 8, compilada con delphi tokio, pero se colgaba si la compilaba con delphi Rio.

En este mismo foro jhonny me dio la solucion. Tenia un problema de permisos. (http://clubdelphi.com/~marcsc/foros/...ad.php?t=94292)
En ese momento, incorpore el codigo de mas abajo, y todo funciono bien. Pero ahora, instalando la aplicacion en un tablet con android 10, la aplicacion se cuelga. Pero, si la instalo en un tablet con android 8, si funciona. ...Alguna idea?


Código Delphi [-]
procedure TFCentral.FormCreate(Sender: TObject);
begin
   PermissionsService.RequestPermissions([JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE)],
   procedure(const APermissions: TArray<string>; const AGrantResults: TArray)
   begin
    if (Length(AGrantResults) = 1) and (AGrantResults[0] = TPermissionStatus.Granted) then
    begin

       ValidaConector;
       ValidaResiduos;
       ActivaFTP;        //AddFiles;
       lbEstado.Text := 'Conectado';
    end
    else
       begin
         lbEstado.Text := 'No conectado';
       end;
   end)
end;

Gracias.

Saludos.
Jose Miguel.

voci 23-02-2021 14:06:00

¿Por que has llegado a la conclusión de que es un tema de permisos?, no se si tiene algo que ver, pero hace tiempo que la play store no te permite subir aplicaciones compiladas con esa versión de delphi. tienes que compilarlas con delphi sydney.

Saludos.

Casimiro Notevi 23-02-2021 14:14:41

Cita:

Empezado por voci (Mensaje 540147)
¿Por que has llegado a la conclusión de que es un tema de permisos?, no se si tiene algo que ver, pero hace tiempo que la play store no te permite subir aplicaciones compiladas con esa versión de delphi. tienes que compilarlas con delphi sydney.
Saludos.

¿En serio? ¿y eso por qué?

voci 23-02-2021 15:44:46

Cita:

Empezado por Casimiro Notevi (Mensaje 540148)
¿En serio? ¿y eso por qué?

No es que no permita explícitamente subir aplicaciones compiladas por la versión 10.3.x, pero es obligatorio que se compilen para la API 29 y hasta la versión 10.4 (sydney) delphi no compila las aplicaciones con esa API.

Saludos.

Casimiro Notevi 23-02-2021 17:02:11

¡Ah! eso es cierto, y a final de año será obligatorio la v.30

viverosjosem 24-02-2021 04:30:20

Cita:

¿Por que has llegado a la conclusión de que es un tema de permisos?, no se si tiene algo que ver, pero hace tiempo que la play store no te permite subir aplicaciones compiladas con esa versión de delphi. tienes que compilarlas con delphi sydney.
Saludos.
Hola Voci. Se me ocurrio que podia ser un tema de permisos, porque anteriormente cuando tenia la misma aplicacion compilada en delphi tokyo, paso lo mismo cuando compile la aplicacion con delphi 10.3, se colgaba al ejecutarla. Agregue las lineas indicadas abajo.., y todo funciono con delphi 10.3. Ahora, la misma aplicacion compilada en delphi 10.3, pero esta vez corriendo en un android 10, no funciona, se cuelga.

De todas maneras, nunca e subido las aplicaciones a google play. Las instalo directamente en el dispositivo requerido.

Alguna idea de que puede estar pasando?

Saludos.
Jose Miguel.


Código Delphi [-]
procedure TFCentral.FormCreate(Sender: TObject);
begin
   PermissionsService.RequestPermissions([JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE)],
   procedure(const APermissions: TArray<string>; const AGrantResults: TArray)
   begin
    if (Length(AGrantResults) = 1) and (AGrantResults[0] = TPermissionStatus.Granted) then
    begin

       ValidaConector;
       ValidaResiduos;
       ActivaFTP;        //AddFiles;
       lbEstado.Text := 'Conectado';
    end
    else
       begin
         lbEstado.Text := 'No conectado';
       end;
   end)
end;

Casimiro Notevi 24-02-2021 09:54:44

Intenta seguir paso a paso, es "casi" imposible que lo sepamos sin tener el código para probar.

voci 24-02-2021 14:00:07

Todo lo anterior te lo digo porque yo tenía una aplicación compilada con 10.3.3 y al intentar ejecutarla en una versión 10 de android aparecía la pantalla de inicio y se cerraba, con las versiones 9 y anteriores funcionaba sin problemas.

De todas formas si crees que es esa parte del código, porque no la anulas y antes de ejecutar la aplicación vas a ajustes de sistema y activas los permisos manualmente, creo que es una forma de salir de dudas, aunque la única forma correcta es depurar la aplicación directamente en el dispositivo.

Saludos.

kurono 25-02-2021 04:13:30

cuando yo hago aplicaciones y me pasa eso lo que hago es ejecutar una aplicacion en blanco sin ningun componente asi compruebo si es un problema de API o de permiso has esa prueba a ver que pasa

viverosjosem 25-02-2021 04:44:04

Hola Casimiro y Voci.
Aqui va una procion de codigo que e probado en Delphi Tpkyo, y Delphi Rio. En Delphi Tokyo finciona. En Delphi Rio, se cuelga. Los permisos los active manualmente desde telefono Android.

Código Delphi [-]
...
...
var
  // Permissions
  vReader_Access: string;
  vWrite_Access: string;
...
...

procedure TFConfigIP.FormCreate(Sender: TObject);
begin
   vReader_Access := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE);
   vWrite_Access    := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE);
end;



procedure TFConfigIP.FormShow(Sender: TObject);
begin
  if TOSVersion.Check(6) then
  begin
    PermissionsService.RequestPermissions([vReader_Access, vWrite_Access], LocationPermissionRequestResult);
  end
end;


procedure TFConfigIP.LocationPermissionRequestResult(Sender: TObject;
  const APermissions: TArray<string>;
  const AGrantResults: TArray);
var
  LocationPermissionGranted: Boolean;
  sFile   : String;

begin
   sFile := SDCARD + 'Server.csv';    //-->    SDCARD  = '/sdcard/download/';

   LocationPermissionGranted := (Length(AGrantResults) = 2) and
     (AGrantResults[0] = TPermissionStatus.Granted) and
     (AGrantResults[1] = TPermissionStatus.Granted);

   //======>> Aqui ya no entra. En Tokyo, todo bien. Pero en Delphi Rio, se cuelga, y no presenta ningun tipo de mensaje.
    
   if LocationPermissionGranted then begin
      if (FileExists(sFile)) then begin
         ShowMessage( 'Permiso concedido.');
         CargaServer(sFile);
      end
      else begin
         ShowMessage( sFile + ', no encontrado. lo crearemos.');
         FTP_Server;
      end;
   end
   else
      ShowMessage( 'Permiso denegado.');
end;


procedure TFConfigIP.CargaServer(sFile: String);
var
   f : System.TextFile;
   j : String;

begin
   AssignFile(f, sFile );
   Reset(f);

   while not SeekEof(f) do
   begin
      if SeekEoln(f) then
        Readln;

      Read( f, j );
      j := Trim( j );

      EdServer.Text  := GetParam(j, ';');    // GetParam, es una funcion que descompone un String. En este caso, separado por ";"
      EdCodigo.Text  := GetParam(j, ';');
      EdPasword.Text := GetParam(j, ';');
   end;

   CloseFile( f );
end;

Espero que este ejemplo sirva de algo, y, me puedan dar luces de que esta pasando.

Gracias.

Saludos.
Jose Miguel.

voci 25-02-2021 17:27:38

No veo nada fuera de lo normal, si quieres darle otro enfoque pueba esto:

Código Delphi [-]
procedure TFConfigIP.FormShow(Sender: TObject);
begin
  if (PermissionsService.IsPermissionGranted(JStringToString(TJManifest_permission.JavaClass.READ_EXTERNA  L_STORAGE))= false) or (PermissionsService.IsPermissionGranted(JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERN  AL_STORAGE))= false) then
    PermisoEscrituraLectura
  else
    Servidor;
end;

procedure TFConfigIP.PermisoEscrituraLectura;
begin
  PermissionsService.RequestPermissions([JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE), JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE)],
  procedure(const APermissions: TArray<string>; const AGrantResults: TArray)
  begin
    if (Length(AGrantResults) = 2) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) then
      begin
        ShowMessage( 'Permiso concedido.');
        Servidor;
      end
    else
      ShowMessage( 'Permiso denegado.');
  end)
end;

procedure TFConfigIP.Servidor;
var
   sFile: String;
begin
  sFile:= SDCARD + 'Server.csv';    //-->    SDCARD  = '/sdcard/download/';
  if (FileExists(sFile)) then
    CargaServer(sFile)
  else
    begin
      ShowMessage( sFile + ', no encontrado. lo crearemos.');
      FTP_Server;
    end;
end;

Saludos.

viverosjosem 26-02-2021 03:53:17

Hola Voci.
Intente compilar tu codigo. Pero da error. No reconoce el tipo TArray

Código Delphi [-]
procedure TFConfigIP.PermisoEscrituraLectura;
begin
  PermissionsService.RequestPermissions([JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE), JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE)],
  procedure(const APermissions: TArray<string>; const AGrantResults: TArray)   //<-- Aqui da error de compilacion
  begin
    if (Length(AGrantResults) = 2) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) then
      begin
        ShowMessage( 'Permiso concedido.');
        Servidor;
      end
    else
      ShowMessage( 'Permiso denegado.');
  end)
end;

Agradecido.

Saludos.
Jose Miguel.

voci 26-02-2021 14:57:31

¿has incluido la librería "System.Permissions"?, ¿Que error te indica?.

Saludos.

viverosjosem 26-02-2021 23:36:55

HOla voci.
Si, esta incluida la libreria System.Permissions.

El error que arroja es el siguiente:

[DCC Error] UConfigIP.pas(539): E2003 Undeclared identifier: 'TArray'

Código Delphi [-]
 PermissionsService.RequestPermissions([JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE), JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE)],
  procedure(const APermissions: TArray<string>; const AGrantResults: TArray)   //<-- Aqui da error de compilacion

voci 27-02-2021 13:37:00

Compilado con delphi 10.3.3 y probado en mi móvil con android 7.

Código Delphi [-]
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Permissions,
  Androidapi.Helpers, Androidapi.JNI.Os, Androidapi.JNI.JavaTypes;
type
  TFConfigIP = class(TForm)
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
    procedure PermisoEscrituraLectura;
    procedure Servidor;
  public
    { Public declarations }
  end;

var
  FConfigIP: TFConfigIP;

implementation

{$R *.fmx}

procedure TFConfigIP.FormShow(Sender: TObject);
begin
  if (PermissionsService.IsPermissionGranted(JStringToString(TJManifest_permission.JavaClass.READ_EXTERNA  L_STORAGE))= false) or (PermissionsService.IsPermissionGranted(JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERN  AL_STORAGE))= false) then
    PermisoEscrituraLectura
  else
    Servidor;
end;


procedure TFConfigIP.PermisoEscrituraLectura;
begin
  PermissionsService.RequestPermissions([JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE), JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE)],
  procedure(const APermissions: TArray<string>; const AGrantResults: TArray)
  begin
    if (Length(AGrantResults) = 2) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) then
      begin
        ShowMessage( 'Permiso concedido.');
        Servidor;
      end
    else
      ShowMessage( 'Permiso denegado.');
  end)
end;

procedure TFConfigIP.Servidor;
begin

end;

end.

Saludos.

viverosjosem 27-02-2021 16:45:46

Hola Voci.

Cita:

Compilado con delphi 10.3.3 y probado en mi móvil con android 7.
El punto es que funciona bien con android 7, y android 8. El problema es que en Android 10 no funciona.

La misma aplicacion, sin cambiarle nada. Al instalarla en un dispositivo con Android 10, se cuelga al iniciar. No funciona. Inclusive tengo que reiniciar el dispositivo con Android 10, para poder cerrar la aplicacion.

Allguma idea?

Saudos.
Jose Miguel.

voci 28-02-2021 12:31:27

Código Delphi [-]
PermissionsService.RequestPermissions([JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE), JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE)],
  procedure(const APermissions: TArray<string>; const AGrantResults: TArray)   //<-- Aqui da error de compilacion

Como dices que te daba un error de compilación te he puesto el código completo para que lo compiles y lo pruebes en android 10, yo no tengo ningún dispositivo con esa versión.

Así te aseguras que el problema está al otorgar/negar los permisos.

Saludos.

viverosjosem 28-02-2021 18:56:15

Hola Voci.
Volvi a compilar tu codigo. Pero obtengo los mismos errores, que te comparto mas abajo.

Nuevamente no me reconoce el tipo Array.

Código Delphi [-]
PermissionsService.RequestPermissions([JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE), JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE)],
  procedure(const APermissions: TArray<string>; const AGrantResults: TArray)   //<-- Aqui da error de compilacion

Código Delphi [-]
  -V -VN -NO.\Android\Debug  ConfigIP.dpr   
[DCC Error] UConfigIP.pas(40): E2003 Undeclared identifier: 'TArray'
[DCC Error] UConfigIP.pas(42): E2008 Incompatible types
[DCC Error] UConfigIP.pas(42): E2012 Type of expression must be BOOLEAN
[DCC Error] UConfigIP.pas(49): E2250 There is no overloaded version of 'RequestPermissions' that can be called with these arguments
[DCC Fatal Error] ConfigIP.dpr(7): F2063 Could not compile used unit 'UConfigIP.pas'
Failed
Elapsed time: 00:00:02.1

Saludos.
Jose Miguel.

viverosjosem 02-03-2021 03:13:48

Hola Kurono.
Disculpa, no habia visto tu mensaje.

Cita:

cuando yo hago aplicaciones y me pasa eso lo que hago es ejecutar una aplicacion en blanco sin ningun componente asi compruebo si es un problema de API o de permiso has esa prueba a ver que pasa
Hice lo que propones. Quite todo el codigo de acceso al disco. Y la aplicacion funciona bien en Android 10. Pero al volver a incorporar el codigo que requiere leer datos del disco. esta se cuelga. Osea, claramente, es un problema de permisos en android 10.

Alguna idea.

Saludos.
Jose Miguel.

Casimiro Notevi 02-03-2021 09:38:49

A ver si esa variable SDCARD está apuntando a algún sitio que no existe en ese dispositivo android 10

kurono 03-03-2021 05:23:26

Cita:

Empezado por viverosjosem (Mensaje 540234)
Hola Kurono.
Disculpa, no habia visto tu mensaje.



Hice lo que propones. Quite todo el codigo de acceso al disco. Y la aplicacion funciona bien en Android 10. Pero al volver a incorporar el codigo que requiere leer datos del disco. esta se cuelga. Osea, claramente, es un problema de permisos en android 10.

Alguna idea.

Saludos.
Jose Miguel.


intenta asignar los permiso desde el archivo xml que se gernera a ver que ocurre

viverosjosem 12-03-2021 03:46:47

Hola Kurono.
modifique manualmente el arcchivo XML, pero este es reescrito por delphi al compilar la aplicacion. (no funciono).

Aprovecho a comentarles que encontre este codigo en: C:\Users\Public\Documents\Embarcadero\Studio\20.0\Samples\Object Pascal\Mobile Snippets\AccessCameraApp

Código Delphi [-]
//---------------------------------------------------------------------------

// This software is Copyright (c) 2015-2019 Embarcadero Technologies, Inc.
// You may only use this software if you are an authorized licensee
// of an Embarcadero developer tools product.
// This software is considered a Redistributable as defined under
// the software license agreement that comes with the Embarcadero Products
// and is subject to that software license agreement.

//---------------------------------------------------------------------------

unit uMain;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.Permissions,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, System.Actions,
  FMX.ActnList, FMX.StdActns, FMX.MediaLibrary.Actions, FMX.Objects, FMX.Graphics,
  FMX.Controls.Presentation;

type
  TAccessCameraAppForm = class(TForm)
  private const
    PermissionCamera = 'android.permission.CAMERA';
    PermissionReadExternalStorage = 'android.permission.READ_EXTERNAL_STORAGE';
    PermissionWriteExternalStorage = 'android.permission.WRITE_EXTERNAL_STORAGE';
  private
    procedure DisplayRationale(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc);
    procedure TakePicturePermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray);
  published var
    alGetFromCamera: TActionList;
    TakePhotoFromCameraAction1: TTakePhotoFromCameraAction;
    imgCameraImage: TImage;
    ToolBar1: TToolBar;
    btnTakePhoto: TButton;
    Label1: TLabel;
  published
    procedure TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
    procedure btnTakePhotoClick(Sender: TObject);
  end;

implementation

uses
  FMX.DialogService;

{$R *.fmx}
{$R *.LgXhdpiPh.fmx ANDROID}

// Optional rationale display routine to display permission requirement rationale to the user
procedure TAccessCameraAppForm.DisplayRationale(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc);
begin
  var RationaleMsg: string;

  for var I := 0 to High(APermissions) do
  begin
    if APermissions[i] = PermissionCamera then
      RationaleMsg := RationaleMsg + 'The app needs to access the camera to take a photo' + SLineBreak + SLineBreak
    else if APermissions[i] = PermissionReadExternalStorage then
      RationaleMsg := RationaleMsg + 'The app needs to read a photo file from your device';
  end;

  // Show an explanation to the user *asynchronously* - don't block this thread waiting for the user's response!
  // After the user sees the explanation, invoke the post-rationale routine to request the permissions
  TDialogService.ShowMessage(RationaleMsg,
    procedure(const AResult: TModalResult)
    begin
      APostRationaleProc;
    end)
end;

procedure TAccessCameraAppForm.btnTakePhotoClick(Sender: TObject);
begin
  PermissionsService.RequestPermissions([PermissionCamera, PermissionReadExternalStorage, PermissionWriteExternalStorage], TakePicturePermissionRequestResult, DisplayRationale)
end;

procedure TAccessCameraAppForm.TakePicturePermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray);
begin
  // 3 permissions involved: CAMERA, READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE
  if (Length(AGrantResults) = 3) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) and (AGrantResults[2] = TPermissionStatus.Granted) then
    TakePhotoFromCameraAction1.Execute
  else
    TDialogService.ShowMessage('Cannot take a photo because the required permissions are not all granted')
end;

procedure TAccessCameraAppForm.TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
begin
  { Assign the image retrieved from the Camera to the TImage component. }
  imgCameraImage.Bitmap.Assign(Image);
end;

end.

Lo compile, luego lo instale en mi android 10. La aplicacion funciono. Me presento un mensaje donde me pedia permisos para acceder a la camara del dispositivo. Le di aceptar. Luego me presento un mensaje, solicitando permiso para acceder a mis fotos. Le di aceptar a esta ultima peticion, y la aplicacion se colgo. Ya no funciono mas. La reinicie. La volvi a ejecutar, y lo mismo. Cada vez que li di permiso para acceder a mis fotos, la aplicacion se colgo. Entonces claramente hay un problema de manejo de permisos, que ni con una aplicacion desarrollada por embarcadero funciona.

Alguna idea.

Saludos.
Jose Miguel.

Casimiro Notevi 12-03-2021 09:59:19

¿Has probado en otro dispositivo?

viverosjosem 13-03-2021 20:29:08

Si. Lo prove en un Samsung, y en un Huawei, ambos con android 10. En ambos casos el resultado fue el mismo. Al darle permisos para acceder a las fotos, la aplicacion se colgo. Tambien lo probe, en un dispositivo con Android 7. y, en este ultimo funciono todo bien. El problema esta claramente al intentar trabajar con Android 10. Y, al parecer, un problema que enbarcadero aun no soluciona.

Saludos.
Jose Miguel.

kurono 13-03-2021 21:09:58

El problema es con cualquier permiso que tu le asigne o solo con los permiso de cámara y fotografía

Otra pregunta cual archivo xml modificaste existen dos uno que se crea en la carpeta principal del proyecto y otra que se encuentra dentro de la carpeta de Android la que yo modificó es la principal al menos en Delphi xe 7 es asi desconozco en otras versiones

viverosjosem 13-03-2021 23:06:45

Hola Kurono.

Cita:

El problema es con cualquier permiso que tu le asigne o solo con los permiso de cámara y fotografía
Cuando estaba trabajando con mi propia aplicacion. el problema era de acceso a la tarjeta ssd. Luego de no poder hacerla funcionar para Android 10. Decidi buscar algun ejemplo desarrollado en delphi, que si funcionara. Entonces encontre este ejemplo de embarcadero, desarrollado en Delphi 10.3. El cual lo puedes encontrar en: C:\Users\Public\Documents\Embarcadero\Studio\20.0\Samples\Object Pascal\Mobile Snippets\AccessCameraApp".

En este caso particular, una aplicacion desarrollada por embarcadero, la cual se supone que deberia funcionar sin problemas. Sencillamente, no funciona. Eso, es lo extrano y decepcionante. No funciona en Android 10. Cuando la aplicacion solicita permisos para acceder a mis fotos, y le das "permitir", la aplicacion se cuelga.

Saludos.
Jose Miguel.

viverosjosem 16-03-2021 19:37:04

Hola a todos.
Buscando en internet soluciones al problema. encontre la pagina de Adriano

El es un programador brasilero que desarrollo un componente para habilitar los permiso en dispositivos Android 7, 8, 9 y 10. El componente muy facil de usar. Lo probe, y funciono perfectamente.

les dejo el enlace, por si a alguien le sirve.

En la misma pagina estan las instrucciones de compilacion y de uso.

Saludos.
Jose Miguel B.

kurono 17-03-2021 00:19:55

por el momento es una solucion viable pero creo que embarcadero deberia solucionar este problema lo ante posible y no tener que recurir a componente de tercero para hacer lo que se supone que el IDE de delphi deberia realizar

viverosjosem 17-03-2021 02:07:18

Hola Kumono.

Estoy totalmente de acuerdo contigo. Pero lo bueno es que este componente, se ofrece de manera libre y con codigo abierto. Todo el codigo fuente esta disoponible en la pagina. Un gran gesto de generosidad por parte de su programador (Adriano Santos).

Saludos.
Jose Miguel.


La franja horaria es GMT +2. Ahora son las 09:31:17.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi