Criando procedures ou functions
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
Curtidas 0
Respostas
Gustavo Bretas
17/10/2013
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?
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?
GOSTEI 0
Fabricio Luciano
17/10/2013
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???
GOSTEI 0
Gustavo Bretas
17/10/2013
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:
Para o ReadOnly é semelhante:
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:
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:
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:
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
Particularmente eu prefiro fazer assim:
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!
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!
GOSTEI 0