Problema array e parametro
Olá amigos,
Preciso retornar ou passar um array por referência e não consigo. Procurei no forum e não achei nada de interessante.
No meu sistema quero isolar a interface de qualquer acesso a dados, quero tudo via objetos mesmo. Desta forma, por exemplo, eu criei um Record chamado RegCliente.
Tenho um método na clase TCliente chamado RetornarClientesPeloNome e neste momento ou eu posso passar por referencia um array of RegCliente ou eu poderia retornar um. Para retornar um não consegui nem a pau. Para passar por referencia consegui assim (não dá erro na compilação, mas sim na execução).
No comando SetLength ele dá erro na primeria execução e depois na compilação também. Se eu criar um array dentro da procedure não dá erro algum.
Alguma sugestão?
Obrigadão!
Preciso retornar ou passar um array por referência e não consigo. Procurei no forum e não achei nada de interessante.
No meu sistema quero isolar a interface de qualquer acesso a dados, quero tudo via objetos mesmo. Desta forma, por exemplo, eu criei um Record chamado RegCliente.
type RegCliente = Record Codigo: Integer; Nome: String; end;
Tenho um método na clase TCliente chamado RetornarClientesPeloNome e neste momento ou eu posso passar por referencia um array of RegCliente ou eu poderia retornar um. Para retornar um não consegui nem a pau. Para passar por referencia consegui assim (não dá erro na compilação, mas sim na execução).
procedure RetornarClientes(pNome: String; var pAR: array of RegCliente); begin SetLength(pAR, 20); end;
No comando SetLength ele dá erro na primeria execução e depois na compilação também. Se eu criar um array dentro da procedure não dá erro algum.
Alguma sugestão?
Obrigadão!
Romulocpd
Curtidas 0
Respostas
Massuda
03/09/2007
Experimente assim......Delphi tem umas regras estranhas com relação a usar ´array of´ como parametro de procedures/functions.
type RegCliente = Record Codigo: Integer; Nome: String; end; TArrayOfRegClient = array of RegClient; procedure RetornarClientes(pNome: String; var pAR: TArrayOfRegClient); ....
GOSTEI 0
Romulocpd
03/09/2007
Massuda,
Tentei de tudo e não adianta. Como parâmetro ou retorno esquece. Mas sua dica foi bem sucedida!
Eu na classe criei um objeto TARClientes por exemplo e minhas classes utilizarão ele externamente, até uma solução melhor.
Se tiver sugestões!!!
Valeu!
Tentei de tudo e não adianta. Como parâmetro ou retorno esquece. Mas sua dica foi bem sucedida!
Eu na classe criei um objeto TARClientes por exemplo e minhas classes utilizarão ele externamente, até uma solução melhor.
Se tiver sugestões!!!
Valeu!
GOSTEI 0
Massuda
03/09/2007
...minhas classes utilizarão ele externamente, até uma solução melhor.
Não existe solução melhor :shock:, a solução é essa mesma. As regras do Delphi fazem com que ´array of´ seja interpretado de modo diferente do usual quando usado como parametro de função/procedure.Normalmente ´array of´ significa um ´array dinamico de algum tipo de dado´, mas quando usado como parametro de função/procedure, significa ´array de algum tipo de dado´ (note que não tem o dinamico). Isso permite que você escreva funções/procedures que operam sobre um array qualquer (desde que o primeiro elemento do array tenha índice zero). Um exemplo seria...
function Somar(const ALista: array of Real): Real; var I: Integer; begin Result := 0; for I := Low(ALista) to High(ALista) do Result := Result + ALista[I]; end;
var ListaDinamica: array of Real; ListaFixa: array[0..99] of Real; ... SetLength(ListaDinamica, ...); ListaDinamica[0] := ... ListaDinamica[1] := ... ... Soma := Somar(ListaDinamica); ListaFixa[0] := ... ListaFixa[1] := ... ... Soma := Somar(ListaFixa); Soma := Somar([1, 2, 3, 4]);
GOSTEI 0
Romulocpd
03/09/2007
Obrigado Massuda pela ajuda.
Realmente vou ver o que faço. Em .Net tem aqueles objetos ArrayList tal, vou ver o que consigo com Delphi, senão vou utilizar assim mesmo.
Obrigado!
Realmente vou ver o que faço. Em .Net tem aqueles objetos ArrayList tal, vou ver o que consigo com Delphi, senão vou utilizar assim mesmo.
Obrigado!
GOSTEI 0