GARANTIR DESCONTO

Fórum Criando procedures ou functions #458673

17/10/2013

0

Olá amigos, gostaria de saber como criar uma procedure ou uma function. eu utilizava o visual basic e criar funções era muito simples. eu usava um formulário de módulo pra conter as funções e o formulário principal não ficar tão carregado de código. Situações do tipo: quando o formulário fosse aberto as textbox estariam travadas....quando fosse alterar o registro aí sim habilitariam as caixas. quando fosse chamar a função usava apenas um call e o nome da função. do delphi eu não seu como fazer essa referência e tb onde devo criar a função ou procedure.
Fabricio Luciano

Fabricio Luciano

Responder

Posts

17/10/2013

Gustavo Bretas

Fabricio, eu entendi seu problema, mas não entendi a dificuldade!

Assim como no VB vc vai precisar manter uma biblioteca, tem algumas maneiras de fazer isso!

Funções de formulário, como no exemplo que vc deu dos campos "bloqueado" eu tenho formulário padrão onde tenho eventos que se repetiriam se criados em vários formulários, e crio os outros formulários a partir deste, em paralelo eu mantenho bibliotecas com Classes de funções gerais, desde funções de pegar o nome do computador ou o caminho da pasta temp, até verificação de CPF/CNPJ, assinatura digital de documentos!

É +/- isso que vc queria saber?
Responder

Gostei + 0

17/10/2013

Fabricio Luciano

Sim amigo mas a minha dúvida é: como eu crio a função, onde criá-la e como chamá-la. poderia me passar um exemplo simples pra bloquear e desbloquear uma caixa de texto???
Responder

Gostei + 0

18/10/2013

Gustavo Bretas

Seu problema é sintaxe então, certo? Vou tentar explicar bem superficialmente.

A maioria dos componentes visuais tem 2 propriedade que podem ser usadas pra bloquear a edição, uma dela é o Enable, e a outra ReadOnly

Enable igual a False, vc bloqueia o componente de uma forma que ele não recebe foco, então não é possível copiar ou editar o conteúdo.
ReadOnly igual a True, e Enable igual a True, o componente aparenta estar desbloqueado, o foco passa por ele, é possível copiar o conteúdo usado CTRL+C e tudo, mas não pode ser editado.

Quando que não é possível editar, é no sentido do usuário, pois em qualquer um dos casos, vc pode "injetar" um conteúdo via código, quando estão "bloqueados", entende?

A Sintaxe então é muito simples! Um TEdit por exemplo, coloque-o no formulário, junto com um botão, no evento do botão coloque:

Edit1.Enable := not Edit1.Enable;
// Que corresponde a:
if Edit1.Enable then
	Edit1.Enable := False
else
	Edit1.Enable := True;


Para o ReadOnly é semelhante:

Edit1.ReadOnly := not Edit1.ReadOnly;
// Que corresponde a
if Edit1.ReadOnly then
	Edit1.ReadOnly := False
else
	Edit1.ReadOnly := True;


No caso de functions e procedures, vc pode declará-las em Classes, não sei como é no VB, mas deve ter algo no sentido de Publico e Privado, onde métodos privados só podem ser chamados por métodos da própria classe, e métodos públicos podem ser chamados por agentes de fora da classe.

Por exemplo, para implementar a Classe TExemplo, eu a escrevi em uma Unit:

unit untExemplo;

interface

uses SysUtils, DateUtils;

type
  TExemplo = class
  private
    FData: TDateTime;
    function GetDateMaisTrinta: TDateTime;
  public
    constructor Create; Overload;
    function GetDate(AMaisTrinta: Boolean): TDateTime;
  end;

implementation

{ TExemplo }

constructor TExemplo.Create;
begin
  inherited Create;
  FData := Now;
end;

function TExemplo.GetDate(AMaisTrinta: Boolean): TDateTime;
begin
  if AMaisTrinta then
    Result := GetDateMaisTrinta
  else
    Result := FData;
end;

function TExemplo.GetDateMaisTrinta: TDateTime;
begin
  Result := IncDay(FData, 30);
end;

end.


Para usar os métodos da Classe, crie um formulários, e Adicione dois Botões. Cada componente tem seus Eventos, no caso do Botão vamos implementar o OnClick:

procedure TForm1.Button1Click(Sender: TObject);
var
  vlExemplo: TExemplo;
begin
  try
    vlExemplo := TExemplo.Create;
    ShowMessage(DateToStr(vlExemplo.GetDate(True)));
  finally
    FreeAndNil(vlExemplo);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  vlExemplo: TExemplo;
begin
  try
    vlExemplo := TExemplo.Create;
    ShowMessage(DateToStr(vlExemplo.GetDate(False)));
  finally
    FreeAndNil(vlExemplo);
  end;
end;


Observe que em ambos eventos, a variável tem o mesmo nome, isso por que elas estão em contextos diferentes, um evento não interfere no outro, se vc declará-la na classe do formulário, não será necessário declarar no evento.

Nesse mesmo caso, você ainda pode compartilhar o evento, ou seja, os dois botões executarem apenas um evento, mas para isso vc terá que "tratar" o parâmetro passado para o método.
Cada evento passa alguma coisa como parâmetro, o OnClick, passa o próprio botão, então podemos fazer da seguinte forma:

procedure TForm1.Button1Click(Sender: TObject);
var
  vlExemplo: TExemplo;
begin
  try
    vlExemplo := TExemplo.Create;
    if TButton(Sender).Name = Button1.Name then
      ShowMessage(DateToStr(vlExemplo.GetDate(True)))
    else if TButton(Sender).Name = Button2.Name then
      ShowMessage(DateToStr(vlExemplo.GetDate(False)));
  finally
    FreeAndNil(vlExemplo);
  end;
end;


Pô Bretas, mas eu tenho uma função que não depende de nada além dos parâmetros que eu passo pra ela, e não quero criar uma classe só para ela...

Ok, sem problema, vc pode declarar funções e procedures diretamente no bloco interface da unit, e implementar no bloco implementation, que sua função ou método será visto onde vc declarar a Unit.

Exemplo

unit Unit3;

interface

uses SysUtils;

function GetHoje: TDateTime;

implementation

function GetHoje: TDateTime;
begin
  Result := Now;
end;

end.


Particularmente eu prefiro fazer assim:

unit Unit3;

interface

uses SysUtils;

type
  TDateUtils = class
  public
    class function GetHoje: TDateTime;
  end;

implementation

{ TDateUtils }

class function TDateUtils.GetHoje: TDateTime;
begin
  Result := Now;
end;

end.


Assim eu consigo me organizar melhor em relação a usabilidade dos métodos.
para saber mais sobre Métodos classe, leia: http://delphi.about.com/od/objectpascalide/a/classmethods.htm

Clareou? rsrs Espero não ter complicado! rsrs

Abraço!
Responder

Gostei + 0

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

Aceitar