Trabalhando com retorno da função
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....
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
Curtidas 0
Respostas
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.
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
03/12/2011
é isso mesmo. você precisa colocar o var antes dos parâmetros.
assim a alteração feita no parâmetro será refletida na variável origem.
e para usar, assim como no exemplo que você passou:
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
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
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
03/12/2011
Teste isto:
Espero ter colaborado.
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