Fórum Criando procedures ou functions #458673
17/10/2013
0
Fabricio Luciano
Curtir tópico
+ 0Posts
17/10/2013
Gustavo Bretas
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
17/10/2013
Fabricio Luciano
Gostei + 0
18/10/2013
Gustavo Bretas
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
Clique aqui para fazer login e interagir na Comunidade :)