Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Función que retorne Tarray<T> (https://www.clubdelphi.com/foros/showthread.php?t=95405)

movorack 22-09-2021 00:37:24

Función que retorne Tarray<T>
 
Hola compañeros,

Antes que nada, les agradezco su atención y las respuestas que me puedan dar tanto como para solucionar o poder plantearme otra solución.

Estoy consumiendo unos objetos DCOM que devuelven unos OleVariant alimentados como arrays. Los cuales se les puede hacer un manejo como muestro a continuación

Código Delphi [-]
procedure MiFuncionDCOM;
  var
    Response: OleVariant;
begin
  Response := DCOMConnection.AppServer.MiFuncion;
  
  Label1.Caption := Response[0];
  Label2.Caption := Response[1];
end;

Y quisiera llevar esa respuesta a un array generico. Algo como TArray < T >

El inconveniente que tengo es que al tratar de devolver, un array de enteros me genera el error "E2010 Incompatible types: 'T' and 'Integer'". Igual sucede para otros tipos como double, string, etc.

Código Delphi [-]
class function TForm1.VariantToArray < T > (V: OleVariant): Tarray < T >;
begin
  Result := [1, 2, 3];
end;

la función, sin completar ya que el error no me deja avanzar, Es esta:

Código Delphi [-]
class function TForm1.VariantToArray < T > (V: OleVariant): Tarray < T > ;
  var
    i: Integer;
begin
  Result := [];

  if VarIsEmpty(V) or VarIsNull(V) then
    Exit;

  case GetTypeKind(T) of
    tkString: begin
      if not VarIsArray(V) then
        Result := [string(VarAsType(V, varString))] // <-- E2010 Incompatible types: 'T' and 'string'
      else
      begin
        for i := VarArrayLowBound(V, 1) to VarArrayHighBound(V, 1) do
          Result := Result + [string(VarAsType(V, varString))] // <-- E2010 Incompatible types: 'T' and 'string'
      end;
    end;
   tkInteger : ;
   tkFloat: ;
  end;
end;

Entiendo que el error de genera porque espera elementos de tipo T, aunque también pensaba que al hacer uso de la función era donde se definiría el tipo de elemento.

Código Delphi [-]
procedure MiFuncionDCOM;
  var
    Response: OleVariant;
    RespArray: TArray < string > ;
begin
  Response := DCOMConnection.AppServer.MiFuncion;
  RespArray := VariantToArray<string>(Response); //Devuelve TArray < string >
  
  Label1.Caption := RespArray [0];
  Label2.Caption := RespArray [1];
end;

PepCat 22-09-2021 10:55:22

No es una solucion elegante pero quizas te sirva:

Código:

class function TForm1.VariantToArray < T > (V: OleVariant): Tarray < variant > ;

movorack 23-09-2021 15:30:39

Muchas gracias! Sí, así funciona.

Y en realidad ya tengo el mismo array de variants dentro de la respuesta en el variant.

Quería saber si podía pasarlo a un array con un tipo de dato definido con una función generica.

La finalidad es por ej, cargarlos directamente a un TStringList si todo es un TArray < string > o pasarlo por parámetro en una función que me pida un TArray < integer >


La franja horaria es GMT +2. Ahora son las 20:22:46.

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