Jump to content
Fórum Script Brasil
  • 0

Trabalhando com Funções 2


Paulo Henrique de Assis

Question

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 variavell szDadosImpressora retorna o status do caso, caso tenha.

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

inté!

Link to comment
Share on other sites

14 answers to this question

Recommended Posts

  • 0

Help do delphi

Length function

Retorna um inteiro contendo o número de caracteres em uma string ou o número de elementos em uma matriz.

declaração

function Length(const S: string): integer

function Length(const S: array): integer

descrição

Retorna um inteiro contendo o número de caracteres em uma string ou o número de elementos em uma matriz.

Para uma matriz, Length (S) sempre retorna Ord (High (S)), Ord (Low (S)) +1

exemplo:

var s : string;
    i : integer;

s:='DELPHI';
i := Length(s);
//i=6;
//.................................................................. SetLenght procedure Altera o tamanho de uma matriz dinâmica ou uma string. declaração
procedure SetLength(var S; Length1: Integer [; Lenght2: Integer]);
descrição Altera o tamanho de uma matriz dinâmica ou uma string. S é uma variável string ou array dinâmico. Se S é uma matriz multidimensional dinâmica, podemos passar um ou mais comprimentos ao procedimento. Para uma variável de string curta, SetLength simplesmente define o indicador de caracteres de comprimento (o caractere em S [0]) para o valor dado. Neste caso, newlength deve ser um valor entre 0 e 255. exemplo:
//create an integer vector of N elements
type
  TVector = array of integer;

procedure SetVector(var V: TVector; N: integer);
var i: integer;
begin
  SetLength(V,N);
  for i:= 0 to N-1 do
    N[i]:= N-1-i; 
end;
//if N=6 then v={5,4,3,2,1,0};

abraço

Link to comment
Share on other sites

  • 0
Help do delphi

Length function

Retorna um inteiro contendo o número de caracteres em uma string ou o número de elementos em uma matriz.

declaração

function Length(const S: string): integer

function Length(const S: array): integer

descrição

Retorna um inteiro contendo o número de caracteres em uma string ou o número de elementos em uma matriz.

Para uma matriz, Length (S) sempre retorna Ord (High (S)), Ord (Low (S)) +1

exemplo:

var s : string;
    i : integer;

s:='DELPHI';
i := Length(s);
//i=6;
//.................................................................. SetLenght procedure Altera o tamanho de uma matriz dinâmica ou uma string. declaração
procedure SetLength(var S; Length1: Integer [; Lenght2: Integer]);
descrição Altera o tamanho de uma matriz dinâmica ou uma string. S é uma variável string ou array dinâmico. Se S é uma matriz multidimensional dinâmica, podemos passar um ou mais comprimentos ao procedimento. Para uma variável de string curta, SetLength simplesmente define o indicador de caracteres de comprimento (o caractere em S [0]) para o valor dado. Neste caso, newlength deve ser um valor entre 0 e 255. exemplo:
//create an integer vector of N elements
type
  TVector = array of integer;

procedure SetVector(var V: TVector; N: integer);
var i: integer;
begin
  SetLength(V,N);
  for i:= 0 to N-1 do
    N[i]:= N-1-i; 
end;
//if N=6 then v={5,4,3,2,1,0};

abraço

Consegui resolver com a sua dica!

Muito obrigado.

Link to comment
Share on other sites

  • 0

Boa tarde!

Gostaria de continuar esse tópico pelo fato de ter ficado com mais uma dúvida nos valores de retorno do parametro! Da forma que você mencionou bastaria colocar o "var" na declarção do parametro da procedure, e deu certo, porem gostaria em saber se tem como adquirir o mesmo resultado sem colocar o "var"? Pois tem uma função da bematech que faz isso e tem o retorno da função sem informar o "var" como 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;

Retorno := Bematech_FI_DataHoraImpressora( Data, Hora );

end;

Sendo que a variavel Data e hora retorna com valores após executar a função.

Como é feito esse processo?

Att

Link to comment
Share on other sites

  • 0

um exemplo:

//  esta é uma função do delphi que está no System.pas

function Now: TDateTime;
var
  SystemTime: TSystemTime;
begin
  GetLocalTime(SystemTime);
  with SystemTime do
    Result := EncodeDate(wYear, wMonth, wDay) +
      EncodeTime(wHour, wMinute, wSecond, wMilliseconds);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('Data = '+DateToStr(now));
  ShowMessage('Hora = '+TimeToStr(now));
end;
outra maneira
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('Data / Hora = '+ DateTimetostr(now));
end;

a function now, é uma função do delphi que pega a data e a hora atual do micro

abraço

Link to comment
Share on other sites

  • 0
um exemplo:

//  esta é uma função do delphi que está no System.pas

function Now: TDateTime;
var
  SystemTime: TSystemTime;
begin
  GetLocalTime(SystemTime);
  with SystemTime do
    Result := EncodeDate(wYear, wMonth, wDay) +
      EncodeTime(wHour, wMinute, wSecond, wMilliseconds);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('Data = '+DateToStr(now));
  ShowMessage('Hora = '+TimeToStr(now));
end;
outra maneira
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('Data / Hora = '+ DateTimetostr(now));
end;

a function now, é uma função do delphi que pega a data e a hora atual do micro

abraço

Boa noite!

Obrigado pela resposta, porem não é bem isso que eu procuro, abaixo está mais um exemplo da forma que eu preciso fazer:

function TForm1.fTesteDataHora(Data: String; Hora: String): Integer;

begin

Data:= FormatDateTime('ddmmyyyy',date);

Hora:= FormatDateTime('hhmmss',now);

end;

O retorno da função tem que ser do tipo inteiro e os parametros não podem conter o "var" nos parametros.

quando eu chamar a função eu informo:

var valor1, valor2:string;

begin

fTesteDataHora(valor1,valor2);

end;

OBS: Após passar pela função fTesteDataHora o valor1 receberá a data e o valor2 a hora! Lembrando que a data e hora é apenas um exemplo, pois pode ser qualquer tipo de variável! Eu gostaria em saber se tem como fazer esse mesmo procedimento sem usar o "var" no parametro? mas a idéia é esse mesmo.

Não sei se tem que fazer uso de ponteiro, caso tenha gostaria de um exemplo se possível!

Atenciosamente,

Paulo

Link to comment
Share on other sites

  • 0

veja se é isso

function DataHora(Data: string; Hora: string): Integer;
begin
   Data:= FormatDateTime('ddmmyyyy',now);
   Hora:= FormatDateTime('hhmmss',now);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
   showmessage(INTTOSTR(DataHora('21/12/2011','20:00:00')));

   //  Resultado = 9254536
end;

se não for isso.... veja:

http://www.delphibasics.co.uk/RTL.asp?Name=FormatDateTime

abraço

Link to comment
Share on other sites

  • 0

veja se é isso

function DataHora(Data: string; Hora: string): Integer;
begin
   Data:= FormatDateTime('ddmmyyyy',now);
   Hora:= FormatDateTime('hhmmss',now);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
   showmessage(INTTOSTR(DataHora('21/12/2011','20:00:00')));

   //  Resultado = 9254536
end;

Jhonas, muito obrigado por estar tentando me ajudar, mas ainda não é o que eu estou querendo fazer, tipo na procedure do clique do botão você passou o valor direto para o parametro e não é isso, pois o valor será capturado da função, que seria da variavel Data e Hora! Mas como eu disse anteriormente a data e hora é apenas exemplo, pois pode ser qualquer valor a ser usado, mas o que eu queria mesmo é saber como funciona a transição em si, vou tentar melhorar o exemplo:

Vou usar como exemplo uma função da bematech, que é a

function Bematech_FI_NumeroCupom(NumeroCupom: String): Integer; StdCall; External 'BEMAFI32.DLL';

Ela simplesmente pega somente o COO do cupom fiscal, repare que na assinatura não tem o "var" antes do NumeroCupom e o comando usado na execução da função é

var xCOO : String;

begin

for iConta := 1 to 6 do

xCOO := xCOO + ' ';

Retorno := Bematech_FI_NumeroCupom(xCOO);

end;

Veja que ele passa uma variavel xCOO para a função, e após executar a função Bematech_FI_NumeroCupom, de alguma forma é enviado o valor do COO do cupom fiscal para a variavel xCOO, como não temos acesso ao fonte da função da dll da Bematech, não sei como foi feita a programação para esse resultado! Pois é isso que eu queria saber, como ele passa o valor que está dentro da função para outra variavel que está fora?

Por isso que postei o meu exemplo, para tentar explicar melhor o que estou querendo fazer, tipo queria saber como aplicar essa lógica na minha função, conforme já informado anteriormente:

Vamos supor que ela seja uma função de uma Dll.

function fTesteDataHora(Data: String; Hora: String): Integer; StdCall; External 'Paulo.DLL';

begin

Data:= FormatDateTime('ddmmyyyy',date); ----->exemplo = 03122011

Hora:= FormatDateTime('hhmmss',now); ----->exemplo = 011235

result:= 1;

end;

O retorno da função tem que ser do tipo inteiro e os parametros não podem conter o "var" nos parametros.

quando eu chamar a função eu informo:

var valor1, valor2:string;

begin

fTesteDataHora(valor1,valor2);

end;

^

|

Após passar pela função acima, a variavel valor1 será igual a 03122011 e a variavel valor2 será igual a 011235, resultado dentro da função fTesteDataHora, que alimentou a variavel de fora!

Espero que eu tenha sido mais claro agora, rssss

Abraços...

Link to comment
Share on other sites

  • 0

O retorno da função tem que ser do tipo inteiro e os parametros não podem conter o "var" nos parametros.

isso depende de como a função foi construida... para maiores detalhes veja a unit Sysutil.pas do delphi

function Data: Integer;
begin
   Result:= strtoint(FormatDateTime('ddmmyyyy',now));
end;

function Hora: Integer;
begin
   Result:= strtoint(FormatDateTime('hhmmss',now));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   showmessage(INTTOSTR(Data));
   showmessage(INTTOSTR(Hora));
end;

abraço

Link to comment
Share on other sites

  • 0
O retorno da função tem que ser do tipo inteiro e os parametros não podem conter o "var" nos parametros.

isso depende de como a função foi construida... para maiores detalhes veja a unit Sysutil.pas do delphi

function Data: Integer;
begin
   Result:= strtoint(FormatDateTime('ddmmyyyy',now));
end;

function Hora: Integer;
begin
   Result:= strtoint(FormatDateTime('hhmmss',now));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   showmessage(INTTOSTR(Data));
   showmessage(INTTOSTR(Hora));
end;

abraço

Pior que não é isso ainda!

att

Link to comment
Share on other sites

  • 0
O retorno da função tem que ser do tipo inteiro e os parametros não podem conter o "var" nos parametros.

isso depende de como a função foi construida... para maiores detalhes veja a unit Sysutil.pas do delphi

function Data: Integer;
begin
   Result:= strtoint(FormatDateTime('ddmmyyyy',now));
end;

function Hora: Integer;
begin
   Result:= strtoint(FormatDateTime('hhmmss',now));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   showmessage(INTTOSTR(Data));
   showmessage(INTTOSTR(Hora));
end;

abraço

Pior que não é isso ainda!

att

Boa tarde.

Abaixo está o meu exemplo,que funciona do jeito que estou querendo, porem a assinatura da função contém o "var".

type

TForm1 = class(TForm)

Button1: TButton;

function testeDataHora(var Data: String; var Hora: String): Integer; ------->>>> repare que tem o "var" antes do nome da variavel

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

testeDataHora(teste1,teste2); -----> após passar pela função a variavel teste1 receberá a date e a teste2 a hora, retornada pela função.

end;

function TForm1.testeDataHora(var Data: String; var Hora: String): Integer;

begin

Data:= FormatDateTime('ddmmyyyy',date);

Hora:= FormatDateTime('hhmmss',now);

Result:=1;

end;

Repara se eu tirar o "var" a função não retorna a data e a hora para a variavel teste1, teste2 da procedure TForm1.Button1Click(Sender: TObject).

O que eu realmente queria fazer é que retorne o valor da função na variavel teste1, teste2 sem usar o "var" na declaração da função, o exemplo abaixo mostra como poderia ser:

type

TForm1 = class(TForm)

Button1: TButton;

function testeDataHora(Data: String; Hora: String): Integer; ------->>>> repare que não tem mais o "var" antes do nome da variavel

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

testeDataHora(teste1,teste2); -----Dessa forma o valor data e hora da função não retorna para a variavel teste1 e teste2 que seria data e hora.

end;

function TForm1.testeDataHora(Data: String; Hora: String): Integer;

begin

Data:= FormatDateTime('ddmmyyyy',date);

Hora:= FormatDateTime('hhmmss',now);

Result:=1;

end;

O que eu queria é arruma uma forma de retornar esse valor da funçao para as variaveis teste1 e teste2 sem a necessidade de incluir o "var" na assinatura ??

Att

Link to comment
Share on other sites

  • 0
O que eu queria é arruma uma forma de retornar esse valor da funçao para as variaveis teste1 e teste2 sem a necessidade de incluir o "var" na assinatura ??

amigo, voce está querendo colocar chifre em cabeça de cavalo ... rs

isso não tem logica nenhuma

function TForm1.testeDataHora(Data: String; Hora: String): Integer;
begin
   Data:= FormatDateTime('ddmmyyyy',date);
   Hora:= FormatDateTime('hhmmss',now);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   showmessage(inttostr(testeDataHora('','')));
end;
o certo seria:
function DataHora: TDateTime;
var
  SystemTime: TSystemTime;
begin
  GetLocalTime(SystemTime);
  with SystemTime do
    Result := EncodeDate(wYear, wMonth, wDay) +
      EncodeTime(wHour, wMinute, wSecond, wMilliseconds);
end;


procedure TForm1.Button1Click(Sender: TObject);
var teste1, teste2 : string;
begin
   Teste1 := FormatDateTime('ddmmyyyy',DataHora);
   Teste2 := FormatDateTime('hhmmss',DataHora);

   showmessage(Teste1);
   showmessage(Teste2);

   Teste1 := datetostr(DataHora);
   Teste2 := timetostr(DataHora);

   showmessage(Teste1);
   showmessage(Teste2);
end;

se voce ainda tem dúvidas quanto a definição de functions no delphi, sugiro voce ver a unit SysUtils.pas ( ponha o cursor em FormatDateTime e tecle F1 )

ela mostra como são montadas as functions que o delphi usa

abraço

Link to comment
Share on other sites

  • 0
O que eu queria é arruma uma forma de retornar esse valor da funçao para as variaveis teste1 e teste2 sem a necessidade de incluir o "var" na assinatura ??

amigo, voce está querendo colocar chifre em cabeça de cavalo ... rs

isso não tem logica nenhuma

function TForm1.testeDataHora(Data: String; Hora: String): Integer;
begin
   Data:= FormatDateTime('ddmmyyyy',date);
   Hora:= FormatDateTime('hhmmss',now);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   showmessage(inttostr(testeDataHora('','')));
end;
o certo seria:
function DataHora: TDateTime;
var
  SystemTime: TSystemTime;
begin
  GetLocalTime(SystemTime);
  with SystemTime do
    Result := EncodeDate(wYear, wMonth, wDay) +
      EncodeTime(wHour, wMinute, wSecond, wMilliseconds);
end;


procedure TForm1.Button1Click(Sender: TObject);
var teste1, teste2 : string;
begin
   Teste1 := FormatDateTime('ddmmyyyy',DataHora);
   Teste2 := FormatDateTime('hhmmss',DataHora);

   showmessage(Teste1);
   showmessage(Teste2);

   Teste1 := datetostr(DataHora);
   Teste2 := timetostr(DataHora);

   showmessage(Teste1);
   showmessage(Teste2);
end;

se voce ainda tem dúvidas quanto a definição de functions no delphi, sugiro voce ver a unit SysUtils.pas ( ponha o cursor em FormatDateTime e tecle F1 )

ela mostra como são montadas as functions que o delphi usa

abraço

Tem lógica sim amigo, pois as funções que eu informei das dll da impressora fiscal, como exemplo, fazem esse processo! Eu dei exemplo de data hora para tentar explicar melhor, mas pelo jeito não consegui passar o que eu realmente quero! Mas muito obrigado pela ajuda...

Você trabalha com impressora fiscal? caso sim, basta reparar na função da bematech que é a Bematech_FI_NumeroCupom(xCOO), pois essa variavel xCOO antes de passar pela função está vazia, mas depois que passar pela função, a própria função retornará o numero do COO do cupom para a variavel, como exemplo:

xCOO:= '';

Bematech_FI_NumeroCupom(xCOO);

O valor do número do cupom retornará da função e ai a minha variavel XCOO receberá esse valor.

xCOO = '000001'.

Entendeu, amigo? rs

abraço

Link to comment
Share on other sites

  • 0

as funções que eu informei das dll da impressora fiscal, como exemplo, fazem esse processo!

eu não tenho impressora fiscal, mas voce não entendeu o que quis dizer ...

a questão não é se pode ou não pode usar o var dentro da função, voce não cria functions somente usando o delphi ... voce pode usar outras linguagem de programação, como C++, VB, etc ... (dlls do windows)

o delphi pode chamar e usar funções externas, feitas em outras linguagens ... o que eu quis dizer é que voce pode usar essas dlls pelo delphi, desde que voce saiba o nome e os seus parametros.

entretanto se voce quer construir a dll usando o delphi, deve seguir o padrão estabelecido pela Borland para isso

( Ver exemplos na Unit SysUtils.pas e System.pas .... já dá pra ter uma boa noção )

O valor do número do cupom retornará da função e ai a minha variavel XCOO receberá esse valor.

voce deve levar em conta que a impressora fiscal trabalha com microprocessadores e tem valores armazenados em posições de memoria que são retornados quando voce faz o acesso.

meu conhecimento é limitado ... gostaria de poder ajudá-lo mais

abraço

Link to comment
Share on other sites

  • 0
as funções que eu informei das dll da impressora fiscal, como exemplo, fazem esse processo!

eu não tenho impressora fiscal, mas voce não entendeu o que quis dizer ...

a questão não é se pode ou não pode usar o var dentro da função, voce não cria functions somente usando o delphi ... voce pode usar outras linguagem de programação, como C++, VB, etc ... (dlls do windows)

o delphi pode chamar e usar funções externas, feitas em outras linguagens ... o que eu quis dizer é que voce pode usar essas dlls pelo delphi, desde que voce saiba o nome e os seus parametros.

entretanto se voce quer construir a dll usando o delphi, deve seguir o padrão estabelecido pela Borland para isso

( Ver exemplos na Unit SysUtils.pas e System.pas .... já dá pra ter uma boa noção )

O valor do número do cupom retornará da função e ai a minha variavel XCOO receberá esse valor.

voce deve levar em conta que a impressora fiscal trabalha com microprocessadores e tem valores armazenados em posições de memoria que são retornados quando voce faz o acesso.

meu conhecimento é limitado ... gostaria de poder ajudá-lo mais

abraço

Boa tarde!

Era isso mesmo que eu queria saber... rss, mas agradeço muito pela atenção..

Abraço..

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...