Fórum Trabalhando com retorno da função #410155

03/12/2011

0

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

Responder

Posts

05/12/2011

Cauê Nishijima

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.
Responder

Gostei + 0

05/12/2011

Emerson Nascimento

é 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;
Responder

Gostei + 0

06/12/2011

Paulo Assis

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
Responder

Gostei + 0

15/12/2011

Wilson Junior

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.
Responder

Gostei + 0

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

Aceitar