Era assim no visual basic
Galera é o seguinte nesse chamado eu gostaria de saber umas coisas basicas que eu ainda nao tenho conhecimento como se faz no delfi
Exemplo la no visual basic ou dotnet que sou mais acustumado eu crio um modulo e coloca la tudo que eu vou usar em todo o projeto.Como funcoes, Rotinas e ate mesmo mensagem para o usurio do tipo erro , cadastro realizado com sucesso !
Gostaria de saber no delphi como eu vou fazer isso !
Eu sei que tem que ser em um unit , mais eu to fraco ainda no delphi , gostaria de um exemplo bem detalhado para matar a charada de uma vez , se for possivel que vc crie ai algumas rotinas , messagens de texto , funcoes para dessa vez eu dominar mesmo o negocio
Carlos Faria
Curtidas 0
Respostas
Guinther Pauli
13/11/2008
Carlos,
Você está no caminho certo, as rotinas devem ficar em unit. Para adicionar uma nova unit ao seu projeto vá até o menu File>New>Unit do Delphi. Uma nova unit será criada. Como ela será um repositório de funções e rotinas a idéia é que ao salvá-la demos um nome significativo... por exemplo vamos utilizar o nome Global.pas. Então salve essa nova unit e dê o nome Global.pas
Veja que uma unit vazia se apresenta desta forma:
unit Global;
interface
implementation
end.
Vamos enteder essa estrutura. Logo abaixo da palavra interface e antes da palavra implementation nós fazemos as declarações das funções, mensagens, etc. E o código delas propriamente dito, colocamos abaixo da palavra implementation.
As palavras interface e implementation delimitam as seções de uma unit, e são palavras reservadas. Vc não pode criar uma variável com o nome “interface” e nem “implementation”. Pra resumir declaramos na seção interface e codificamos na seção implementation.
Você não está acostumado com essa coisa de declaração de funções. Em Delphi nós precisamos declarar na seção interface os nomes das funções, mensagens para que elas se tornem publicas para todo o sistema. Por exemplo, vamos declara uma função ContaLetras nessa unit. Essa função vai receber como parâmetro uma variável do tipo string e vai retornar a quantidade de letras que existem. Sua unit global vai ficar assim:
unit Global;
interface
function ContaLetras(Palavra: string): integer;
implementation
end.
Agora nós precisamos implementer a função. Como eu disse antes, a declaração só torna a função visível a todo o sistema. O código da função nós colocamos na seção implementation. Sua unit Global vai ficar assim agora:
unit Global;
interface
function ContaLetras(Palavra: string): integer;
implementation
function ContaLetras(Palavra: string): integer;
begin
result := Length(Palavra);
end;
end.
E como podemos usar essa nova função ? Imagine que vc tem um formulário, digamos que ele se chame Form1. Nesse Form1 temos um botão e ao clicar nele você quer chamar a função ContaLetras para exibir em uma mensagem a quantidade de letras que tem a palavra CARLOS. A primeira coisa é dar um clique duplo no botão para que o evento OnClick seja criado. Depois, dentro do evento vamos chamar a sua função, passando a palavra CARLOS como parâmetro e o retorno da função será exibido pela função do Delphi ShowMessage. O clique do botão vai ficar assim:
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(ContaLetras(CARLOS));
end;
Tente rodar o programa. Você vai ver que não vai funcionar ainda. A mensagem de erro que será dada é a “Undeclared Identifier: ContaLetras”. O Delphi está lhe dizendo que o Form1 não conhece a função ainda. Pra isso termo que adicionar uma referencia no Form1 que aponte para a unit Global. Pra isso o Delphi disponibiliza a seção USES. Nela você informa quais units o formulário vai usar pra achar as funções. Assim, vamos incluir no USES do formulário a nossa unit Global. O código do Form1 vai ficar assim:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Global;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(ContaLetras(CARLOS)));
end;
end.
Tente executar novamente. Agora vc vai ver que deu certo.
Sobre mensagens, se elas não forem mudar, podemos defini-las como constantes. Uma constante é identificada na seção CONST. Voltando na unit Global vamos criar duas mensagens. Uma com o texto “Este é um teste de mensagem” e outra com o texto “Esta é a mensagem 2”. O código vai ficar assim:
unit Global;
interface
function ContaLetras(Palavra: string): integer;
const
MENSAGEM1 = Este é um teste de mensagem;
MENSAGEM2 = Esta é a mensagem 2;
implementation
function ContaLetras(Palavra: string): integer;
begin
result := Length(Palavra);
end;
end.
Observe que a seção CONST é criada dentro da seção interface e é identificada pela palavra reservada const e cada mensagem recebe um nome único. É através desse nome que localizamos as mensagens.
E como podemos usar essas mensagens ? Voltando lá no Form1, no click do botão, vamos exibir as mensagens usando o ShowMessage também. O código vai ficar assim:
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(ContaLetras(CARLOS)));
ShowMessage(MENSAGEM1);
ShowMessage(MENSAGEM2);
end;
Vamos criar agora uma rotina que troca o texto do botão que está no Form1. Qual é a primeira coisa que fazemos ? Declarar a rotina. Veja como fica abaixo:
unit Global;
interface
function ContaLetras(Palavra: string): integer;
procedure TrocaTextoBotao(botao: TButton);
const
MENSAGEM1 = Este é um teste de mensagem;
MENSAGEM2 = Esta é a mensagem 2;
implementation
function ContaLetras(Palavra: string): integer;
begin
result := Length(Palavra);
end;
end
E agora vamos implementar. Lembrando que o código fica na seção implementation. Abaixo temos o código.
unit Global;
interface
function ContaLetras(Palavra: string): integer;
procedure TrocaTextoBotao(botao: TButton);
const
MENSAGEM1 = Este é um teste de mensagem;
MENSAGEM2 = Esta é a mensagem 2;
implementation
function ContaLetras(Palavra: string): integer;
begin
result := Length(Palavra);
end;
procedure TrocaTextoBotao(botao: TButton);
begin
botao.caption := Mudei o texto;
end;
end.
Tente executar o programa agora. Você vai ver que não vai dar certo. Sabe porque ? Veja que a procedure TrocaTextoBotao recebe como parâmetro uma variável “botão” do tipo TButton. A unit Global não conhece o tipo TButton. Pra fazer ela conhecer temos que adicionar uma referencia à unit que contém a declaração do TButton. Isso deve ser feito em uma seção Uses também. Abaixo temos o código.
unit Global;
interface
uses StdCtrls;
function ContaLetras(Palavra: string): integer;
procedure TrocaTextoBotao(botao: TButton);
.
.
Agora lá no click do botão no form 1 vamos chamar também a nossa procedure. Código:
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(ContaLetras(CARLOS)));
ShowMessage(MENSAGEM1);
ShowMessage(MENSAGEM2);
TrocaTextoBotao(Button1);
end;
Espero que com este exemplo tenha ficado claro como se criar e utilizar uma unit de funções globais.
Em anexo está o exemplo,
http://video.devmedia.com.br/PauloQuicoli/Consultoria/Codigo-Chamado419.zip
Aguardo seu retorno,
abs
GOSTEI 0
Carlos Faria
13/11/2008
Guinter
O que seria mais profissional , criar uma unit para guardas as funcoes globais ou um datamodule ?
Vc tem alguma unit ou datamodule com funcoes basicas ai de exemplo , funcoes como const (messagens para usuario) validação de cpf , etc
GOSTEI 0
Guinther Pauli
13/11/2008
Carlos,
O ideal é deixar em uma unit global mesmo.
Segue em anexo uma unit que utilizo, com algumas funções já prontas. Você pode copiar essas funções e utilizá-las em suas aplicações.
http://video.devmedia.com.br/PauloQuicoli/Consultoria/419-Funcoes.zip
Aguardo seu retorno,
abs
GOSTEI 0
Guinther Pauli
13/11/2008
Carlos,
Continuamos aguardando seu retorno para encerrarmos o chamado,
abs
GOSTEI 0
Guinther Pauli
13/11/2008
Carlos,
Podemos encerrar esse chamado ?
abs
GOSTEI 0
Carlos Faria
13/11/2008
Ate com o seu exemplo deu certo mas eu fiz um funcao abre form
unit Global;
interface
uses
SysUtils, Classes ,Forms ; type
TdmFuncoesSystem = class(TDataModule)
private
{ Private declarations }
public procedure AbreForm (Aclasseform: TComponentClass; aform:Tform );
function VerificaSenha (aUsuario ,Asenha :string ):Boolean ; end; var
dmFuncoesSystem: TdmFuncoesSystem; implementation uses UDMBUSCA, ufrmLogin, ufrmPrincipal; {$R *.dfm} procedure TdmFuncoesSystem.AbreForm(Aclasseform: TComponentClass; aform: Tform);
begin //procedure para abrir formulario
Application.createform (Aclasseform ,aform ) ;
try
aform.showmodal ; finally
FreeAndNil(aform) ; end;
end;
function TdmFuncoesSystem.VerificaSenha(aUsuario, Asenha: string): Boolean;
begin with DMBUSCA.cdsVerificaUsuario do ; DMBUSCA.cdsVerificaUsuario.Close ;
DMBUSCA.cdsVerificaUsuario.Params [0].AsString := UpperCase(aUsuario);
DMBUSCA.cdsVerificaUsuario.Params [1].AsString := UpperCase(Asenha);
DMBUSCA.cdsVerificaUsuario.Open ;
Result := (DMBUSCA.cdsVerificaUsuario.RecordCount > 0) ; end; end. Aqui no datamodule ela ate que funcionou , mais na unit nao funciona o que falta para funcionar na unit ? qual maneira mais profissional de trabalhar eu guarda as variaveis global em uma unit ou em datamodule ?
SysUtils, Classes ,Forms ; type
TdmFuncoesSystem = class(TDataModule)
private
{ Private declarations }
public procedure AbreForm (Aclasseform: TComponentClass; aform:Tform );
function VerificaSenha (aUsuario ,Asenha :string ):Boolean ; end; var
dmFuncoesSystem: TdmFuncoesSystem; implementation uses UDMBUSCA, ufrmLogin, ufrmPrincipal; {$R *.dfm} procedure TdmFuncoesSystem.AbreForm(Aclasseform: TComponentClass; aform: Tform);
begin //procedure para abrir formulario
Application.createform (Aclasseform ,aform ) ;
try
aform.showmodal ; finally
FreeAndNil(aform) ; end;
end;
function TdmFuncoesSystem.VerificaSenha(aUsuario, Asenha: string): Boolean;
begin with DMBUSCA.cdsVerificaUsuario do ; DMBUSCA.cdsVerificaUsuario.Close ;
DMBUSCA.cdsVerificaUsuario.Params [0].AsString := UpperCase(aUsuario);
DMBUSCA.cdsVerificaUsuario.Params [1].AsString := UpperCase(Asenha);
DMBUSCA.cdsVerificaUsuario.Open ;
Result := (DMBUSCA.cdsVerificaUsuario.RecordCount > 0) ; end; end. Aqui no datamodule ela ate que funcionou , mais na unit nao funciona o que falta para funcionar na unit ? qual maneira mais profissional de trabalhar eu guarda as variaveis global em uma unit ou em datamodule ?
GOSTEI 0
Guinther Pauli
13/11/2008
Carlos,
Se você reler o texto explicativo, verá que menciono que na unit global também é necessário adicionar referências à outras units.
Provalmente esse é o problema.
Quanto ao onde ficar as variáveis globais, não existe uma regra. Você coloca onde você achar melhor. Eu particularmente coloco em uma unit global.
Aguardo seu retorno para encerrarmos esse chamado,
abs
GOSTEI 0
Carlos Faria
13/11/2008
Fecha ai professor ?
tudo ok
uma pergunta fora do assunto eu sou desenvolvedor em vb6 modestia parte com conhecimentos avançados
eu baixei um software de video aulas aqui e gostei do negocio ?
como eu faço para criar um mini curso exemplo migrando do vb6 para o visual studio 2008 e divulgar no site da devmedia ?
as aulas sao revisadas ?
Eu poderia criar esse projeto e te enviar ?
Acho que muitos hoje tem esse duvida , migrar do vb6 para o visual studio
GOSTEI 0
Guinther Pauli
13/11/2008
Carlos,
Entre em contato através do email:
editordevmedia@gmail.com (Rogério)
Ele é o responsável sobre essa parte de vídeos,
abs
GOSTEI 0