Trabalhando com retorno da função

Delphi

03/12/2011

Boa noite pessoal.

Por gentileza, gostaria em saber qual é a lógica de uma função do tipo integer, que tenha você setar em seu parametro um SetLength, que o retorno da função seja em seu próprio parametro? Como é feito em algumas funções de impressora fiscal, como exemplo:

SetLength(szDadosImpressora,4);
Seto 4 posições em branco para ser alimentada pela função.

Retorno := Daruma_FI_RetornaErroExtendido ( szDadosImpressora );
Após executar, a variavel szDadosImpressora retorna o status do erro, caso tenha.


Neste caso o retorno da função da daruma é inteiro e a variavel do parametro szDadosImpressora retorna uma string.

Pois consegui fazer isso usando a seguinte situação:

type
TForm1 = class(TForm)
Button1: TButton;
function Função_testeDataHora(var Data: String; var Hora: String): Integer; ---- Repare que usei o var antes no nome
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

procedure TForm1.Button1Click(Sender: TObject);
var teste1, teste2 : String;
begin
Função_testeDataHora(teste1,teste2); ----quando passa pela função a variavel teste1 recebe a data e o teste2 a hora.
end;

function TForm1.Função_testeDataHora(var Data: String; var Hora: String): Integer;
begin
Data:= FormatDateTime(ddmmyyyy,date);
Hora:= FormatDateTime(hhmmss,now);
Result:=1;

end;

Mas que eu quero mesmo saber qual a programação na qual eu consiga obter o mesmo resultado sem ter que informar o var na assinatura?


Tenho mais um exemplo da função da bematech que faz isso, mas como não temos acesso a dll deles não tem como saber qual procedimento eles usaram:


***********exemplo
declaração
function Bematech_FI_DataHoraImpressora(Data: String; Hora: String): Integer; StdCall; External BEMAFI32.DLL;


uso da função

minha procedure;
var Data, Hora : String;
begin
for iConta :=1 to 6 do
begin
Data := Data + ;
Hora := Hora + ;
end;

Obs: antes de passar pela função as variaveis estão somente com espaços em branco

Retorno := Bematech_FI_DataHoraImpressora( Data, Hora );

Obs: após passar pela função a variavel Data e hora já estarão com os valores retornados pela função.
end;

É isso que estou querendo desvendar, se alguém puder me enviar um exemplo, ficarei muito grato!

Ate mais....



Paulo Assis

Paulo Assis

Curtidas 0

Respostas

Cauê Nishijima

Cauê Nishijima

03/12/2011

Cara seu post esta meio confuso mas acho que entendi sua dúvida.
Acredito que não teria problema nenhum em trocar function por procedure nesses casos.
Os casos de retorno é quanto é preciso ter uma confirmação positiva ou negativa da alteração dos parametros.

ou seja

procedure X(var Y:Integer);

é igual a:

function X:Integer;

Acho que seja isso, corrija-me se estiver errado.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

03/12/2011

é isso mesmo. você precisa colocar o var antes dos parâmetros.
function TForm1.teste(var data, hora: string): boolean;
begin
  try
    data := formatdatetime(yyyymmdd, sysutils.Now);
    hora := formatdatetime(HH:mm:ss, sysutils.Now);
    result := true;
  except
    result := false;
  end;
end;


assim a alteração feita no parâmetro será refletida na variável origem.

e para usar, assim como no exemplo que você passou:
procedure TForm1.Button1Click(Sender: TObject);
var
  data, hora: string;
  retorno: boolean;
begin
  retorno := teste(data, hora);

  if retorno then
    ShowMessage(data:+data+ hora:+hora);
end;
GOSTEI 0
Paulo Assis

Paulo Assis

03/12/2011

Boa noite!

Só que nesse caso eu queria fazer sem usar o var! Porem fiquei sabendo que eu terei que fazer uso de ponteiro! você saberia fazer um exemplo com uso de ponteiro para chegar nesse mesmo resultado?

att
GOSTEI 0
Wilson Junior

Wilson Junior

03/12/2011

Teste isto:
procedure TForm1.Button1Click(Sender: TObject);
var
  teste1, teste2: string;
begin
  teste1 := RetData;
  teste2 := RetHora;
end;

function TForm1.RetData: string;
begin
  Result := FormatDateTime( ddmmyyyy, Now );
end;

function TForm1.RetData: string;
begin
  Result := FormatDateTime( hhmmss, Now );
end;


Espero ter colaborado.
GOSTEI 0
POSTAR