Fórum Sobre TList... #279231

28/04/2005

0

Pessoal existe uma lista mais específica para um tipo [b:3f22ddb3b8]Variant[/b:3f22ddb3b8], se negativo, como está esse código? existe algo alternativo?
function PreencheList(arrayVariant: array of Variant): TList;
var
  Cont: Smallint;
  Resultado: ^Variant;
  ResultadoFuncao: TList;
begin
  ResultadoFuncao := TList.Create;
  if arrayVariant <> nil then
    for Cont := 0 to Length(arrayVariant)-1 do
    begin
      Resultado^ := arrayVariant[Cont];
      ResultadoFuncao.Add(Resultado);
    end;
  Result := ResultadoFuncao;
end;


tentei também o seguinte mas não funcionou:
function PreencheList(arrayVariant: array of Variant): TList;
var
  Cont: Smallint;
  ResultadoFuncao: TList;
begin
  ResultadoFuncao := TList.Create;
  if arrayVariant <> nil then
    for Cont := 0 to Length(arrayVariant)-1 do
    begin
      ResultadoFuncao.Add(@arrayVariant[Cont]);
    end;
  Result := ResultadoFuncao;
end;



Bruno Belchior

Bruno Belchior

Responder

Posts

28/04/2005

Massuda

Existe uma diferença entre escrever...
function PreencheList(arrayVariant: array of Variant): TList;
...e escrever...
type
  TVariantArray = array of Variant;

function PreencheList(arrayVariant: TVariantArray): TList;
A primeira forma significa que PreencheList recebe como parâmetro um array qualquer enquanto a segunda forma indica que PreencheList recebe um array dinâmico.

No seu caso, acho que a sintaxe necessária seria a segunda forma.

Dê uma olhada no tópico [b:159267c4c2]open array parameters[/b:159267c4c2] na Ajuda do Delphi.


Responder

Gostei + 0

28/04/2005

Bruno Belchior

Massuda isso foi apenas um exemplo, na verdade eu utilizo realmente um tipo pré-definido, quero apenas descobrir como manipular um [b:3a5f7aa047]TList[/b:3a5f7aa047] com tipos que [b:3a5f7aa047]não[/b:3a5f7aa047] são Objetos, ou se existe um lista mais apropriada para meu caso...

normalmente uso:
type TVetorArray = array of Variant;
...
var
  VetorArray: TVetorArray;
...



Responder

Gostei + 0

28/04/2005

Beppe

Não dá pra usar typecast pq Pointers são 4 bytes e Variants são 16 bytes. O que você pode fazer é alocar(com New()!) uma PVariant(^Variant), atribuir sua Variant ao conteúdo dela e adicionar o ponteiro à lista. Lembre-se de dar Dispose nela depois.


Responder

Gostei + 0

28/04/2005

Massuda

Se você preencher sua lista usando...
type
  TArrayOfVariant = array of Variant;
 
function PreencheList(arrayVariant: TArrayOfVariant): TList; 
var 
  Cont: Smallint; 
  ResultadoFuncao: TList; 
begin 
  ResultadoFuncao := TList.Create; 
  if arrayVariant <> nil then 
    for Cont := 0 to Length(arrayVariant)-1 do begin 
      ResultadoFuncao.Add(@arrayVariant[Cont]); 
    end; 
  Result := ResultadoFuncao; 
end;
...você terá um TList preenchido com PVariant´s. Para recuperar dados dessa lista, você terá que fazer typecast para PVariant...
var
  P: PVariant;
  Lista: TList;
...
  Lista := PreencheList(...
  P := PVariant(Lista.First);
  // ou P := PVariant(Lista.Last);
  // ou P := PVariant(Lista[12]);
...



Responder

Gostei + 0

28/04/2005

Bruno Belchior

é exatamente o que estou fazendo, só que não existe uma lista pronta no delphi... tipo TVariantList?


Responder

Gostei + 0

28/04/2005

Massuda

é exatamente o que estou fazendo
Desculpe... não tinha entendido.

só que não existe uma lista pronta no delphi... tipo TVariantList?
Que eu me lembre não existe.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar