Escolar Documentos
Profissional Documentos
Cultura Documentos
com
Pgina 1 de 272
Capitulo I Definies Sistema Operacional: Conjunto de pequenos softwares capazes de controlar as diversas funes de um hardware. Exemplos: WINDOWS, LINUX, DOS, UNIX... etc Linguagem: Conjunto de cdigos capazes de descrever uma ao a ser realizada por um processador ou sistema computacional. Linguagem estruturada: toda linguagem onde as linhas de comando seguem uma seqncia lgica continua ou em rotinas interligadas entre si. Exemplos: CLIPPER, BASIC, FORTRAN, NATURAL, C... etc Linguagem orientada a objeto: a linguagem onde se utilizam formas grficas (Objetos) com caractersticas prprias e independentes, capazes de realizar um procedimento atravs de uma ao que assim o determine. Exemplos: DELPHI, VISUAL BASIC,... etc Constantes: So informaes que possuem um valor predefinido, que no se altera durante um processo. As constantes podem ser classificadas em numricas ou alfanumricas tambm conhecidas como strings: Exemplo A:=5 A:= B*30 A:=Delphi A:=Delphi +2005 Constante 5 30 Delphi Delphi e 2005 Tipo Numrica Numrica String String Caracterstica Aceita clculos numricos Se apresenta sempre fora de aspas Se apresenta sempre entre aspas Aceita clculos lgicos
Variveis: So posies definidas na memria e reservadas para guardar dados ou resultados de clculos. As variveis podem ser: Tipo Variant Integer Real ou Doubl String Boolean ou Lgico Descrio Assume qualquer valor Assume um valor inteiro Assume um valor real Assume um valor string (alfa-numrico) Assume um valor lgico Exemplo V1: Variant; I: Integer; D: Double; S: string; B:Boolean;
Com exceo das variveis do tipo variant, toda varivel possui uma faixa de abrangncia para guardar valores, dependo a capacidade de armazenamento a varivel pode ser: Varivel Integer Integer/Longint Longword/Cardinal Byte Int64 Shortint Smallint Word Faixa de abrangncia De At -2.147.483.648 2.147.483.647 0 4.294.967.295 0 255 -263 2631 -128 128 -32.768 32.767 0 65.535 Formato Sinal Positivo/Negativo Positivo Positivo Positivo/Negativo Positivo/Negativo Positivo/Negativo Positivo Bits 32 32 8 64 8 16 16
gondraf@hotmail.com
Pgina 2 de 272
Varivel Real ou Doubl Real Real48 Single Doubl Extended Comp Currency Varivel String Char String / ShortString AnsiString WideString Varivel Lgica Boolean ByteBool WordBool LongBool
Bits 64 48 32 64 80 64 64
Memria ocupada 1 byte De 2 at 256 bytes De 4 bytes at 4 gigabytes De 4 bytes at 4 gigabytes Formato Tipo associado Byte Byte Word Integer/Longint
Bits 8 8 16 32
As variveis sero sempre representadas por letras, podendo ou no, serem seguidas por outras letras ou nmeros e nunca estaro entre de aspas. Exemplos: Nome:String; A1:Integer; Preo_de_custo:Currency. Operadores: So smbolos ou expresses capazes de gerar um clculo lgico ou aritmtico. Os operadores so classificados segundo seu clculo, podendo ser: Atribuio: Atribuir valores a uma varivel ou propriedade de um objeto; Aritmtico: Efetuam clculos aritmticos; Lgicos: Efetuam clculos lgicos; Relacionais: Efetuam clculos relacionais; Set: So operadores predefinidos em funes; ou @ retorna o endereo de uma varivel, funo, procedimento ou mtodo.
Operadores aritmticos: Operador + * / Div Operao Adio Subtrao Multiplicao Diviso Inteiro da diviso Tipo do operando Inteiro, real Inteiro, real Inteiro, real Inteiro, real Inteiro Tipo Resultante Inteiro, real Inteiro, real Inteiro, real Real Inteiro Exemplo X+Y Result - 1 P * 45 X/2 Total div x
gondraf@hotmail.com
Pgina 3 de 272
Mod
Y mod 6
Observao: O operador + quando utilizado com dados string provocar a concatenao destes. Exemplo: A,B,C:String; A:= Curso de ; B:=Delphi; C:=A+B; C resulta em Curso de Delphi. Operadores lgicos: Operador Not And Or Xor Operao negao conjunco disjuno disjuno exclusiva Tipo do operando Boolean Boolean Boolean Boolean Tipo Resultante Boolean Boolean Boolean Boolean Exemplo not (C in MySet) D and (T > 0) A or B A xor B
Operadores set: Operador + * <> >= <= = In Operao unio diferena interseco desigualdade superset subset igualdade membership Tipo do operando set set set set set set set set, ordinal Tipo Resultante set set set Boolean Boolean Boolean Boolean Boolean Exemplo Set1 + Set2 S-T S*T MySet <> S1 S1 >= S2 Q <= MySet S2 = MySet A in Set1
Operadores relacionais: Operador = <> > < >= <= Operao igualdade desigualdade maior que menor que maior ou igual menor ou igual Tipo do operando simple, class, class reference, interface, string, packed string simple, class, class reference, interface, string, packed string simple, string, packed string, PChar simple, string, packed string, PChar simple, string, packed string, PChar simple, string, packed string, PChar Tipo Resultante Boolean Boolean Boolean Boolean Boolean Boolean Exemplo A=I X<>Y X>Y X<Y X>=Y X<=Y
Dados: So todas as informaes fornecidas pelo usurio. Banco de Dados: So meios lgicos de armazenamento de dados. Os bancos de dados geralmente so criados separadamente dos aplicativos e so acessados por estes a partir de ferramentas que interagem com gerenciadores especficos para cada tipo. Rotina: a descrio de cada parte integrante de um aplicativo.
gondraf@hotmail.com
Pgina 4 de 272
As rotinas visam dividir um aplicativo em pequenas partes capazes de transcrever e executar uma tarefa especfica, como exemplo, suponha que uma distribuidora de livros resolva controlar seus pedidos s editoras e o volume de livros repassados aos seus clientes e para facilitar este trabalho, resolve dividi-lo em sees: Seo Compras Vendas Funes 1Identificar as editoras 2-Identificar os livros das editoras 3-Escolher os livros e comprar 1-Identificar os clientes 2-Separar e entregar os livros escolhidos Rotinas 1-Cadastro de editoras 2-Cadastro de livros 3-Entrada dos livros 1-Cadastro de clientes 2-Sada dos livros
Procedimento: cada uma das aes realizadas por uma rotina: Exemplo: Rotina Cadastro de editoras Procedimentos 1. Verificar se editora j foi cadastrada 2. Se no foi cadastrada, ento pegar uma nova ficha 3. Transcrever os dados da editora para a ficha 4. Confirmar a veracidade dos dados 5. Se dados conferem ento colocar a ficha no arquivo.
Comandos: So termos, palavras reservadas, que servem para transcrever os procedimentos humanos aplicados a uma rotina para linguagem compreendida pelo computador. Estruturas: So comandos que dispostos em certa ordem executam uma funo comum. Geralmente as estruturas apresentam um incio e um fim e dentre estes so descritos procedimentos. As estruturas podem ser classificadas em:
1) Estrutura de bloco: a estrutura que controla o projeto e cada procedimento nele descrito,
determinando seu incio e fim. O bloco tambm pode conter declaraes de constantes, tipos, variveis, procedimentos, e funes; estas declaraes tm que preceder a parte de declarao do bloco. Estruturas de deciso: Provocam desvios no fluxo do projeto de acordo com a entrada fornecida pelo usurio ou resultante de um clculo. Estruturas de loop ou lao: Provocam a repetio de um ou vrios procedimentos de acordo com uma condio previamente descrita. Estruturas consecutivas: Executa uma sucesso de declaraes constituintes. Estruturas de exceo: Desvia o fluxo do projeto quando ocorre um erro na execuo normal de um programa ou outro evento a interrompa.
2) 3) 4) 5)
gondraf@hotmail.com
Pgina 5 de 272
Capitulo II Componentes bsicos da orientao a objetos Classe: So moldes atravs dos quais criamos objetos. Exemplo: type TFprincipal = class(TForm) Panel1: TPanel; Label1: TLabel; Label2: TLabel; Objeto: Abstrao que agrupa caractersticas e comportamentos. Exemplo: object BitBtn1: TBitBtn Left = 168 Top = 240 Width = 199 Height = 31 Caption = '&Confirmar e encaminhar' TabOrder = 4 OnClick = BitBtn1Click Glyph.Data = {76060000424D} End;
Instncia: o objeto propriamente dito. Possui caractersticas prprias. Propriedade: Define as caracterstica dos objetos de uma classe. Exemplo:
gondraf@hotmail.com
Pgina 6 de 272
Mensagem: Representa uma ao do objeto ou uma mudana de estado. Define a comunicao entre objetos. Interface: Conjunto de mensagens que define o comportamento de um objeto (Protocolo). Evento: um gatilho que quando disparado pelo usurio realiza um procedimento. Exemplo: (Evento OnClick do objeto Button1 montado sobre o formulrio Form1) procedure TForm1.Button1Click(Sender: TObject); begin Form1.Color:=clYellow; end; Procedimento: a ao a ser realizada aps o disparo de um evento. Exemplo: (Procedimento disparado pelo evento OnClick do objeto Button1) procedure TForm1.Button1Click(Sender: TObject); begin Form1.Color:=clYellow; end; Tempo de Projeto: o tempo utilizado pelo desenvolvedor durante a confeco do projeto. Tempo de Execuo: o tempo utilizado pelo usurio final para execuo do projeto aps o trmino da sua confeco ou pelo desenvolvedor para realizao de testes. Capitulo III Apresentao do Delphi 2005
Tela de Abertura
Mdulos carregados
gondraf@hotmail.com
Pgina 7 de 272
Menu Principal
Paleta de objetos
gondraf@hotmail.com
Pgina 8 de 272
Object Inspector: a conexo entre o a parte visual (Form) e a parte codificada (Unit) de sua aplicao.
No Object inspector encontram-se duas abas: Propriedades (Properties) e eventos (Events), onde a primeira determina as caractersticas do objeto selecionado e a segunda indica quais so os eventos suportados por este objeto. Alm das abas encontra-se uma outra regio indicativa do nome e da classe do objeto selecionado. Caixa de estruturas (Structure): a regio do DELPHI onde se apresentam todos os objetos dispostos em um formulrio (Form).
Boto minimizar Boto Fechar Mover para baixo Mover para cima Excluir objeto Incluir objeto Objetos
A Paleta de Componentes: a principal barra de ferramenta, pois contem barras que classificam e guardam os componentes (objetos) que sero utilizados durante o desenvolvimento de projetos em Delphi. Os componentes contidos nas abas da paleta de componentes so alvos de nosso estudo, portanto, sero apresentados conforme sua necessidade nos captulos a seguir.
gondraf@hotmail.com
Pgina 9 de 272
Boto desfazer seleo Boto habilitar/desabilitar categoria Categoria selecionada Objetos da categoria
Gerente do projeto (Project Manager): Mostra todo o projeto disposto em forma de rvore permitindo acesso a pgina de cdigos ou formulrio, bem como permite a localizao de objetos, procedimentos e funes contidas no projeto.
Boto minimizar Boto minimizar Seleciona projeto Remove unit/form do projeto Inclui nova unit/form ao projeto Unit/form do projeto Modelo do projeto Explorador de base de dados
gondraf@hotmail.com
Pgina 10 de 272
O Formulrio: Form: O mesmo que formulrio, a regio onde sero dispostos os objetos, nas linguagens estruturadas representariam a tela do projeto.
Unit: a regio onde se escrevem os procedimentos, a parte estrutural do Delphi tambm chamada de pgina de cdigos.
Barra de rolagem Linhas de cdigos Mostra a unit Mostra o form Mostra o histrico
gondraf@hotmail.com
Pgina 11 de 272
Estrutura de uma Unit: Unit <identificador>; Interface {Especifica o que ser exportado pela UNIT a fim de ser utilizados por outros mdulos} [uses <lista de units>;] <sees de declarao> Implementation {Declarao de Variveis, Implementao dos mtodos. [uses <lista de units>;] <definies> [Initialization {Cdigo executado automaticamente quando um aplicativo que utiliza a UNIT executado} <instrues>] [Finalization {Cdigo executado automaticamente quando um aplicativo que utiliza a UNIT finalizado} <instrues>] end. Constante e tipos locais a UNIT e
gondraf@hotmail.com
Pgina 12 de 272
Capitulo IV Os primeiros contatos Para entender o funcionamento de uma linguagem orientada a objeto, imagine a seguinte proposio: - Em uma rua movimentada foi colocado um semforo para controlar o trfego de veculos e prximo a este existe uma cabine de onde um agente o trnsito determina o momento em que as luzes devero ser acesas. - Assim de acordo com o boto pressionado pelo agente de uma determinada luz do semforo ascende e as demais apagam. - Podemos ento dizer que cada boto um objeto utilizado pelo agente, da mesma forma, o semforo tambm pode ser considerado como objeto. - Se o semforo um objeto ento ele possui algumas propriedades, por exemplo: o semforo possui luzes que podem ascender em cores distintas desse modo cor seria uma propriedade do semforo e a cor acessa seria sua caracterstica. Resumindo temos: Objeto Boto Verde Boto Amarelo Boto Vermelho Evento Clicar Clicar Clicar Procedimento Cor do semforo = Verde Cor do semforo = Amarelo Cor do semforo = Vermelho
ou F9 para execut-lo.
gondraf@hotmail.com
Pgina 13 de 272
Para alterar a cor, propriedade color, usaremos os botes 1, 2 e 3, conforme descrito a seguir: Objeto Button1 Button2 Button3 Propriedade Caption = Amarelo Caption = Verde Caption = Vermelho Evento OnClick OnClick OnClick Procedimento Form1.Color:=clyellow; Panel1.Color:=clgreen; Panel1.Color:=clred;
Para alterar a largura, propriedade height, usaremos os botes 4 e 5, conforme descrito a seguir: Objeto Button4 Button5 Propriedade Caption = Mais Largo Caption = Menos Largo Evento OnClick OnClick Procedimento form1.Height:=form1.Height+1; form1.Height:=form1.Height+1;
Para alterar o comprimento, propriedade width, usaremos os botes 6 e 7, conforme descrito a seguir: Objeto Button6 Button7 Propriedade Caption = Mais Largo Caption = Menos Largo Evento OnClick OnClick Procedimento form1.Width:=form1.Width+1; form1.Width:=form1.Width-1;
Para alterar a altura, propriedade top, usaremos os botes 8 e 9, conforme descrito a seguir: Objeto Button8 Button9 Propriedade Caption = Mais Alto Caption = Mais Baixo Evento OnClick OnClick Procedimento form1.Top:=form1.Top-1; form1.Top:=form1.Top+1;
ou F9 para execut-lo.
Prtica 03 - Exerccio 01: O objetivo dessa prtica alterar algumas propriedades do objeto TPanel, clicando sobre os botes. Complete a tabela e escreva os procedimentos conforme o formulrio a seguir:
gondraf@hotmail.com
Pgina 14 de 272
Formulrio:
Valor
Procedimento
Capitulo V Estruturas Estrutura um conjunto de aes interligadas entre si contendo um comando que caracteriza o seu incio e um outro seu fim as estruturas controlam todo o projeto, provocam tomadas de decises, controlam repeties, deviam o fluxo do projeto e controlam as possveis excees. As estruturas podem ser classificadas em:
6) Estrutura de bloco: a estrutura que controla o projeto e cada procedimento nele descrito,
determinando seu incio e fim. O bloco tambm pode conter declaraes de constantes, tipos, variveis, procedimentos, e funes; estas declaraes tm que preceder a parte de declarao do bloco. 7) Estruturas de deciso: Provocam desvios no fluxo do projeto de acordo com a entrada fornecida pelo usurio ou resultante de um clculo. 8) Estruturas de loop ou lao: Provocam a repetio de um ou vrios procedimentos de acordo com uma condio previamente descrita. 9) Estruturas consecutivas: Executa uma sucesso de declaraes constituintes. 10) Estruturas de exceo: Desvia o fluxo do projeto quando ocorre um erro na execuo normal de um programa ou outro evento a interrompa.
a) Estrutura de bloco:
Esta estrutura sempre composta pelos comandos Begin ... End, onde o primeiro determina o incio da estrutura e o segundo o seu fim. Um ponto e vrgula aps um comando indicam que ainda existem comandos ou declaraes pertencentes a estrutura, porm quando o comando End sucedido do ponto e vrgula indica o fim da estrutura. O uso do ponto ao final aps o End, indica o fechamento do projeto.
gondraf@hotmail.com
Pgina 15 de 272
Exemplo 01: Para entender a estrutura de bloco tomemos como exemplo um fato cotidiano de acordar, pegar o carro e ir at o trabalho. Inicio Rotina despertar; Inicio Acordar; Forrar a cama; Sair do quarto; Fim; Rotina asseio; Inicio Escovar os dentes; Tomar banho; Fim; Rotina alimentao; Inicio; Preparar a comida; Sentar a mesa; Comer; Fim; Rotina trabalhar; Inicio; Pegar o carro; Ir ao trabalho; Desligar o carro; Trabalhar; Fim; Fim.
Exemplo 02: Somar 02 nmeros e mostrar o resultado: Rotina somar dois nmeros; Declarar A,B,C como variveis numricas; Inicio Perguntar qual o primeiro nmero; Ler o nmero e guardar em A; Perguntar qual o segundo nmero; Ler o nmero e guardar em B; Fazer C = A + B; Mostrar C; Fim;
Prtica 04:Baseado no exemplo 02, montaremos um projeto para somar dois nmeros inteiros. Objeto Form1 Label1 Label2 Label3 Edit1 Valor Soma de dois nmeros Primeiro nmero: Segundo nmero: Resultado: Vazio (null) Evento Procedimento
Estrutura Princpal
OnKeyPres s
Edit1KeyPress
gondraf@hotmail.com
Pgina 16 de 272
Edit2KeyPress Button1Click
Procedimentos: procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not (key in ['0'..'9']) then key:=#0; end; procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char); begin if not (key in ['0'..'9']) then key:=#0; end;
procedure TForm1.Button1Click(Sender: TObject); var A,B,C:integer; begin Variveis A, B e C do tipo A:=strtoint(edit1.Text); inteira B:=strtoint(edit2.Text); C:=A+B; Label3.Caption:='Resultado:'+inttostr(C); A funo strtoint(string):integer; end; Converte um valor string em um
Pratica 05 Exerccio 02: Monte um projeto capaz de calcular a mdia aritmtica entre 4 nmeros inteiros quaisquer.
gondraf@hotmail.com
Pgina 17 de 272
Condies propostas: Deve-se travar o teclado evitando-se a digitao de caracteres no numricos. b) Estruturas de deciso: Muitas vezes em um projeto o processador precisa decidir entre dois ou mais valores, para tanto o desenvolvedor dever dirigir o fluxo do projeto de acordo com a entrada fornecida pelo usurio ou resultante de um clculo. As estruturas de deciso utilizam operadores relacionais, podendo tambm fazer uso de operadores lgicos. As estruturas de decises podem ser classificadas em:
Estrutura de deciso nica, utilizam a estrutura If...then...Else; Estrutura de deciso mltipla, utiliza a estrutura Case...Else...End; Estrutura If ... Then ... Else: (Se... Ento... Seno...) Na estrutura If ... Then ... Else a deciso nica e quando for verdadeira os comandos que estiverem aps o Then sero executados, enquanto os comandos que estiverem aps o else sero desprezados. Caso a condio seja falsa os comando existente aps o then sero desprezados sendo executados apenas os comandos que estiverem aps o Else.
Para entender melhor esta estrutura de deciso imagine um interruptor de uma lmpada. Quando o interruptor fechado permite a passagem da corrente eltrica, acendendo a lmpada e quando ele aberto, interrompe-se a passagem da corrente eltrica e a lmpada no acende. Assim: Incio
gondraf@hotmail.com
Pgina 18 de 272
Indique a posio do interruptor; Se a posio o interruptor fechada ento A lmpada est acessa Seno A lmpada est apagada Fim Pratica 06: Acendendo uma lmpada: Baseado na explicao acima monte o seguinte projeto. Formulrio:
Valor Pratica 06 Vazio (null) clBlack Interruptor Acender a lmpada Apagar a lmpada 1
Evento
Procedimento
OnClick
RadioGroup1Click
procedure TForm1.RadioGroup1Click(Sender: TObject); begin if RadioGroup1.ItemIndex=0 then panel1.Color:=clyellow else panel1.Color:=clblack; end; Comentrios:
gondraf@hotmail.com
Pgina 19 de 272
Prtica 07: O objetivo desta prtica descobrir se um nmero par ou mpar, calcular sua raiz quadrada, definir se exata ou inexata e separar a parte inteira da parte decimal. Formulrio:
Objeto Form1 Label1 Label2 Label3 Label4 Label5 Edit1 Edit2 Edit3 Edit4 Button1 GroupBox1 GroupBox1 RadioButton1 RadioButton2 Procedimentos:
Propriedade Caption Caption Caption Caption Caption Caption Text Text Text Text Caption Caption Enabled Caption Caption
Valor Pratica 07 Digite um nmero: Resultado: Raiz: Parte inteira: Parte decimal: Vazio (null) Vazio (null) Vazio (null) Vazio (null) Verificar Resultados: False Exata Inexata
Evento
Procedimento
OnKeyPres s
Edit1KeyPress
OnClick
Button1Click
procedure TForm1.Button1Click(Sender: TObject); var valoremreal:real; valordaraiz:real; parteinteira:real; partefracionaria:real; begin valoremreal:=strtofloat(edit1.Text); valordaraiz:=sqrt(valoremreal); edit2.Text:=floattostr(valordaraiz); parteinteira:=int(valordaraiz); partefracionaria:=valordaraiz-parteinteira;
gondraf@hotmail.com
Pgina 20 de 272
if strtoint(edit1.Text) mod 2 =0 then label2.Caption:=edit1.Text+' um nmero par' else label2.Caption:=edit1.Text+' um nmero impar'; if partefracionaria=0 then begin radiobutton1.Checked:=true; edit3.Text:=floattostr(parteinteira); edit4.Text:='0'; end else begin radiobutton2.Checked:=true; edit3.Text:=floattostr(parteinteira); edit4.Text:=floattostr(partefracionaria); end; end; procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not (key in ['0'..'9']) then key:=#0; end; Comentrios:
Pratica 08 Exerccio 03: Monte um projeto onde o usurio informe o nome do aluno e 04 notas, obtendo como sada, a mdia aritmtica das notas fornecidas e situao em que o aluno se encontra, baseando-se na condio abaixo. Condies propostas: O aluno ser aprovado se obter uma mdia >= 6.
Na estrutura Case ... of... Else ... End a deciso baseada em mltipla escolha sendo executados apenas os comandos que satisfaam a condio.
gondraf@hotmail.com
Pgina 21 de 272
Ateno: A estrutura Case...of... Else... End, s aceita condies com valores inteiros. Para entender melhor o funcionamento desta estrutura imagine um semforo controlando o fluxo de veculos, a cada cor acessa uma mensagem enviada ao motorista e como apenas uma cor acende por vez, o motorista nunca receber mais que uma mensagem ao mesmo tempo. Pratica 09: Controlando o trnsito. Formulrio:
Objeto Form1 Image1 Image1 Timer1 RadioGroup1 RadioGroup1 RadioGroup1 Shape1 Shape2 Shape3 Shape1 Shape2 Shape3 Variveis: Clausula Private Procedimentos:
Propriedade Caption Picture Autosize Enabled Caption Items ItemIndex Shape Shape Shape Brush.Color Brush.Color Brush.Color
Valor Pratica 09
c:\delphi 2005\pratica 09\ carro1.bmp
Evento OnActivate
Procedimento Form1Activate
True False Semforo Pare Ateno Siga 0 stCircle stCircle stCircle clBtnface clBtnface clRed
OnTimer OnClick
Timer1Timer RadioGroup1Click
Varivel Carro
Tipo Integer
procedure TForm1.FormActivate(Sender: TObject); begin carro:=0; end; procedure TForm1.Timer1Timer(Sender: TObject); begin case carro of
gondraf@hotmail.com
Pgina 22 de 272
0:begin image1.Picture.LoadFromFile('c:\delphi 2005\pratica 09\carro1.bmp'); carro:=1; end; 1:begin image1.Picture.LoadFromFile('c:\delphi 2005\pratica 09\carro2.bmp'); carro:=0; end; end; end; procedure TForm1.RadioGroup1Click(Sender: TObject); begin case radiogroup1.ItemIndex of 0:begin timer1.Enabled:=false; shape1.Brush.Color:=clbtnface; shape2.Brush.Color:=clbtnface; shape3.Brush.Color:=clred; end; 1:begin timer1.Enabled:=true; timer1.Interval:=500; shape1.Brush.Color:=clbtnface; shape2.Brush.Color:=clyellow; shape3.Brush.Color:=clbtnface; end; 2:begin timer1.Enabled:=true; timer1.Interval:=50; shape1.Brush.Color:=clgreen; shape2.Brush.Color:=clbtnface; shape3.Brush.Color:=clbtnface; end; end; end; Comentrios:
Pratica 10: Promovendo descontos Esta prtica visa calcular o valor a ser cobrado por uma empresa de cpias de acordo com a quantidade de xrox retiradas em um ms conforme a tabela abaixo: Quantidade de cpias At 50 De 51 a 100 De 101 a 150 Acima de150 Valor por cpia R$ 0,10 R$ 0,08 R$ 0,06 R$ 0,05
gondraf@hotmail.com
Pgina 23 de 272
Formulrio:
Objeto Form1 LabeledEdit1 LabeledEdit1 LabeledEdit2 LabeledEdit2 LabeledEdit3 LabeledEdit3 LabeledEdit4 LabeledEdit4 Label1 Label2 Label3 StaticText1 StaticText1 StaticText2 StaticText2 StaticText3 StaticText3 BitBtn1 BitBtn1
Propriedade Caption EditLabelCaption LabelPosition EditLabelCaption LabelPosition EditLabelCaption LabelPosition EditLabelCaption LabelPosition Caption Caption Caption Caption BorderStyle Caption BorderStyle Caption BorderStyle Caption Glyph
Valor Pratica 10 Quantidade de xrox na primeira semana lpLeft Quantidade de xrox na segunda semana lpLeft Quantidade de xrox na terceira semana lpLeft Quantidade de xrox na quarta semana lpLeft Total de xrox: Valor por xrox: Total a pagar: 0 sbsSuken 0 sbsSuken 0 sbsSuken Calcular C:\Arquivos de programas\ arquivos comuns\ borland shared\images\buttons\ calculat.bmp
OnClick
BitBtn1Click
Procedimentos: procedure TForm1.testatecla(Sender: TObject; var Key: Char); begin if not (key in ['0'..'9',#8]) then key:=#0; end;
gondraf@hotmail.com
Pgina 24 de 272
procedure TForm1.BitBtn1Click(Sender: TObject); var valor,total:real; soma:integer; begin if (labelededit1.Text='') or (labelededit2.Text='') or (labelededit3.Text='') or (labelededit4.Text='') then showmessage('Existe pelo menos uma semana sem quantidade!') else begin
soma:=strtoint(labelededit1.Text)+strtoint(labelededit2.Text)+strtoint(labelededit3.Text)+strtoint(labelededit4.Text);
case soma of 0..49:valor:=0.10; 50..99:valor:=0.08; 100..150:valor:=0.06; else valor:=0.05; end; statictext1.Caption:=inttostr(soma); statictext2.Caption:=formatfloat('R$0.00',valor); total:=soma*valor; statictext3.Caption:=formatfloat('R$0.00',total); end; end; Comentrios:
Pratica 11 Exerccio 04: Uma empresa resolve realizar uma promoo com descontos entre 10 e 40 por cento de acordo com o total a ser pago pelo cliente conforme a tabela a seguir: Valor total comprado At R$ 100,00 De R$ 101,00 a R$ 250,00 De R$ 251,00 a R$ 300,00 Acima de R$ 300,00 c) Percentual de desconto 10% 20% 30% 40%
Muitas vezes em um projeto o desenvolvedor necessita repetir um determinado procedimento de forma controlada, a esta repetio denominamos lao ou loop.dever dirigir o fluxo do projeto de acordo com uma condio previamente descrita. So trs as estruturas de lao:
- Repeat... Until: O Repeat executa sua sucesso de declaraes constituintes continuamente e testa a expresso depois de cada repetio. Quando o resultado da expresso satisfeita, o repeat termina. A sucesso sempre executada pelo menos uma vez porque expresso no avaliada at depois da primeira repetio.
gondraf@hotmail.com
Pgina 25 de 272
Valor
Indique o nmero de repeties: Vazio (null) Aplicar
Procedimentos: procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if (key< chr(48)) or (key > chr(57)) then key:=chr(0); end; procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin i:=1; listbox1.Clear; repeat listbox1.Items.Add('Repetio n:'+inttostr(i)); inc(i); until strtoint(edit1.Text)<i; end; Comentrios:
gondraf@hotmail.com
Pgina 26 de 272
- While... do: Executa sua sucesso de declaraes constituintes continuamente e testa a expresso antes de cada repetio. Quando o resultado da expresso no mais satisfeita, o while termina. Para entender melhor o funcionamento desta estrutura proceda da seguinte maneira. Abra o projeto anterior e altere o procedimento OnClick do objeto Button1 para: procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin i:=0; listbox1.Clear; while strtoint(edit1.Text)>i do begin inc(i); listbox1.Items.Add('Repetio n:'+inttostr(i)); end; end; Comentrios:
- For... to... do // For... downto... do: Executa sua sucesso de declaraes constituintes continuamente at que o valor inicial atinja o valor final, atravs de uma incrementao, (clausula to), ou decrementao, (clausula downto), quando o valor final alcanado, o for termina. Para entender melhor o funcionamento desta estrutura proceda da seguinte maneira. Abra o projeto anterior e altere o procedimento OnClick do objeto Button1 para: procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin listbox1.Clear; for i:=1 to strtoint(edit1.Text) do listbox1.Items.Add('Repetio n:'+inttostr(i)); end; Comentrios:
Pratica 13 Exerccio 05: Usando a estrutura de lao monte um projeto capaz e fazer a combinao de 15 nmeros aleatrios para gerar cartes da sena.
gondraf@hotmail.com
Pgina 27 de 272
d) Estruturas consecutivas: Executa uma sucesso de declaraes baseadas em condies onde se referenciam objetos, classes, campos, procedimentos ou propriedades. Comando: With... do (Com... faa) Para entender melhor o funcionamento desta estrutura monte o projeto descrito a seguir. Pratica 14: Demonstrao do With...do Formulrio:
Valor
Pratica 14 Tamanho da fonte: Largura da borda: Nome da fonte: Rtulo: Cor da fonte: Cor do painel: Aplicar
Evento
Procedimento
OnClick
Button1Click
Procedimentos: procedure TForm1.Button1Click(Sender: TObject); begin with panel1 do begin font.Size:=strtoint(edit1.Text); font.Color:=colorbox1.Selected; font.Name:=edit3.Text; caption:=edit4.Text; Color:=colorbox2.Selected; end; end;
gondraf@hotmail.com
Pgina 28 de 272
Comentrios:
e) Estruturas de exceo: Desvia o fluxo do projeto quando ocorre um erro ou outra interrupo
na execuo normal de um programa. Estruturas:
Try Except Tenta executar um bloco de comandos caso no consiga, o fluxo geraria uma interrupo que tenderia a interromper a execuo do projeto, com o uso do except um segundo bloco tentar ser executado.
Exemplo: try X := Y/Z; except on EZeroDivide do HandleZeroDivide; end; - Esta declarao tenta dividir Y por Z, mas se uma exceo encontrada chamada uma rotina nomeada HandleZeroDivide de EZeroDivide, (erro:diviso por zero). - Try finally Tenta executar um bloco, se uma interrupo provocar uma parada no fluxo de execuo do projeto, o uso do finally o interpretar como fim do processo executando um segundo bloco de comandos. Exemplo: Reset(F); try ... // process file F finally CloseFile(F); end; Capitulo VI Bancos de dados: Os bancos de dados so estruturas capazes de armazenar informaes fornecidas por usurios para utilizaes futuras, a bem da verdade os dados sero armazenados em tabelas e estas por sua vez comporo estruturas maiores denominadas bancos ou bases de dados. Para que uma linguagem consiga abrir, ler ou armazenar dados em uma tabela necessrio a presena de uma ferramenta conhecida como gerenciador de bancos de dados. Como exemplo de gerenciadores de bancos de dados temos: BDE Administrator (Borland Database Engine); MSSQL (Microsoft Structure Query Linguage).
gondraf@hotmail.com
Pgina 29 de 272
O BDEAdministrator: Introduo ao Borland DataBase Engine O BDE uma ferramenta utilizada para fazer a conectividade entre o Delphi, C++Builder, IntraBuilder, Paradox for Windows, e Visual dBASE for Windows. Arquitetura: A arquitetura do BDE inclui numerosos servios compartilhados utilizados pelos drives de banco de dados e outras funes. O contedo includo nos drives do BDE habilita acesso consistente para fontes de dados standards: Paradoxo, dBASE, FoxPro, ACCESS, e bancos de dados de texto. Voc pode adicionar os drivers Microsoft ODBC e criar atravs do Borland SQL vnculos com outros servidores de SQL, inclusive Informix, DB2, InterBase, Oracle, e Sybase. Junto com seus drivers de banco de dados e API consistente, BDE d para a Microsoft Windows 95 e Windows NT Aplication um acesso direto inclusive de compartilhamento a mltiplas fontes de dados. Orientao a Objeto: BDE orientado a objeto. Em tempo de execuo o fomentador de aplicao interage com BDE criando vrios objetos. Estes objetos de runtime manipulam entidades de banco de dados, como Tables e Querys. A Interface de Programa de Aplicao extensa do BDE (API) escrita direto em C e C++ aperfeioaram o acesso ao BDE e seus drives embutidos para dBASE, Paradox, FoxPro, ACCESS, e bancos de dados de texto. Alias: um pseudnimo, um nome e um conjunto de parmetros que descrevem um recurso de Network, (cadeia de trabalho). Aplicaes de BDE usam pseudnimos para conectar se com bancos de dados compartilhados. Um alias no exigido para endereos de bancos de dados locais, mas ser exigido enderear um banco de dados de SQL.
Aba de definies (DataBases): Nesta aba so definidos os alias que indicaro onde sero definidos os tipos, os drives, o local, a forma de acesso e comportamento das bases de dados que podero se acessadas mediante o chamamento do alias. Aba de configuraes (Configuration): Nesta aba so definidos as configuraes dos drives e comportamento do sistema.
gondraf@hotmail.com
Pgina 30 de 272
Os drives carregados pelo BDE so divididos em dois grupos: Native e ODBC, descritos a seguir: Forma de acesso Estrutura Paradox DB2 DBase FoxPro Informix Interbase MSAccess MSSQL Oracle Sybase SQLServer Microsoft Access Driver Microsoft Text Driver Microsoft Excel Driver Microsoft dBase Driver Microsoft Paradox Driver Microsoft Visual FoxPro Driver Microsoft FoxPro VFP Driver Microsoft VFP dBase Driver
Nativo
ODBC
Usaremos este gerenciador com o drive nativo paradox em nossos exemplos. Configurando o Drive Paradox:
Net Dir: Determina o local onde ser armazenado o arquivo PDOXUSRS.NET; Version: Informa a verso interna do drive; Type: Tipo do servidor para o qual este drive conecta. Pode ser SERVER (servidor de SQL) ou FILE (standard, arquivo baseado em servidor). LangDriver: Informa o idioma do drive; Block Size: Determina o tamanho do bloco resevado para aramazenamento das tabelas Paradox, Os blocos ocupam mltiplos de 1024 bytes dispostos nos seguintes nveis: Nvel 5 and 7 Nvel 3 and 4 Default: 1024, 2048, 4096, 16384 e 32768 1024, 2048 e 4096 2048
gondraf@hotmail.com
Pgina 31 de 272
Fill Factor: Porcentagem de bloco de disco atual que deve ser enchido antes do Paradox alocar outro bloco de disco para arquivos de ndice. Pode ser qualquer inteiro que varia de 1 a 100. Default: 95 Nota: valores Menores oferecem desempenho melhor mas aumentam o tamanho de ndices. Valores maiores do arquivos de ndice menores mas aumentam o tempo para criao de um ndice. Level: Determina o formato utilizado na criao de tabelas Paradox temporrias: Nivel 7 tabelas Paradox para Windows 32-bit; Nivel 5 tabelas Paradoxo 5.0; Nivel 4 formato de tabelas STANDARD introduzido em Paradox 4.0 Nivel 3 formato de tabelas usadas por Paradox 3.5 e verses anteriores Default: Nvel 4. Para usar campos Blob, ndices secundrios, e integridade referente, especifique Paradox nvel 4 ou nvel 5. Voc pode usar o nvel mais baixo possvel para forar a compatibilidade para um nivel anterior. S escolha Nvel 7 se voc precisa das caractersticas de posicionamento avanadas aplicadas para aquele formato de tabela. StrictIntegrty: Integridade Referente, Especificaes das tabelas Paradox se podem ser modificadas usando aplicaes que no se apiam na integridade referente (como, Paradoxo 4.0). por exemplo, se TRUE voc estar impossibilitado mudar uma tabela com integridade referente que usa Paradox 4.0; se FALSE, voc pode mudar a tabela, mas voc arrisca a integridade de seus dados. Default: TRUE. Para acessarmos as tabelas que utilizam este gerenciador utilizaremos os componentes da paleta BDE.
gondraf@hotmail.com
Pgina 32 de 272
O MSSQL Server:
Para acessarmos as tabelas que utilizam este gerenciador utilizaremos os componentes da paleta dbGo.
OBS: Para utilizar qualquer uma destas estruturas os gerenciadores devem estar instalados no equipamento de desenvolvimento. Capitulo VII O DataBase Desktop (DBD): Uma das principais finalidades das linguagens de programao a de controlar o armazenamento de informaes de forma permanente, isto , a possuir a capacidade de incluir, excluir ou alterar informaes mantidas em um meio. A este meio chamaremos de tabela. Ao se trabalhar com armazenamento de dados, dois softwares devero estar instalados no computador, o primeiro capaz de criar tabelas e segundo capaz de torn-las acessveis ao delphi. O DataBase Desktop um utilitrio que nos permite cria, ver, ordenar, modificar Tables (Tabelas de dados) e Query (Tabelas de consultas) nos formatos Paradox, dBASE, e SQL.
gondraf@hotmail.com
Pgina 33 de 272
Menu
Barra de ferramentas
O comando file apresenta a seguinte lista de subcomandos: Subcomando New Open Close Save Save As... Working Directory... Private Directory... Descrio Cria uma nova tabela, query ou SQL Abre uma tabela, query ou SQL Fecha uma tabela, query ou SQL Salva uma tabela, query ou SQL Salva uma tabela, query ou SQL em outra Define um diretrio como de trabalho Define um diretrio como privado
Caso a opo open seja selecionada os comandos do menu sero alteradas como veremos a seguir. O comando edit apontara para preferncias enquanto a opo open no for aberta e se encarregar de determinar as preferncia de edio do usurio, porm se a opo open estiver ativa os comandos do menu sero alterados. O comando tools apresenta a seguinte lista de subcomandos: Subcomando Alias manager.. Descrio Ativa o gerenciador de Alias, isto , abrir o Borland DataBase Engine (BDE), gerenciador de bases de dados da Borland
gondraf@hotmail.com
Pgina 34 de 272
Utilities Password
Ativa uma lista de funes capazes de realizar cpias, adio, subtrao, fornecer informaes, zerar, classificar, renomear e reestruturar tabelas. Cria senhas para acessos a tabelas
O comando window estar inabilitado at que a opo open seja ativada e apresentar a seguinte lista de subcomandos: Subcomando Cascade Tile top and bottom Side by side Arrange icons Close all Descrio Exibir as janelas das tabelas na forma de cascata Exibir as janelas das tabelas uma abaixo da outra Exibir as janelas das tabelas uma ao lado da outra Organizar as janelas em icones Fecha todas as janelas
O comando help abrir a ajuda do DBD. Para se criar uma tabela precisaremos de alguns conceitos bsicos: Dados: So todas as informaes fornecidas pelo usurio. Campos: So espaos predeterminados onde sero armazenados os dados. Registros ou Recordes: o conjunto de campos. Chaves: So ordens de classificao dos registros. A forma de armazenamento dos dados juntamente com a grande quantidade de aplicativos capazes de criar tabelas, associadas as diversas linguagens de programao existentes, fizeram com que surgissem vrias estruturas ou tipos de tabelas, cada uma com sua caractersticas prprias. Por essa razo o desenvolvedor ter que identificar e ajustar o delphi quela que melhor lhe convir. Capitulo VIII Trabalhando com o DataBase Desktop: Para iniciarmos o trabalho com o DBD, criaremos uma nova pasta na unidade c: e a chamaremos de Delphi 2005, em seguida devemos analisar os dados que sero armazenados. Nesta anlise devem ser levados em considerao os seguintes pontos: Nmero do campo (Field Roster): uma classificao onde so ordenados os campos. Nome do campo (Field Name): Determina o nome que ser usado para identificao do campo. Tipo (Type): Determina o tipo do dado que ser aceito pelo campo. Tamanho (Size): Determina o nmero mximo de caracteres fornecidos pelo usurio. Chave (Key): Determina se o campo chave de ndice da tabela. Os tipos dos dados disponveis variaro de acordo com a estrutura escolhida, no nosso caso, iniciaremos com a estrutura Paradox em sua verso 7.0. Tipo do campo Alpha Smbolo A Tamanho 1 - 255 Valor suportado Letras, nmeros, smbolos especiais como %, &, #, or = ou qualquer outro carcter ASCII
gondraf@hotmail.com
Pgina 35 de 272
Number Money Short Long Integer Date Time Timestamp Memo Formatted Memo Graphic OLE
Logical Autoincrement
L +
Binary
Bytes
Um campo que pode conter s nmeros, um sinal, e um ponto de frao decimal. --Formata os nmeros para forma de moeda com at seis dgitos aps a vrgula. --Qualquer nmero inteiro entre -32767 e 32767 --Qualquer nmero inteiro na faixa que vai de -2147483648 a 2147483647 --Guarda datas entre 1 de Janeiro de 9999 AC at 31 de Dezembro 9999 AD. --Guarda horas no formato DD:MM:AAAA --Guarda a data e hora atual 1 - 240** Guarda arquivos memo 0 - 240** Guarda arquivos formatted memo 0 - 240*** Guardam imagens nos formatos .BMP, .PCX, .TIF, .GIF, e .EPS. 0 - 240*** Armazena tipos diferentes de dados, como imagens, som, documentos, e assim por diante. O campo de OLE lhe proporciona um modo para ver e manipular estes dados dentro do Paradox. Voc no precisa especificar um tamanho para campos de OLE porque eles no so armazenados na tabela, mas em arquivos separados. --Campos lgicos contm valores que representam verdadeiro ou falso (True ou False). --Campos autoincrement contm um inteiro longo, um campo somente de leitura (no editvel). A tabela comea com o nmero 1 e soma um nmero para cada registro subseqente. Apagando um registro no muda os valores de campo de outros registros. 0 - 240*** Campos binrios s devem ser usados por usurios avanados que precisam trabalhar com dados que a tabela no consegue interpretar, isto , a tabela no pode exibir ou pode interpretar campos binrios. Um uso comum de um campo binrio armazenar som. Campos binrios no requerem um tamanho porque eles so armazenados em um arquivo separado (o .MB arquivam), no na tabela. 1 - 255 Campos de bytes s devem ser usados por usurios avanados que precisam trabalhar com dados que a tabela no consegue interpretar, isto , a tabela no pode interpretar campos bytes. Um uso comum de um campo binrio armazenar cdigos de barra ou tiras magnticas. Campos de bytes distintos, campos binrios requerem um tamanho porque eles so armazenados na tabela e no em um arquivo separado, permitindo acesso mais rpido.
gondraf@hotmail.com
Pgina 36 de 272
BCD
Campos BCD contm dados numricos em formato BCD (Codigo Decimal Binrio). Use campos BCD quando voc quer executar clculos com um nvel mais alto de preciso que aquele disponvel com o uso de outros campos numricos. Clculos em campos BCD no so executados to depressa quanto em outros campos numricos. O campo tipo BCD provido principalmente para compatibilidade com outras aplicaes que usam dados BCD. A tabela interpreta dados BCD corretamente de outras aplicaes que usam BCD. Porm, quando a tabela executa clculos com dados BCD, converte os dados para o tipo de flutuante, devolvendo o resultado para BCD.
* Nmero de dgitos depois do ponto de frao decimal; * * Campos Memo ou Formated Memo podem ter um tamanho virtual. O valor especificado se refere ao tamanho da Base de dados do arquivo memo da tabela (1 a 240 caracteres para memo e 0 a 240 caracteres para formated memo). O memo inteiro armazenado fora da tabela. Por exemplo, se voc especifica um valor de 45 ao campo, o Banco de dados guarda os primeiros 45 caracteres na tabela e armazena o campo de memo inteiro em outro arquivo (com a extenso .MB). * * * Opcional Obs: Se todos seus memos so menores que um determinado tamanho (por exemplo, 200 carter), voc pode economizar espao e tempo fixando o tamanho de campo de memo igual ou maior que este tamanho. O Banco de dados guarda na tabela o memo inteiro se ele menor que o tamanho determinado. A partir deste conhecimento criaremos uma tabela simples conforme a descrio abaixo: Nome do campo Identidade CPF Nome Nascimento Logradouro Numero Complemento Bairro Cidade Estado CEP Ativo Tipo Alfanumrico Alfanumrico Alfanumrico Data Alfanumrico Numrico Alfanumrico Alfanumrico Alfanumrico Alfanumrico Alfanumrico Lgico Tamanho 10 14 50 50 50 30 30 2 10 Chave Sim Descrio Guarda o nmero da identidade Guarda o nmero do C.P.F. Guarda o nome Guarda a data de nascimento Guarda o nome da rua Guarda o numero da casa Guarda dados complementares Guarda o nome do bairro Guarda o nome da cidade Guarda o nome do estado Guarda o nmero do cep Guarda a situao
Crie a pasta: C:\Delphi 2005\Tabelas, agora abra o DBD e escolha as opes: File; New e Table:
gondraf@hotmail.com
Pgina 37 de 272
Aponte o tipo da tabela para Paradox 7, conforme a figura acima e click sobre OK; Aparecer a janela de edio de tabelas em Paradox, preencha conforme a tabela descrita anteriormente.
gondraf@hotmail.com
Pgina 38 de 272
Click sobre o boto Save As em seguida localize a pasta C:\Delphi 2005\Tabelas; D o nome de Pessoal tabela e click em salvar. Exerccio 06: Agora crie uma tabela com base nas instrues abaixo e salve no diretrio C:\Delphi 2005\Tabelas com o nome de acessos: Campo Usuario Senha Nivel de acesso Tipo Alpha Alpha Number Tamanho 30 6 Chave Sim
Incrementando registros de uma tabela: Para se incluir registros a uma tabela sem conduto ter que fazer um projeto para isso, proceda da seguinte maneira:
c) Com a tabela aberta escolha a opo Edit Data do comando Table ou pressione F9:
d) A gravao ser automtica sempre que houver um deslocamento a nvel de registro. Navegando pelos registros de uma tabela: Para se navegar sobre os registros de uma tabela sem conduto ter que fazer um projeto para isso, proceda da seguinte maneira:
a) Abra a tabela; Opo: File seguida das opes Open e Table; b) Em seguida utilize as opes do comando Record para navegar:
gondraf@hotmail.com
Pgina 39 de 272
Descrio vai para o Prximo registro vai para o registro Anterior vai para o Primeiro registro vai para o ltimo registro
Excluindo registros de uma tabela: Para se excluir os registros de uma tabela sem conduto ter que fazer um projeto para isso, proceda da seguinte maneira:
c) Abra a tabela; Opo: File seguida das opes Open e Table; d) Em seguida coloque a tabela sob a forma de edio localize o registro que deseja excluir e
pressione Ctrl+Del. Organizando os registros de uma tabela: Um ndice um arquivo que determina a ordem em uma tabela. O paradox, o dBASE, e o SQL usam ndices para organizar os registros em uma tabela, mas os ndices deles/delas trabalham diferentemente. Os ndices podem ser primrios ou secundrios. No paradox, o ndice primrio chamado tambm a chave (KEY). Criando ndices secundrios: Os ndices secundrios geralmente so criados durante a confeco da tabela, portanto se a tabela j existir teremos que reestrutur-la. No processo de reestruturao se alterarmos a forma dos campos ou excluirmos algum campo, os dados contidos nestes devero ser ajustados para a nova forma do campo ou sero perdidos se o campo for excludo, no entanto, a criao de ndices secundrios no afetaram, a princpio, os dados armazenados. Para se criar ndices secundrios em uma tabela sem conduto ter que fazer um projeto para isso, proceda da seguinte maneira:
gondraf@hotmail.com
Pgina 40 de 272
Uma vez aberta a tabela selecione a opo Secundary Indexes, na caixa de rolagem Table Properties; Em seguida click sobre o boto Define. Surgir ento a janela de definies descrita a seguir: Selecione o campo CPF e click sobre a seta de adio, em seguida marque a opo Unique na caixa Index options. Uma vez definido o campo e a opo do ndice clica-se sobre o boto OK e informa-se o nome para o arquivo de ndice. Sugesto: Monte o nome do ndice associando o campo a terminao idx, por exemplo: CPFIDX Agora proceda de maneira semelhante para o campo Nome, alterando, porm, a opo do ndice para Maintained na caixa Index options e salvando com o nome: NOMIDX Observaes: As opes Case sensitive e Descending, promovem a distino de maisculas e minsculas no primeiro caso, e organiza a tabela de forma decrescente no segundo caso. Exerccio 07: Abra a tabela Acessos.db e inclua 03 registros. Capitulo IX Incluindo tabelas em um formulrio: Existem duas maneiras de se trabalhar com tabelas em formulrios: a primeira delas introduz a tabela diretamente sobre o formulrio onde se vai trabalhar, e a segunda consiste em utilizar-se de um tipo especial de formulrio denominado Data-Module. Geralmente usam-se os data-modules quando a tabelas so compartilhadas entre vrios formulrios. O Data-Module: Como j mencionamos o Data-Module um tipo especial de formulrio, onde se colocam as tabelas a serem utilizadas no projeto. O data-module possui apenas dois eventos: OnCreate Ocorre sempre que uma aplicao inicializa o data-module.
gondraf@hotmail.com
Pgina 41 de 272
Por exemplo: Se um data-module contm os componentes database ou table e dataset, uma aplicao pode estabelecer uma conexo com o banco de dados ou com as tabelas imediatamente. Se o mdulo de dados contm Timer, (cronmetros), a aplicao pode os inicializar. OnDestroy Ocorre sempre que o data-module foi destrudo. Por exemplo: Pode-se se escrever um procedimento que autorize o fechamento de tabelas, neste evento, e sempre que o data-module for destrudo, ele fechar as tabelas antes de se destruir.
gondraf@hotmail.com
Pgina 42 de 272
Com relao as propriedades, convm mencionar a seguinte: OldCreateOrder Est propriedade do tipo boolean, apresenta False como default, o que assegura que o evento Oncreate seja executado aps a finalizao das instncias dos demais construtores e que o evento OnDestroy seja executado antes das instncias dos demais destructors.
Pratica 15: Incluindo uma senha Aps a criao da tabela Acessos, precisaremos criar o data module, e neste inserir objetos capazes de acessar a tabela, porem, definiremos um ALIAS, (atalho para a pasta onde esto as tabelas), e o chamaremos de dados. Alias: um pseudnimo, um nome e um conjunto de parmetros que descrevem um recurso de Network, (cadeia de trabalho). Aplicaes de BDE usam pseudnimos para conectar se com bancos de dados compartilhados. Criando um alias paradox: 1- Selecione a opo Object no menu opes e nesta selecione New ou pressione Ctr+N: 2- Aps a abertura da janela apresentada ao lado, selecione Standard como Database Driver Name (nome do drive para a base de dados); 3- Click em Ok para confirmar o drive; 4 Agora altere o nome do Alias de Standard para dados;
Quando se cria um Alias indicando Standard como disponibilizados trs drives: PARADOX: Paradox, para tabelas .DB; DBASE: dBASE e FoxPro, para tabelas .DBF; ASCIIDRV: ASCII text, para tabelas .TXT. Em seguida configuraremos as opes para o alias criado para o drive escolhido: TYPE: Tipo do servidor para o qual este drive conecta; PATH: o caminho onde o banco de dados est armazenado; DEFAULT DRIVER: Drive padro: PARADOX, DBASE ou ASCIIDRV;
gondraf@hotmail.com
Pgina 43 de 272
ENABLE BCD: Specifica se BDE traduz campos numricos e decimais em valores de ponto flutuantes ou valores em decimal codificado binrio (BCD). Valores de BCD eliminam os erros de arredondamento associados com matemtica de ponto flutuante (exemplo: 3 * (2/3) resultando em 2.00000000001). Quando ENABLE BCD fixado para TRUE, decimais e campos numricos so convertidos para BCD. Default FALSE. 5- Para as nossas tabelas configuraremos os parmetros do alias conforme a tabela abaixo: Parmetro TYPE DEFAULT DRIVER ENABLE BCD PATH Valor STANDARD PARADOX FALSE C:\Delphi 2005\Tabelas
6- Agora resta-nos apenas salvar o nosso alias: Opes: Object e Save As. Agora que j temos um alias criado partiremos para a criao o data module. Criando o data module: i) Crie uma nova aplicao para win32; ii) Click em File // New // Other
iii) Click em Delphi Projects // Delphi Files; iv) Selecione o cone Data Module e pressione OK. Formulrio Data Module:
Objeto
Propriedade
Valor
Evento
Procedimento
gondraf@hotmail.com
Pgina 44 de 272
DatamoduleCreate DatamoduleDestroy
Alteradas as propriedades deve-se indicar quais campos da tabela estaro disponveis ao projeto. D um click duplo no objeto TAcessos e selecione Add All Fiels:
Procedimentos: procedure TDM.DataModuleCreate(Sender: TObject); begin TAcessos.Open; end; procedure TDM.DataModuleDestroy(Sender: TObject); begin TAcessos.Close; end; Digitados os procedimentos, Salve o data moule com o nome UDM. Agora que o data module est pronto montaremos um formulrio para entrada do usurio e sua senha.
Formulrio:
gondraf@hotmail.com
Pgina 45 de 272
Objeto Form1 Form1 Panel1 Panel1 Panel1 Panel1 Panel1 Panel1 Label1 Label2 Edit1 Edit2 BitBtn1 BitBtn1 BitBtn2 BitBtn1
Propriedade Caption Caption Border Style BevelInner BevelOuter BevelWidth BorderWidth Caption Caption Text Text Caption Glyph Caption Glyph
Valor
Pratica 15
Evento OnActivate
Procedimento Form1Activate
Vazio (null) bsSingle bvLowered bvRaised 2 2 Usurio: Senha: Vazio (null) Vazio (null) Verificar C:\arquivos de programas\ arquivos comuns\Borland Shared \Images\Buttons\Key Cancelar C:\arquivos de programas\ arquivos comuns\Borland Shared \Images\Buttons\DoorOpen Tipo Integer
OnClick
BitBtn1Click
OnClick
BitBtn2Click
Varivel Tentativas
Valor
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls,udm; private tentativas:integer; Procedimentos: procedure TFSenha.FormActivate(Sender: TObject); begin tentativas:=0; end; procedure TFSenha.BitBtn1Click(Sender: TObject); begin
gondraf@hotmail.com
Pgina 46 de 272
if tentativas=3 then // Tentativas=3? begin MessageDlg('Acesso Negado!',mtinformation,[mbCancel],0); // Emitir mensagem Halt; // Encerrar projeto end else begin dm.TAcessos.SetKey; // Ativa a chave de ndices dm.TAcessosUsuario.Text:=edit1.Text; // Atribui usurio campo.chave dm.TAcessos.GotoKey; // Busca chave if dm.TAcessosUsuario.Text=Edit1.Text then // campo.chave=usurio? begin if dm.TAcessosSenha.Text=Edit2.Text then // campo.senha=senha? showmessage('acesso permitido!') // Chama o formulario de menu else begin tentativas:=tentativas+1; // Incrementar Tentativas em 1 MessageDlg('Senha Invlida!',mterror,[mbok],0); // Emitir mensagem edit2.Text:=''; // Zerar entrada da senha edit2.SetFocus; // Retornar a entrada da senha end; end else begin inc(tentativas,1); // Incrementar Tentativas em 1 MessageDlg('Usurio no autorizado!',mterror,[mbok],0); // Emitir mensagem Edit1.Text:=''; // Zerar entrada do usurio Edit1.SetFocus; // Retornar a entrada do usurio end; end; end; procedure TFSenha.BitBtn2Click(Sender: TObject); begin Halt; end; Comentrios:
// Fecha projeto
Capitulo X Incluindo menus em um formulrio: A montagem de menus algo bastante comum em aplicativos que seguem os padres Windows, isto , aplicativos que se executam em janelas. Os menus do delphi se classificam em dois tipos: MainMenu: Menu principal, fixo e normalmente ocupa a posio superior da janela do aplicativo. PopUpMenu: Menu flutuante, mvel e ativo com o pressionamento do boto direito do mouse, so geralmente utilizados como menus auxiliares. Tanto no MainMenu como no PopupMenu, existem duas propriedades que trabalharam da mesma forma: Items: usada para criar os itens do menu e Images: usada para colocar cones ao lado dos itens do menu.
gondraf@hotmail.com
Pgina 47 de 272
Os itens criados nos MainMenu e PopUpMenu se comportam como novos objetos e possuem propriedades e eventos prprios. Prtica 16 Montando um formulrio de controle Formulrio:
Valor
Pratica 16 Fpratica16 True True alClient C:\Delphi 2005\images\Borland1 &Cadastros C&lientes &Produtos &Fornecedores F&uncionarios &Movimentos &Entradas &Sadas C&onsultas &Cadastros C&lientes &Produtos &Fornecedores F&uncionarios &Movimentos &Entradas &Sadas &Sair
Evento
Procedimento
Mainmenu1
Items
Aps a digitao dos procedimentos salve a unit com o nome Upratica16 Comentrios:
gondraf@hotmail.com
Pgina 48 de 272
Capitulo XI Trabalhando com mais de um formulrio: comum na maioria dos projetos a presena de vrios formulrios, tanto pelo fato da quantidade de objetos utilizados, como por uma questo de lgica e organizao. Os formulrios precisam ser abertos e aps seu uso novamente fechados para evitar seu acmulo na memria do computador. a)Abertura de formulrio: Comandos: Show; ShowModal. O comando Show abre um formulrio em uma janela, mantendo disponvel as janelas abertas anteriores a atual O comando ShowModal abre um formulrio em uma janela, no permitindo acesso s janelas abertas anteriores a atual. Prtica 17 Anexando formulrios: Observe as prticas 16 e 17, verifique que de certo modo eles se completam. O que vamos fazer agora anexar estas duas prticas em um nico projeto, dando assim uma viso maior sobre projetos em delphi.
Para anexar as prticas, proceda da seguinte forma: 1. Abra a prtica 16; Add file to project;
Pronto as duas prticas agora pertencem ao mesmo projeto, no entanto, precisamos criar uma interface entre seus cdigos e seu formulrios. Para criar tal interface utilizamos ao final da clausula USES da unit do projeto de senhas, inclumos Upratica16, que corresponde ao nome da unit da pratica 16: uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls,udm,Upratica16;
gondraf@hotmail.com
Pgina 49 de 272
Embora as units estejam interligadas, precisamos chamar o formulrio da pratica 16 caso o usurio seja aceito e sua senha seja vlida, para isso altere a linha 55 do procedimento Click do bitbtn1 do formulrio FSenha para: Antes da alterao Linha Procedimento if dm.TAcessosSenha.Text=Edit2.Text then 54 55 showmessage('acesso permitido!') 56 else Antes e executar vamos salvar como um novo projeto: No menu principal click sobre File e escolha a opo: Save projet as..., dando-lhe o nome de pratica17. Comentrios: Aps a alterao Linha Procedimento if dm.TAcessosSenha.Text=Edit2.Text then 54 Fpratica16.Show 55 Else 56
Observe a linha 55 da pgina de cdigos do formulrio FSenha: Fpratica16.Show Execute o projeto e mova a janela do menu principal de forma a enxergar o formulrio de senha, em seguida clique sobre ele. Comentrios:
Agora substitua a linha 55 da pgina de cdigos do formulrio FSenha por: Fpratica16.ShowModal Execute o projeto e mova a janela do menu principal de forma a enxergar o formulrio de senha, em seguida clique sobre ele. Comentrios:
b) Fechamento de formulrio: Comandos: Close; Halt. O comando Close retornando janela aberta anteriormente. O comando Halt fecha todas as janelas de um projeto, juntamente com todas as bases de dados, encerrando a aplicao e retirando-a da memria. Inclua ao projeto o evento click no objeto Sair1, este objeto foi criado pelo delphi quando inclumos o item Sair no mainmenu1. procedure TForm1.Sair1Click(Sender: TObject);
gondraf@hotmail.com
Pgina 50 de 272
Capitulo XII Estruturando um projeto: Para facilitar o trabalho com vrios formulrios geralmente se faz um esboo de visualizao, onde se divide o projeto em blocos de acordo com sua aplicabilidade: A seguir est demonstrado um diagrama simples, para leitura de registros de uma tabela armazenada em um banco de dados, incrementar registros e atualizar a tabela.
Observe a presena de rotinas em cada processo. A estas rotinas podem estar associados formulrios e units ou simplesmente units quando se tratarem de funes ou processos internos de mquina. A seguir est demonstrado um algoritmo simples, para leitura de registros de uma tabela armazenada em um banco de dados, incrementar registros e atualizar a tabela. 1-Incio 2-Localiza base de dados 3-Identifica a tabela
gondraf@hotmail.com
Pgina 51 de 272
4- possvel abrir a tabela? 4.1-Se no: 4.1.1-Identificar a razo 4.1.2-Informar ao usurio 4.2-Se sim: 4.2.1-Ativar chave de ndices 5-Definir ao: 6-Caso ao: Incluso de novos registros: 1-Abrir formulrio 2-Preparar campos de formulrio 3-Entrar com dado 4-Buscar chave 5-Chave existe? 6-Se sim: 6.1-Mostrar dados 6.2-Informar ao usurio 6.3-Voltar para definio de ao 5 7-Se no: 7.1-Entrar com valores 7.2-Criticar valores 7.3-Preparar tabelas para recebimento de dados 7.4-Gravar dados 7.5-Dados gravados com sucesso? 7.6-Informar usurio 7.7-Incluir novos registros? 7.7.1-Se sim: 7.7.1.1-Retornar para ao - 2 7.7.2-Se no: 7.7.2.1-Voltar para definio de ao 5 Alterao de registros: 1-Abrir formulrio 2-Preparar campos de formulrio 3-Entrar com dado 4-Buscar chave 5-Chave existe? 6-Se sim: 6.1-Mostrar valores 6.2-Alterar valores 6.3-Criticar valores 6.4-Preparar tabelas para recebimento de dados 6.5-Gravar dados 6.6-Dados gravados com sucesso? 6.7-Informar usurio 6.8-alterar outros registros? 6.8.1-Se sim: 6.8.1.1-Retornar para ao - 2 6.8.2-Se no: 6.8.2.1-Voltar para definio de ao 7-Se no: 7.1-Informar ao usurio 7.2-Voltar para definio de ao 5 Excluso de registros: 1-Abrir formulrio 2-Preparar campos de formulrio 3-Entrar com dado 4-Buscar chave 5-Chave existe? 6-Se sim:
gondraf@hotmail.com
Pgina 52 de 272
6.1-Mostrar valores 6.2-Exclui dados? 6.2.1-Se sim: 6.2.1.1-Excluir dados 6.2.1.2-Dados excludos com sucesso? 6.2.1.2.1-Se sim: 6.2.1.2.1.1-Informar ao usurio 6.2.1.2.1.2-Excluir outros registros? 6.2.1.2.1.2.1-Se sim: 6.2.1.2.1.2.1.1-Retornar para ao - 2 6.2.1.2.1.2.2-Se no: 6.2.1.2.1.2.2.1-Voltar p/ definio de ao 5 6.2.1.2.2-Se no: 6.2.1.2.2.1-Informar ao usurio 6.2.1.2.2.2-Voltar para efinio de ao 5 6.2.2-Se no: 6.2.2.1-Voltar para definio de ao 5 7-Se no: 7.1-Informar ao usurio 7.2-Excluir outro? 7.2.1-Se sim: 7.2.1.1-Retornar para ao - 2 7.2.2-Se no: 7.2.2.1-Voltar para definio de ao 5 8-Fim dos casos 9-Finalizar? 9.1-Se sim: 9.1.1-Fechar tabela 9.1.2-Fechar formulrio 9.2- Se no: 9.2.1- Voltar para definio de ao 5 Fim Observaes: O algoritmo descrito acima poder ser escrito de maneiras diferentes, dependendo apenas da linha de raciocnio do desenvolvedor. Capitulo XIII Incluindo, localizando e excluindo dados de uma tabela em tempo de execuo: Observando a prtica 17 notamos que falta d continuidade s opes apresentadas pelo mainmenu, onde cada opo possui rotinas prprias agrupadas em blocos denominados de cadastros, movimentos e consultas. Cada bloco, por sua vez representa um formulrio e uma pgina de cdigo. A prtica a seguir visa montar um desses formulrios, o cadastro de clientes, que tem como objetivo inclui, excluir e consultar registros de uma base e clientes. Para podermos escrever estas rotinas precisamos primeiro montar a tabela:
gondraf@hotmail.com
Pgina 53 de 272
Tabela de clientes:
ndices secundrios:
Feita a tabela vamos para o delphi onde abriremos a prtica 17 e salvamos como prtica 18:
gondraf@hotmail.com
Pgina 54 de 272
Prtica 18 Cadastro de clientes: Com o projeto Pratica18 aberto, crie um novo formulrio:
Valor
Cadastro de clientes
Evento OnActivate
Procedimento FormActivate
False Bairro Cidade Estado CEP Telefone Ebleft=true ebTop=true ebRight=true ebBottom=true ImageList1 True True
gondraf@hotmail.com
Pgina 55 de 272
novoClick primeiroClick anteriorClick proximoClick ultimoClick salvarClick excluirClick localizarClick fecharClick ecodigoExit
OnDblClick
DBGrid1DblClick
OnClick OnClick
BitBtn1Click elocalizaClick
RadioGroup1
MaskEdit1 RadioGroup2
OnClick
etipoClick
ComboBox1 Items.Strings
MaskEdit2 LabeledEdit2
LabeledEdit3
gondraf@hotmail.com
Pgina 56 de 272
LabeledEdit4
LabeledEdit5 LabeledEdit6
ComboBox2
ComboBox3 Items.Strings Name EditMask MaxLength Text Name EditMask MaxLength Text Name Align Caption
MaskEdit3
MaskEdit4
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, Mask, Grids, DBGrids, StdCtrls, ExtCtrls, ToolWin, ImgList, Buttons, udm, db; private acao:integer; procedure TFclientes.FormActivate(Sender: TObject); begin //desabilitao dos botes salvar.Enabled:=false; excluir.Enabled:=false; // limpeza dos campos ecodigo.Text:=''; etipo.ItemIndex:=-1; ebairro.Text:=''; ecpf_cnpj.Text:=''; ecliente.Text:='';
gondraf@hotmail.com
Pgina 57 de 272
erg_insestadual.Text:=''; elogradouro.Text:=''; ecomplemento.Text:=''; enumero.Text:=''; ecidade.Text:=''; eestado.Text:=''; ecep.Text:=''; etelefone.Text:=''; //inicializao da acao acao:=0; //abertura da tabela dm.TClientes.Open; end; procedure TFclientes.novoClick(Sender: TObject); begin //definicao da acao acao:=1; //informando ao usurio mensagens.Caption:='Rotina de incluso de registros'; // limpeza dos campos ecodigo.Text:=''; etipo.ItemIndex:=-1; ebairro.Text:=''; ecpf_cnpj.Text:=''; ecliente.Text:=''; erg_insestadual.Text:=''; elogradouro.Text:=''; ecomplemento.Text:=''; enumero.Text:=''; ecidade.Text:=''; eestado.Text:=''; ecep.Text:=''; etelefone.Text:=''; //direcionando o focus ecodigo.SetFocus; end; procedure TFclientes.primeiroClick(Sender: TObject); begin //definicao da acao acao:=2; // localizao do primeiro registro dm.TClientes.First; //transferencia dos dados da tabela para o formulario ecodigo.Text:=dm.TClientesCodigo.Text; etipo.ItemIndex:=dm.TClientesTipo.Value; ebairro.Text:=dm.TClientesBairro.Text; ecpf_cnpj.Text:=dm.TClientesCpf_cnpj.Text; ecliente.Text:=dm.TClientesCliente.Text; erg_insestadual.Text:=dm.TClientesRg_insestaudal.Text; elogradouro.Text:=dm.TClientesLogradouro.Text; ecomplemento.Text:=dm.TClientesComplemento.Text; enumero.Text:=dm.TClientesNumero.Text; ecidade.Text:=dm.TClientesCidade.Text; eestado.Text:=dm.TClientesEstado.Text; ecep.Text:=dm.TClientesCep.Text; etelefone.Text:=dm.TClientesTelefone.Text; //informando ao usurio
gondraf@hotmail.com
Pgina 58 de 272
mensagens.Caption:='Rotina de navegao de registros'; end; procedure TFclientes.anteriorClick(Sender: TObject); begin //definicao da acao acao:=2; // localizao do registro anterior dm.TClientes.Prior; //transferencia dos dados da tabela para o formulario ecodigo.Text:=dm.TClientesCodigo.Text; etipo.ItemIndex:=dm.TClientesTipo.Value; ebairro.Text:=dm.TClientesBairro.Text; ecpf_cnpj.Text:=dm.TClientesCpf_cnpj.Text; ecliente.Text:=dm.TClientesCliente.Text; erg_insestadual.Text:=dm.TClientesRg_insestaudal.Text; elogradouro.Text:=dm.TClientesLogradouro.Text; ecomplemento.Text:=dm.TClientesComplemento.Text; enumero.Text:=dm.TClientesNumero.Text; ecidade.Text:=dm.TClientesCidade.Text; eestado.Text:=dm.TClientesEstado.Text; ecep.Text:=dm.TClientesCep.Text; etelefone.Text:=dm.TClientesTelefone.Text; //informando ao usurio mensagens.Caption:='Rotina de navegao de registros'; end; procedure TFclientes.proximoClick(Sender: TObject); begin //definicao da acao acao:=2; // localizao do proximo registro dm.TClientes.Next; //transferencia dos dados da tabela para o formulario ecodigo.Text:=dm.TClientesCodigo.Text; etipo.ItemIndex:=dm.TClientesTipo.Value; ebairro.Text:=dm.TClientesBairro.Text; ecpf_cnpj.Text:=dm.TClientesCpf_cnpj.Text; ecliente.Text:=dm.TClientesCliente.Text; erg_insestadual.Text:=dm.TClientesRg_insestaudal.Text; elogradouro.Text:=dm.TClientesLogradouro.Text; ecomplemento.Text:=dm.TClientesComplemento.Text; enumero.Text:=dm.TClientesNumero.Text; ecidade.Text:=dm.TClientesCidade.Text; eestado.Text:=dm.TClientesEstado.Text; ecep.Text:=dm.TClientesCep.Text; etelefone.Text:=dm.TClientesTelefone.Text; //informando ao usurio mensagens.Caption:='Rotina de navegao de registros'; end; procedure TFclientes.ultimoClick(Sender: TObject); begin //definicao da acao acao:=2; // localizao do ultimo registro dm.TClientes.Last; //transferencia dos dados da tabela para o formulario
gondraf@hotmail.com
Pgina 59 de 272
ecodigo.Text:=dm.TClientesCodigo.Text; etipo.ItemIndex:=dm.TClientesTipo.Value; ebairro.Text:=dm.TClientesBairro.Text; ecpf_cnpj.Text:=dm.TClientesCpf_cnpj.Text; ecliente.Text:=dm.TClientesCliente.Text; erg_insestadual.Text:=dm.TClientesRg_insestaudal.Text; elogradouro.Text:=dm.TClientesLogradouro.Text; ecomplemento.Text:=dm.TClientesComplemento.Text; enumero.Text:=dm.TClientesNumero.Text; ecidade.Text:=dm.TClientesCidade.Text; eestado.Text:=dm.TClientesEstado.Text; ecep.Text:=dm.TClientesCep.Text; etelefone.Text:=dm.TClientesTelefone.Text; //informando ao usurio mensagens.Caption:='Rotina de navegao de registros'; end; procedure TFclientes.salvarClick(Sender: TObject); begin //informando ao usurio mensagens.Caption:='Rotina de gravao de registros'; //critica de permisso if ecodigo.Text='' then showmessage('Codigo no informado ou inexistente!') else begin if acao=1 then dm.TClientes.Append; // cria um registro em branco dm.TClientes.Edit; // coloca a tabela em modo de edio, alterao // transfere dados do formulario para a tabela dm.TClientesCodigo.Text:=ecodigo.Text; dm.TClientesTipo.Value:=etipo.ItemIndex; dm.TClientesBairro.Text:=ebairro.Text; dm.TClientesCpf_cnpj.Text:=ecpf_cnpj.Text; dm.TClientesCliente.Text:=ecliente.Text; dm.TClientesRg_insestaudal.Text:=erg_insestadual.Text; dm.TClientesLogradouro.Text:=elogradouro.Text; dm.TClientesComplemento.Text:=ecomplemento.Text; dm.TClientesNumero.Text:=enumero.Text; dm.TClientesCidade.Text:=ecidade.Text; dm.TClientesEstado.Text:=eestado.Text; dm.TClientesCep.Text:=ecep.Text; dm.TClientesTelefone.Text:=etelefone.Text; // grava dados dm.TClientes.Post; // mensagem ao usuario showmessage('Registro salvo!'); end; //desabilitao dos botes salvar.Enabled:=false; excluir.Enabled:=false; // limpeza dos campos ecodigo.Text:=''; etipo.ItemIndex:=-1; ebairro.Text:=''; ecpf_cnpj.Text:=''; ecliente.Text:=''; erg_insestadual.Text:=''; elogradouro.Text:='';
gondraf@hotmail.com
Pgina 60 de 272
ecomplemento.Text:=''; enumero.Text:=''; ecidade.Text:=''; eestado.Text:=''; ecep.Text:=''; etelefone.Text:=''; //inicializao da acao acao:=0; end; procedure TFclientes.excluirClick(Sender: TObject); begin //informando ao usurio mensagens.Caption:='Rotina de excluso de registros'; //informao ao usuario showmessage('Registro excludo'); // excluso do registro dm.TClientes.Delete; //desabilitao dos botes salvar.Enabled:=false; excluir.Enabled:=false; // limpeza dos campos ecodigo.Text:=''; etipo.ItemIndex:=-1; ebairro.Text:=''; ecpf_cnpj.Text:=''; ecliente.Text:=''; erg_insestadual.Text:=''; elogradouro.Text:=''; ecomplemento.Text:=''; enumero.Text:=''; ecidade.Text:=''; eestado.Text:=''; ecep.Text:=''; etelefone.Text:=''; //inicializao da acao acao:=0; end; procedure TFclientes.ecodigoExit(Sender: TObject); begin if ecodigo.Text<>'' then begin // vericando se alguma acao foi definida case acao of 0:begin //informando ao usuario showmessage('Nenhuma acao foi definida'); mensagens.Caption:='Defina uma ao'; end; 1:begin //verificando se o registro j existe dm.TClientes.Locate('codigo',ecodigo.Text,[locaseinsensitive]); if ecodigo.Text=dm.TClientesCodigo.Text then begin // informando ao usuario showmessage('Registro j existe'); // mostranddo os dados ecodigo.Text:=dm.TClientesCodigo.Text;
gondraf@hotmail.com
Pgina 61 de 272
etipo.ItemIndex:=dm.TClientesTipo.Value; ebairro.Text:=dm.TClientesBairro.Text; ecpf_cnpj.Text:=dm.TClientesCpf_cnpj.Text; ecliente.Text:=dm.TClientesCliente.Text; erg_insestadual.Text:=dm.TClientesRg_insestaudal.Text; elogradouro.Text:=dm.TClientesLogradouro.Text; ecomplemento.Text:=dm.TClientesComplemento.Text; enumero.Text:=dm.TClientesNumero.Text; ecidade.Text:=dm.TClientesCidade.Text; eestado.Text:=dm.TClientesEstado.Text; ecep.Text:=dm.TClientesCep.Text; etelefone.Text:=dm.TClientesTelefone.Text; //redefinindo acao acao:=2; mensagens.Caption:='Ao redefinda para navegao'; //redefinio dos botes salvar.Enabled:=false; excluir.Enabled:=true; end else begin //redefinio dos botes salvar.Enabled:=true; excluir.Enabled:=false; end; end; 2:begin //verificando se o registro j existe dm.TClientes.Locate('codigo',ecodigo.Text,[locaseinsensitive]); if ecodigo.Text=dm.TClientesCodigo.Text then begin // mostrando os dados ecodigo.Text:=dm.TClientesCodigo.Text; etipo.ItemIndex:=dm.TClientesTipo.Value; ebairro.Text:=dm.TClientesBairro.Text; ecpf_cnpj.Text:=dm.TClientesCpf_cnpj.Text; ecliente.Text:=dm.TClientesCliente.Text; erg_insestadual.Text:=dm.TClientesRg_insestaudal.Text; elogradouro.Text:=dm.TClientesLogradouro.Text; ecomplemento.Text:=dm.TClientesComplemento.Text; enumero.Text:=dm.TClientesNumero.Text; ecidade.Text:=dm.TClientesCidade.Text; eestado.Text:=dm.TClientesEstado.Text; ecep.Text:=dm.TClientesCep.Text; etelefone.Text:=dm.TClientesTelefone.Text; //redefinio dos botes salvar.Enabled:=true; excluir.Enabled:=true; end else begin // informando ao usuario showmessage('Registro no existe'); //redefinio dos botes salvar.Enabled:=false; excluir.Enabled:=false; end; end; end;
gondraf@hotmail.com
Pgina 62 de 272
end; if ecodigo.Text='' then begin // redefinindo acao acao:=0; mensagens.Caption:='Defina uma ao'; //redefinio dos botes salvar.Enabled:=false; excluir.Enabled:=false; end; end; procedure TFclientes.etipoClick(Sender: TObject); begin case etipo.ItemIndex of -1:begin label1.Visible:=false; ecpf_cnpj.Visible:=false; erg_insestadual.Visible:=false; end; 0:begin label1.Caption:='C.P.F.:'; label1.Visible:=true; ecpf_cnpj.EditMask:='999.999.999-99;0'; ecpf_cnpj.Visible:=true; erg_insestadual.EditLabel.Caption:='R.G.:'; erg_insestadual.Visible:=true; end; 1:begin label1.Caption:='C.N.P.J.:'; label1.Visible:=true; ecpf_cnpj.EditMask:='99.999.999/9999-99;0'; ecpf_cnpj.Visible:=true; erg_insestadual.EditLabel.Caption:='I.Est.:'; erg_insestadual.Visible:=true; end; end; end; procedure TFclientes.fecharClick(Sender: TObject); begin //fechamento da tabela dm.TClientes.Close; // fechamento do formulrio fclientes.Close; end; procedure TFclientes.localizarClick(Sender: TObject); begin panel1.Enabled:=true; elocaliza.ItemIndex:=0; ebuscar.EditMask:=''; ebuscar.Text:=''; end; procedure TFclientes.elocalizaClick(Sender: TObject); begin case elocaliza.ItemIndex of 0:begin
gondraf@hotmail.com
Pgina 63 de 272
// ajustando a chave de ndices dm.TClientes.IndexName:='idcliente'; dm.TClientes.SetKey; dm.TClientes.First; //configurando campo de busca ebuscar.EditMask:=''; ebuscar.Text:=''; ebuscar.Width:=ecliente.Width; end; 1:begin // ajustando a chave de ndices dm.TClientes.IndexName:=''; dm.TClientes.SetKey; dm.TClientes.First; //configurando campo de busca ebuscar.EditMask:='9999999;0'; ebuscar.Text:=''; ebuscar.Width:=ecodigo.Width; end; 2:begin // ajustando a chave de ndices dm.TClientes.IndexName:=''; dm.TClientes.SetKey; dm.TClientes.First; //configurando campo de busca ebuscar.EditMask:='999.999.999-99;0'; ebuscar.Text:=''; ebuscar.Width:=ecpf_cnpj.Width; end; 3:begin // ajustando a chave de ndices dm.TClientes.IndexName:=''; dm.TClientes.SetKey; dm.TClientes.First; //configurando campo de busca ebuscar.EditMask:='99.999.999/9999-99;0'; ebuscar.Text:=''; ebuscar.Width:=ecpf_cnpj.Width; end; end; end; procedure TFclientes.BitBtn1Click(Sender: TObject); begin case elocaliza.ItemIndex of 0:dm.TClientes.FindNearest([ebuscar.Text]); 1:dm.TClientes.FindNearest([strtoint(ebuscar.Text)]); 2,3:dm.TClientes.Locate('CPF_CNPJ',ebuscar.Text,[locaseinsensitive]); end; end; procedure TFclientes.DBGrid1DblClick(Sender: TObject); begin // mostrando os dados ecodigo.Text:=dm.TClientesCodigo.Text; etipo.ItemIndex:=dm.TClientesTipo.Value; ebairro.Text:=dm.TClientesBairro.Text; ecpf_cnpj.Text:=dm.TClientesCpf_cnpj.Text; ecliente.Text:=dm.TClientesCliente.Text;
gondraf@hotmail.com
Pgina 64 de 272
erg_insestadual.Text:=dm.TClientesRg_insestaudal.Text; elogradouro.Text:=dm.TClientesLogradouro.Text; ecomplemento.Text:=dm.TClientesComplemento.Text; enumero.Text:=dm.TClientesNumero.Text; ecidade.Text:=dm.TClientesCidade.Text; eestado.Text:=dm.TClientesEstado.Text; ecep.Text:=dm.TClientesCep.Text; etelefone.Text:=dm.TClientesTelefone.Text; //redefinio dos botes salvar.Enabled:=true; excluir.Enabled:=true; //redefinindo a ao acao:=2; end; Comentrios:
Exerccio 08 Crie um cadastro de produtos e um cadastro de fornecedores. Capitulo XIV Respondendo a mensagens Observe os comportamentos dos botes salvar e excluir na prtica 18, uma vez pressionados o usurio perde o controle sobre a ao, isto , no existe um pedido de confirmao, o registro ser salvo ou excludo. As mensagens so funes especiais definidas pelo delphi onde o desenvolvedor passa informaes de advertncia, erro ou instrues ao usurio. As instrues podem ser classificadas em: Mensagens simples ou avisos; e Mensagens de dilogo. As mensagens simples ou avisos, so geralmente utilizadas para passar informaes ao usurios onde no se necessitem de confirmao para executar ou cancelar um processamento. As mensagens de dilogos, so aquelas que necessitam da confirmao do usurio para execuo ou cancelamento de um processo.
gondraf@hotmail.com
Pgina 65 de 272
Mensagens simples ou avisos: Comando: ShowMessage(dado string); Mensagens de dilogo: Comandos: MessageDlg; e MessageDlgPos. MessageDlg: Exibe uma caixa de dilogo no centro de tela. Utilize MessageDlg para expor uma caixa de mensagem e obter a resposta do usurio. Sintaxe:
MessageDlg(Msg: String; DlgType: TMsgDlgType; Botes: TMsgDlgButtons; HelpCtx: Longint);
Descrio: Varivel Msg DlgType Botes HelpCtx Tipo String TMsgDlgType TMsgDlgButtons Longint Descrio o contedo da mensagem indica o propsito do dilogo indicam que botes devem aparecer na caixa de mensagem especifica o contexto ID para o tpico de ajuda que dever aparecer quando o usurio clica o boto de ajuda ou aperta F1 enquanto o dilogo exibido
MessageDlg: Devolve o valor do boto que o usurio selecionou. A tabela seguinte lista os valores de TMsgDlgBtn por cada tipo de boto que pode aparecer na caixa de mensagem, e o valor correspondente que devolvido se o usurio seleciona aquele boto: Boto pressionado mbOk mbCancel mbYes mbNo mbAbort mbRetry mbIgnore Resposta mrOk mrCancel mrYes mrNo mrAbort mrRetry mrIgnore
gondraf@hotmail.com
Pgina 66 de 272
Evento OnClick
Procedimento RadioGroup1Click
Procedimentos: procedure TForm1.RadioGroup1Click(Sender: TObject); begin case radiogroup1.ItemIndex of 0:messagedlg('Voc deve informar todos os dados!',mtinformation,[mbyes,mbno],0); 1:messagedlg('Cuidado! risco de perder os dados.',mtwarning,[mbyes,mbno],0); 2:messagedlg('No posso salvar os dados!',mterror,[mbretry,mbcancel],0); 3:messagedlg('Confirma excluso dos dados!',mtconfirmation,[mbyes,mbno],0); end; end; Comentrios:
Valor
Pratica 20 Excluir
Evento
Procedimento
procedure TForm1.BitBtn1Click(Sender: TObject); begin if messagedlg('Confirma excluso?',mtconfirmation,[mbyes,mbno],0)=mryes then showmessage('Excluso confirmada!') else showmessage('Excluso cancelada!'); end; Comentrios:
gondraf@hotmail.com
Pgina 67 de 272
Valor
Pratica 21 Aplicar Indique a coluna da mensagem Indique a linha da mensagem
Evento Click
Procedimento BitBtn1Click
end; Comentrios:
Exerccio 09 Na prtica 18, inclua na rotina de excluso uma mensagem de confirmao para deciso do usurio. Capitulo XV Rotinas especiais (Procedures e Funes) Observe a prtica 18, note que existem rotinas que se repetem vrias vezes durante a confeco da pgina de cdigo: // limpeza dos campos // transferencia dos dados da tabela para o formulrio // mostrando os dados Observe agora o procedimento elocalizarclick, note que os comandos utilizados para ajustar a chave e ndices e configurar os campos de busca so comuns para cada uma das opes case, mudando-se apenas o seu valor. Como sabemos os procedimentos ocorridos na linguagem orientada a objetos so independentes, portanto uma nica rotina escrita poder ser utilizada por diversos objetos e por diversas vezes, quando este procedimento realizar um clculo qualquer (lgico ou aritmtico) e devolver algum valor ao objeto que o disparou teremos uma funo, porm se nenhum valor for devolvido a este objeto teremos uma procedure.
gondraf@hotmail.com
Pgina 68 de 272
Para criar a procedure limparcampos, precisamos reservar um espao na memria para sua colocao, assim utilizaremos a clusula Var para sua declarao, a clusula implementation para sua descrio. Abra a pratica 18 e nela o formulrio FClientes, para criar o procedimento limparcampos proceda a seguinte descrio. Na clusula Var inclua: procedure limparcampos(); var Fclientes: TFclientes; procedure Limparcampos(); Na clusula implementation inclua: procedure limparcampos() e digite seu contedo. procedure limparcampos(); begin with fclientes do begin ecodigo.Text:=''; etipo.ItemIndex:=-1; ebairro.Text:=''; ecpf_cnpj.Text:=''; ecliente.Text:=''; erg_insestadual.Text:=''; elogradouro.Text:=''; ecomplemento.Text:=''; enumero.Text:=''; ecidade.Text:=''; eestado.Text:=''; ecep.Text:=''; etelefone.Text:=''; end; end; Agora que a procedure j foi criada s cham-la, para isso localize o comentrio \\ limpeza dos campos, nos procedimentos da unit de fclientes, substitua as linhas que executam a limpeza por limparcampos();, conforme descrio.
gondraf@hotmail.com
Pgina 69 de 272
Localize // limpeza dos campos ecodigo.Text:=''; etipo.ItemIndex:=-1; ebairro.Text:=''; ecpf_cnpj.Text:=''; ecliente.Text:=''; erg_insestadual.Text:=''; elogradouro.Text:=''; ecomplemento.Text:=''; enumero.Text:=''; ecidade.Text:=''; eestado.Text:=''; ecep.Text:=''; etelefone.Text:='';
Nos Procedimentos
Limparcampos();
As rotinas // transferencia dos dados da tabela para o formulrio e // mostrando os dados, fazem a mesma coisa, portanto podem ser substitudas por uma procedure que denominaremos de procedure mostrardados(), Na clusula Var inclua: procedure mostrardados(); var Fclientes: TFclientes; procedure Limparcampos(); procedure Mostrardados(); Na clusula implementation inclua: procedure mostrardados() e digite seu contedo. procedure Mostrardados(); begin with fclientes do begin ecodigo.Text:=dm.TClientesCodigo.Text; etipo.ItemIndex:=dm.TClientesTipo.Value; ebairro.Text:=dm.TClientesBairro.Text; ecpf_cnpj.Text:=dm.TClientesCpf_cnpj.Text; ecliente.Text:=dm.TClientesCliente.Text; erg_insestadual.Text:=dm.TClientesRg_insestaudal.Text; elogradouro.Text:=dm.TClientesLogradouro.Text; ecomplemento.Text:=dm.TClientesComplemento.Text; enumero.Text:=dm.TClientesNumero.Text; ecidade.Text:=dm.TClientesCidade.Text; eestado.Text:=dm.TClientesEstado.Text; ecep.Text:=dm.TClientesCep.Text; etelefone.Text:=dm.TClientesTelefone.Text; end; end;
gondraf@hotmail.com
Pgina 70 de 272
Agora substitua as linhas que mostram os dados por mostrardados();, conforme descrio. Localize // mostrando os dados ou // transferencia dos dados da tabela para o formulrio codigo.Text:=dm.TClientesCodigo.Text; etipo.ItemIndex:=dm.TClientesTipo.Value; ebairro.Text:=dm.TClientesBairro.Text; ecpf_cnpj.Text:=dm.TClientesCpf_cnpj.Text; ecliente.Text:=dm.TClientesCliente.Text;
erg_insestadual.Text:=dm.TClientesRg_insestaudal.Text;
Substitua por
Nos procedimentos
mostrardados()
Depois que montamos algumas procedures e substitumos no nosso projeto observamos que um grande nmero de linhas foram suprimidos, porm ainda h mais por fazer. Observe o evento elocalizaClick, note que para cada valor do item.index os objetos que sofrem alteraes so os mesmos, apenas os valores atribudos se alteram, este tipo de comportamento sugere que de acordo com o item escolhido devemos informar seu valor. Criaremos ento uma funo onde passaremos os objetos que sofrero alteraes e seus valores e a denominaremos de funo ajustabusca.
function ajustabusca(tabela:TTable;editmascara:TMaskedit;indice,mascara,texto:string;campo:tlabelededit):boolean;
Nesta funo so criadas algumas variveis representando objetos do formulrio e outras representando os possveis valores que eles possam assumir: Varivel Tabela Editmascara ndice Mascara Texto Campo Tipo TTable TMaskEdit String String String TLabeledEit Valor Assume o valor de uma Table Assume o valor de um MaskEdit Guarda um valor string Guarda um valor string Guarda um valor string Assume o valor de um Labelededit
Obs: Os nomes atribudos as variveis de uma funo no so convencionados, cabe ao programador usar a nomeclatura que melhor lhe convir. Como estamos utilizando uma varivel tipo TTable teremos que acrescer a biblioteca DBTables na clusula uses da unit do formulrio de clientes. uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, Mask, Grids, DBGrids, StdCtrls, ExtCtrls, ToolWin, ImgList, Buttons, udm, db, DBTables; Agora na clusula var acrescemos a declarao da funo:
gondraf@hotmail.com
Pgina 71 de 272
begin tabela.IndexName:=indice; tabela.SetKey; tabela.First; editmascara.EditMask:=mascara; editmascara.Text:=''; editmascara.Width:=campo.Width; result:=true; end; Uma vez descrita a funo, vamos aplicar ao evento elocalizaClick: procedure TFclientes.elocalizaClick(Sender: TObject); begin case elocaliza.ItemIndex of 0:ajustabusca(dm.TClientes,ebuscar,'idcliente','','',ecliente); 1:ajustabusca(dm.TClientes,ebuscar,'','9999999;0','',ecodigo); 2:ajustabusca(dm.TClientes,ebuscar,'','999.999.999-99;0','',erg_insestadual); 3:ajustabusca(dm.TClientes,ebuscar,'','99.999.999/9999-99;0','',erg_insestadual); end; end; Comentrios:
Capitulo XVI Localizando dados em uma tabela De nada adianta incluir dados em uma tabela se no tiver um meio de localizar o que foi includo. Para isso alguns mtodos foram incorporados ao delphi: Uso de coringa Uso de parmetro No No No No Sim No No Uso de Chave
Mtodo
Caractersticas
No No No No No No No
Localiza um nico registro com exatido Localiza o registro que mais se assemelha Localiza um nico registro com exatido Localiza o registro que mais se assemelha Localiza um registro com base em um dado ou parte deste Localiza um registro com base no nmero de registro ou informa o nmero do registro atual Localiza o primeiro registro da tabela
gondraf@hotmail.com
Pgina 72 de 272
Localiza o registro anterior ao atual Localiza o registro seguinte ao atual Localiza o ltimo registro da tabela Habilita/desabilita o uso de filtros Separa um grupo de registros segundo uma condio
Prtica 22 Localizando registros (mtodos GotoKey, GotoNearest, FindKey, FindNearest) Abra a pratica 18 e inclua 10 registros no cadastro de clientes, em seguida feche a pratica e inicie uma nova aplicao. Formulrio:
Propriedade Caption Caption Items Caption Name Caption Name EditLabel.Caption LabelPosition EditLabel.Caption LabelPosition Caption Caption
Valor
Pratica 22 Mtodo GotoKey GotoNearest FindKey FinNearest Mtodo GotoKey ou FindKey GB1 Mtodo GotoNearest ou FindNearest GB2 Cdigo: Lpleft Cliente: Lpleft Localizar Localizar
GroupBox1
OnClick OnClick
BitBtn1Click BitBtn2Click
gondraf@hotmail.com
Pgina 73 de 272
Table1 DataSource1 Label1 Label2 Label3 Label4 Label5 Label6 Label7 Label8 Label9 Label10 Label11 Label12 DbGrid1 DBEdit1 DBEdit2 DBEdit3 DBEdit4 DBEdit5 DBEdit6 DBEdit7 DBEdit8 DBEdit9 DBEdit10 DBEdit11 DBEdit12
DataSource1 DataSource1 Cdigo DataSource1 Cliente DataSource1 Cpf_cnpj DataSource1 Rg_inestadual DataSource1 Logradouro DataSource1 Numero DataSource1 Complemento DataSource1 Bairro DataSource1 Cidade DataSource1 Estado DataSource1 Cep DataSource1 Telefone Nome Vergroupbox
function vergroupbox(bg1,bg2:TGroupBox;ver1,ver2:boolean):boolean; begin bg1.Visible:=ver1; bg2.Visible:=ver2; result:=true; end; procedure TForm1.FormActivate(Sender: TObject); begin vergroupbox(gb1,gb2,false,false);
gondraf@hotmail.com
Pgina 74 de 272
tclientes.Open; radiogroup1.ItemIndex:=-1; end; procedure TForm1.RadioGroup1Click(Sender: TObject); begin if (radiogroup1.ItemIndex=0) or (radiogroup1.ItemIndex=2) then vergroupbox(gb1,gb2,true,false) else vergroupbox(gb1,gb2,false,true); end; procedure TForm1.BitBtn1Click(Sender: TObject); begin tclientes.IndexName:=''; tclientes.SetKey; if radiogroup1.ItemIndex=0 then begin tclientescodigo.Text:=labelededit1.Text; tclientes.GotoKey; end else tclientes.FindKey([labelededit1.Text]); end; procedure TForm1.BitBtn2Click(Sender: TObject); begin tclientes.IndexName:='idcliente'; tclientes.SetKey; if radiogroup1.ItemIndex=0 then begin tclientescodigo.Text:=labelededit2.Text; tclientes.GotoNearest; end else tclientes.FindNearest([labelededit2.Text]); end; Comentrios:
gondraf@hotmail.com
Pgina 75 de 272
Objeto Form1 GroupBox1 LabeledEdit1 BitBtn1 Table1 DataSource1 Label1 Label2 Label3 Label4 Label5 Label6 Label7 Label8 Label9 Label10 Label11 Label12 Label13 DbGrid1
Propriedade Caption Caption Name EditLabel.Caption LabelPosition Caption Name DataBaseName TableName DataSet Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Name Font.size Font.style DataSource
Valor
Pratica 23 Mtodo RecN GB1 Registro: Lpleft Localizar TClientes Dados Clientes.DB TClientes Cdigo Cliente Cpf / cnpj Rg /I.Estaudal Logradouro Nmero Complemento Bairro Cidade Estado Cep Telefone Registro n:
Evento OnActivate
Procedimento Form1Activate
OnClick
BitBtn1Click
gondraf@hotmail.com
Pgina 76 de 272
DBEdit1 DBEdit2 DBEdit3 DBEdit4 DBEdit5 DBEdit6 DBEdit7 DBEdit8 DBEdit9 DBEdit10 DBEdit11 DBEdit12 Procedimentos:
procedure TForm1.FormActivate(Sender: TObject); begin tclientes.Open; registros.Caption:='Registro n:'+inttostr(tclientes.RecNo); gb1.Visible:=false; end; procedure TForm1.BitBtn1Click(Sender: TObject); begin tclientes.RecNo:=strtoint(labelededit1.Text); registros.Caption:='Registro n:'+inttostr(tclientes.RecNo); gb1.Visible:=false; end; procedure TForm1.Button1Click(Sender: TObject); begin gb1.Visible:=false; tclientes.First; registros.Caption:='Registro n:'+inttostr(tclientes.RecNo); end; procedure TForm1.Button2Click(Sender: TObject); begin gb1.Visible:=false; tclientes.Prior; registros.Caption:='Registro n:'+inttostr(tclientes.RecNo); end; procedure TForm1.Button3Click(Sender: TObject); begin gb1.Visible:=false;
gondraf@hotmail.com
Pgina 77 de 272
tclientes.Next; registros.Caption:='Registro n:'+inttostr(tclientes.RecNo); end; procedure TForm1.Button4Click(Sender: TObject); begin gb1.Visible:=false; tclientes.Last; registros.Caption:='Registro n:'+inttostr(tclientes.RecNo); end; procedure TForm1.Button5Click(Sender: TObject); begin gb1.Visible:=true; end; Comentrios:
Valor
Pratica 24 Mtodo Locate GB1 Valor:: Lpleft
Evento OnActivate
Procedimento Form1Activate
gondraf@hotmail.com
Pgina 78 de 272
OnClick
BitBtn1Click
RadioGroup2 Label1 Label2 Label3 Label4 Label5 Label6 Label7 Label8 Label9 Label10 Label11 Label12 DbGrid1 DBEdit1 DBEdit2 DBEdit3 DBEdit4 DBEdit5 DBEdit6 DBEdit7 DBEdit8 DBEdit9 DBEdit10 DBEdit11 DBEdit12
Cdigo Cliente Cpf / cnpj Rg /I.Estaudal Logradouro Nmero Complemento Bairro Cidade Estado Cep Telefone
DataSource1 DataSource1 Cdigo DataSource1 Cliente DataSource1 Cpf_cnpj DataSource1 Rg_inestadual DataSource1 Logradouro DataSource1 Numero DataSource1 Complemento DataSource1 Bairro DataSource1 Cidade DataSource1 Estado DataSource1 Cep DataSource1 Telefone
gondraf@hotmail.com
Pgina 79 de 272
begin tclientes.Open; radiogroup1.ItemIndex:=-1; radiogroup2.ItemIndex:=-1; end; procedure TForm1.BitBtn1Click(Sender: TObject); begin case radiogroup1.ItemIndex of 0:begin if radiogroup2.ItemIndex=0 then tclientes.Locate('codigo',labelededit1.Text,[locaseinsensitive]) else tclientes.Locate('codigo',labelededit1.Text,[lopartialKey]); end; 1:begin if radiogroup2.ItemIndex=0 then tclientes.Locate('cliente',labelededit1.Text,[locaseinsensitive]) else tclientes.Locate('cliente',labelededit1.Text,[lopartialKey]); end; 2:begin if radiogroup2.ItemIndex=0 then tclientes.Locate('cpf_cnpj',labelededit1.Text,[locaseinsensitive]) else tclientes.Locate('cpf_cnpj',labelededit1.Text,[lopartialKey]); end; 3:begin if radiogroup2.ItemIndex=0 then tclientes.Locate('rg_inestaudal',labelededit1.Text,[locaseinsensitive]) else tclientes.Locate('rg_inestaudal',labelededit1.Text,[lopartialKey]); end; end; end; Comentrios:
gondraf@hotmail.com
Pgina 80 de 272
Objeto Form1 GroupBox1 LabeledEdit1 BitBtn1 Table1 DataSource1 Label1 Label2 Label3 Label4 Label5 Label6 Label7 Label8 Label9 Label10 Label11 Label12 DbGrid1 DBEdit1 DBEdit2
Propriedade Caption Caption Name EditLabel.Caption LabelPosition Caption Name DataBaseName TableName DataSet Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption DataSource DataSource DataField DataSource DataField
Valor
Pratica 25 Mtodo Filter GB1 Epresso: Lpleft Localizar TClientes Dados Clientes.DB TClientes Cdigo Cliente Cpf / cnpj Rg /I.Estaudal Logradouro Nmero Complemento Bairro Cidade Estado Cep Telefone
Evento
Procedimento
OnClick
BitBtn1Click
gondraf@hotmail.com
Pgina 81 de 272
DBEdit3 DBEdit4 DBEdit5 DBEdit6 DBEdit7 DBEdit8 DBEdit9 DBEdit10 DBEdit11 DBEdit12 Procedimentos:
procedure TForm1.BitBtn1Click(Sender: TObject); begin tclientes.Close; tclientes.Filtered:=false; tclientes.Filter:=labelededit1.Text; tclientes.Filtered:=true; tclientes.Open; end; Comentrios:
Exerccio 10 Crie consultas para o seu projeto Agora que vimos algumas prticas de consultar dados de uma tabela, inclua no menu de consultas do projeto Pratica 18.
gondraf@hotmail.com
Pgina 82 de 272
Capitulo XVII Relacionando tabelas A relao entre tabelas consiste basicamente na interligao entre os campos das tabelas a se relacionar, pode ser sincrnica, quando os campos relacionais das duas tabelas sofrem alteraes simultaneamente, ou no sincrnica quando apenas o campo de uma das tabelas sofre alterao.
Existem objetos capazes de criar relaes entre tabelas, porm estes objetos exigem que os campos sejam do mesmo tipo. Existe tambm uma Linguagem EStruturada de Questes (Consultas), definida e conhecida como SQL, baseada nas estruturas das tabelas e capazes de gerar relacionamentos entre elas. Alm dos objetos e do SQL, as relaes tambm podem ser feitas atravs de mtodos, procedimentos ou funes capazes de associarem campos de tabelas diferentes. Para entendermos os relacionamentos entre tabelas vamos criar 03 tabelas e salva-las no alias dados. Tabela de materiais:
gondraf@hotmail.com
Pgina 83 de 272
Tabela de Vendas:
Tabela de itens
gondraf@hotmail.com
Pgina 84 de 272
Prtica 26 Relacionamento I Anexe a unit dm.pas a esta pratica e inclua os seguintes objetos: Objeto Table1 Table2 Table3 DataSource1 DataSource2 DataSource3 Formulrio: Name TMateriais TVendas TItens DSMateriais DSVendas DSItens DataBaseName Dados Dados Dados TableName Materiais.db Vendas.db Itens.db Dataset
StaticText1
Propriedade Caption Height Width Height Width Height Width Height Width Caption Align Alignment Color Font.size Font.color
Valor
Pratica 26 200 400 200 400 200 400 200 400 Clientes AlTop AlCenter clBlue 12 clWhite
Evento OnActivate
Procedimento Form1Activate
gondraf@hotmail.com
Pgina 85 de 272
StaticText2
StaticText3
StaticText4
Label1 Label2 Label3 Label4 Label5 Label6 DBEdit1 DBEdit2 DBEdit3 DBEdit4 DBEdit5 DBEdit6 DBGrid1 DBGrid2 DBGrid2
DSMateriais
Cdigo
DSMateriais
Classe
DSMateriais
Produto
DSMateriais
Preo de custo
DSMateriais
Preo de venda
DSMateriais
Saldo DSClientes DSVendas DSItens
Inclua a biblioteca DB na clasula USES Procedimentos: procedure TForm1.DBGrid1DblClick(Sender: TObject); var filtro:string; begin filtro:='Cliente='+dm.TClientesCodigo.Text; dm.TVendas.Close; dm.TVendas.Filtered:=false; dm.TVendas.Filter:=filtro; dm.TVendas.Filtered:=true; dm.TVendas.Open; end; procedure TForm1.DBGrid3DblClick(Sender: TObject); var filtro1:string;
gondraf@hotmail.com
Pgina 86 de 272
begin filtro1:='Cupom='+dm.TVendasCupom.Text; dm.TItens.Close; dm.TItens.Filtered:=false; dm.TItens.Filter:=filtro1; dm.TItens.Filtered:=true; dm.TItens.Open; end; procedure TForm1.DBGrid4DblClick(Sender: TObject); begin dm.TMateriais.Locate('codigo',dm.TItensMaterial.Text,[locaseinsensitive]); end; Comentrios:
Objeto Form1 Bitbtn1 Bitbtn2 Bitbtn3 Label1 Label2 Label3 Label4 Label4 LabeledEdit1 LabeledEdit1 LabeledEdit2 LabeledEdit2 LabeledEdit3 LabeledEdit3
Propriedade Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Name Caption Name Caption Name
Valor
Pratica 27 Adicionar Salvar Novo Cliente Material Itens Vendas Material Quantidade N do cupom Cupom Total do cupom Totalcupom Preo de venda Pvenda
gondraf@hotmail.com
Pgina 87 de 272
LabeledEdit4 LabeledEdit4 DBLookupComboBox1 DBLookupComboBox1 DBLookupComboBox1 DBLookupComboBox2 DBLookupComboBox2 DBLookupComboBox2 DBGrid1 DBGrid2 GroupBox1 ListBox1 ListBox2 Procedimentos:
procedure TForm1.FormActivate(Sender: TObject); begin dm.TMateriais.Open; dm.TVendas.Open; dm.TItens.Open; dm.TClientes.Open; end; procedure TForm1.BitBtn3Click(Sender: TObject); var proximo:integer; begin dm.TVendas.Last; proximo:=dm.TVendas.RecNo+1; cupom.Text:=inttostr(proximo); lb1.Clear; lb2.Clear; end; procedure TForm1.DBLookupComboBox1Click(Sender: TObject); begin pvenda.Text:=dm.TMateriaisPreodeVenda.Text; end; procedure TForm1.BitBtn1Click(Sender: TObject); var stotal:real; begin if totalcupom.Text='' then totalcupom.Text:='0'; if quantidade.Text='' then quantidade.Text:='0'; stotal:=strtofloat(quantidade.Text)*strtofloat(pvenda.Text); totalcupom.Text:=floattostr(stotal+strtofloat(totalcupom.Text)); lb1.Items.Add(dm.TMateriaisCodigo.Text); lb2.Items.Add(quantidade.Text); end; procedure TForm1.BitBtn2Click(Sender: TObject); var i:integer; begin for i:=0 to lb1.Count-1 do begin dm.TItens.Append; dm.TItens.Edit; dm.TItensCupom.Text:=cupom.Text;
gondraf@hotmail.com
Pgina 88 de 272
dm.TItensMaterial.Text:=lb1.Items.Strings[i]; dm.TItensQuantidade.Text:=lb2.Items.Strings[i]; dm.TItens.Post; end; dm.TVendas.Append; dm.TVendas.Edit; dm.TVendasCupom.Text:=cupom.Text; dm.TVendasCliente.Text:=dm.TClientesCodigo.Text; dm.TVendasData.AsDateTime:=date; dm.TVendasValor.Text:=totalcupom.Text; dm.TVendasVencimento.AsDateTime:=date+30; dm.TVendas.Post; end; Comentrios:
Capitulo XVIII O SQL As vezes temos a necessidade de criar tabelas auxiliares para fins de consultas ou impresso, tabelas que tero um tempo de vida curto e que tendem a ser criadas pelo projeto em tempo de execuo e a ser excluda to logo o projeto seja fechado se no forem salvas. Estas tabelas recebem o nome de Query e se originam de Tabelas j existentes, normalmente as query baseiam-se em uma Linguagem Estruturada de Questes, conhecida com SQL, (Structured Query Linguage), que compem-se de comandos simples:
SELECT Seleciona um, algum, ou todos os campos de uma ou algumas tabelas; FROM Especifica as tabelas a serem usadas pelo SELECT; WHERE Especifica uma condio a ser usada na seleo dos campos; ORDER BY Determina a classificao, isto , a ordem em que os campos devem ser mostrados; GROUP BY Cria grupos onde sero organizados os campos; HAVING Determina uma condio para um GROUP BY; UNION Promove a unio de dois ou mais SELECTs promovendo uma nica sada;
A relao entre as querys e o SQL nica, isto , ao se gerar uma query de maneira manual, atravs do DataBase Desktop, automaticamente a esta query ser adicionada um script SQL, o que nos possibilita afirmar que podemos alterar em tempo de execuo toda a forma de uma query, bastando somente para isto alterar os parmetros da SQL. Criando uma query pelo DataBase Desktop Abra o DBD e escolha a opo: File... New... QBE Query...; Selecione o alias Dados e escolha a tabela Clientes.DB; Click em Abrir:
gondraf@hotmail.com
Pgina 89 de 272
Esta pronta a nossa query. Para verificar o resultado execute-a pressionando sobre o boto: Run Query: Para verificar os parmetros da SQL pressione sobre o boto: Show SQL: SELECT DISTINCT Codigo, Tipo, Cliente, Cpf_cnpj, Rg_insestaudal, Logradouro, Numero, Complemento, Bairro, Cidade, Estado, Cep, Telefone FROM ":Dados:Clientes.DB" ORDER BY Codigo, Tipo, Cliente, Cpf_cnpj, Rg_insestaudal, Logradouro, Numero, Complemento, Bairro, Cidade, Estado, Cep, Telefone A clausula DISTINCT opcional e indica que o nome dos campos no se repetem para a tabela indicada pela clausula FROM. Click sobre o boto Run SQL e observe o resultado de nossa query:
Criando uma relao entre duas tabelas atravs do query de modo interativo Novamente entraremos no DBD e criarem uma nova query com base na tabela Clientes.
gondraf@hotmail.com
Pgina 90 de 272
Em seguida click no boto Add Table e escolha no alias curso a tabela Vendas.DB e selecione todos os seus campos:
Agora criaremos uma relao entre estas duas tabelas pressionado o boto join Tables e clicando sobre os campos Codigo de Clientes.DB e logo em seguida no campo Cliente de Vendas.db:
Veremos agora como est a arrumao do nosso SQL, click em Show SQL. SELECT DISTINCT D.Codigo, D.Tipo, D.Cliente, D.Cpf_cnpj, D.Rg_insestaudal, D.Logradouro, D.Numero, D.Complemento, D.Bairro, D.Cidade, D.Estado, D.Cep, D.Telefone, D1.Cupom, D1.Cliente, D1.Data, D1.Valor, D1.Vencimento FROM ":Dados:Clientes.DB" D, ":Dados:Vendas.DB" D1 WHERE (D1.Cliente = D.Codigo) ORDER BY D.Codigo, D.Tipo, D.Cliente, D.Cpf_cnpj, D.Rg_insestaudal, D.Logradouro, D.Numero, D.Complemento, D.Bairro, D.Cidade, D.Estado, D.Cep, D.Telefone, D1.Cupom, D1.Cliente, D1.Data, D1.Valor, D1.Vencimento Observe a presena das letras D e d1 que aparecem antes dos nomes dos campos nas clausulas SELECT, WHERE e ORDER BY e depois dos nomes das tabelas na clausula FROM. Estas letras representam os ALIAS criados pelo SQL para este exemplo.
gondraf@hotmail.com
Pgina 91 de 272
Observe tambm que ao criarmos um JOIN no campo Cliente da tabela Vendas.DB e no campo Codigo da tabela Clientes.DB, criamos uma relao entre elas, esta relao se apresenta no SQL atravs da clausula WHERE. Criando uma relao entre trs tabelas atravs do query de modo interativo Novamente entraremos no DBD e criarem uma nova query com base na tabela Clientes.DB que est armazenada em C:\Curso de delphi ou simplesmente Alias Curso:
Em seguida click no boto Add Table e escolha no alias curso a tabela Vendas.DB e selecione todos os seus campos:
Em seguida click no boto Add Table e escolha a tabela Itens.DB e selecione todos os seus campos:
Agora criaremos uma relao entre estas duas tabelas pressionado o boto join Tables e clicando sobre os campos Codigo de Clientes.DB e logo em seguida no campo Cliente de Vendas.db, novamente pressione o boto Join Tables e selecione os campos Cupom de Vendas.DB e Cupom em Itens.DB:
gondraf@hotmail.com
Pgina 92 de 272
Uma vez criadas as relaes, verifique como ficaram os parmetros do SQL: SELECT DISTINCT D.Codigo, D.Tipo, D.Cliente, D.Cpf_cnpj, D.Rg_insestaudal, D.Logradouro, D.Numero, D.Complemento, D.Bairro, D.Cidade, D.Estado, D.Cep, D.Telefone, D1.Cupom, D1.Cliente, D1.Data, D1.Valor, D1.Vencimento, D2.Ctrl, D2.Cupom, D2.Material, D2.Quantidade FROM ":Dados:Clientes.DB" D, ":Dados:Vendas.DB" D1, ":Dados:Itens.DB" D2 WHERE (D1.Cliente = D.Codigo) AND (D2.Cupom = D1.Cupom) ORDER BY D.Codigo, D.Tipo, D.Cliente, D.Cpf_cnpj, D.Rg_insestaudal, D.Logradouro, D.Numero, D.Complemento, D.Bairro, D.Cidade, D.Estado, D.Cep, D.Telefone, D1.Cupom, D1.Cliente, D1.Data, D1.Valor, D1.Vencimento, D2.Ctrl, D2.Cupom, D2.Material, D2.Quantidade Observe a presena do operador AND na clausula WHERE, pois os joins criados durante a confeco do query esto representados por esta clausula. Prtica 28 Criando o relacionamento entre as tabelas clientes, vendas, itens e materias em tempo de execuo Formulrio:
Evento OnActivate
Procedimento Form1Activate
gondraf@hotmail.com
Pgina 93 de 272
Query1.SQL Strings... SELECT * FROM Clientes A, Vendas B, Itens C, Materiais D WHERE (A.Codigo=B.Cliente) and (B.Cupom=C.Cupom) and (C.Material=D.Codigo) Procedimentos: procedure TForm1.FormActivate(Sender: TObject); begin query1.Open; end; Comentrios:
Objeto Form1 Query1 DataSource1 Table1 DataSource2 Label1 BitBtn1 DBGrid1 DBLookupCombobox1 Procedimentos:
Propriedade Caption DataBaseName DataSet Name DataBaseName TableName DataSet Name Caption Caption DataSource ListSource KeyField ListField
Valor Pratica 29 Dados Query1 DSQuery Dados Clientes Table1 DSTable Cliente Aplicar DSQuery DSTable Cdigo Cliente
Evento OnActivate
Procedimento Form1Activate
OnClick
Bitbtn1Click
gondraf@hotmail.com
Pgina 94 de 272
procedure TForm1.Button1Click(Sender: TObject); begin query1.Open; end; procedure TForm1.BitBtn1Click(Sender: TObject); var condicao:string; begin query1.SQL.Clear; query1.SQL.Add('SELECT *'); query1.SQL.Add('FROM Clientes A, Vendas B, Itens C, Materiais D'); query1.SQL.Add('WHERE (A.Codigo=B.Cliente) and (B.Cupom=C.Cupom) (C.Material=D.Codigo) and (A.cliente='''+table1cliente.Text+''''+')'); query1.Open; end; procedure TForm1.FormActivate(Sender: TObject); begin table1.Open; end; Comentrios:
and
Operadores WHERE Classe Aritmticos Operador + * / = <> > < >= <= AND OR NOT IN BETWEEN e AND EXISTS LIKE IS NULL Operao Adio Subtrao Multiplicao Diviso Igual a Diferente de Maior que Menor que Maior ou igual Menor ou igual Unio Interseco Negao Contido em uma lista Compreendido em uma faixa Cria uma subconsulta baseada na clausula WHERE Permite o uso de mascaras Verifica a presena de campos vazios
Comparao
Lgicos Especiais
gondraf@hotmail.com
Pgina 95 de 272
Exemplos de consultas 01 Consulta materiais com saldo maior que 100 Select material, saldo From materiais Where saldo>100 02 Consulta materiais com saldo maior que 100 e menor que 500 Select material, saldo From materiais Where saldo>100 and saldo<500 03 Consulta materiais e saldo em ordem crescente Select material, saldo From materiais Order by saldo 04 Consulta materiais e saldo em ordem decrescente Select material, saldo From materiais Order by saldo desc 05 Consulta materiais com campo saldo vazio Select material, saldo From materiais Where saldo is null 06 Consulta materiais com campo saldo preenchido Select material, saldo From materiais Where saldo is not null 07 Consulta materiais e saldo cujo material comece com C Select material, saldo From materiais Where material like C % 08 Consulta materiais e saldo cujo material possua a string ANEL Select material, saldo From materiais Where material like %ANEL % 09 Consulta materiais e saldo cujo material termine com NADOR Select material, saldo From materiais Where material like %NADOR
gondraf@hotmail.com
Pgina 96 de 272
10 Consulta clientes que morem em SE e AL Select cliente, estado From clientes Where estado IN (SE, AL) Funes SQL UPPER AVG MIN MAX SUM Exemplos de consultas 01 Maisculas Select Upper(material), saldo From materiais 02 Mdia Select Avg(saldo) From materiais 03 Mnimo Select Min(saldo) From materiais 04 Mximo Select Max(saldo) From materiais 05 Soma Select Sum(saldo) From materiais Funo Retorna a consulta em maiscula Retorna a mdia dos valores armazenados um campo Retorna o menor valor armazenado em um campo Retorna o maior valor armazenado em um campo Retorna a soma dos valores armazenados em um campo
gondraf@hotmail.com
Pgina 97 de 272
Capitulo XIX Trabalhando com mdias O delphi atravs de suas bibliotecas consegue criar interfaces com diversos softwares, dentre estes softwares de interpretao de arquivos AVI, BMP,WMW e MID. Prtica 30 Lendo mdias com uso de objetos O MediaPlayer um objeto que simula o Windows Mdia Player. Crie uma nova aplicao e inclua um novo formulrio ao j existente. Inclua na clausula USES a biblioteca MPlayer e a Unit2. Formulrio:
RadioGroup1
RadioGroup2 Items RadioGroup3 Name Caption Items Name Caption RadioGroup4 Items
Valor Pratica 30 False RGWav Arquivos WAV Telefone Impressora Sim No RGAvi Arquivos AVI Delphi Microsoft Cool RGMid Arquivos MID Msica 1 Msica 2 Msica 3 RGWmw Arquivos WMW WMV 1 WMV 2 WMV 3
Evento
Procedimento
Click
RGWavClick
Click
RGAviClick
Click
RGMdiClick
Click
RGWmwClick
gondraf@hotmail.com
Pgina 98 de 272
Crie a funo: Function ativaplay(som:TMediaPlayer;arquivo:String):boolean; na clausula VAR Procedimentos: Function ativaplay(som:TMediaPlayer;arquivo:String):boolean; begin som.Close; som.FileName:=arquivo; som.Open; som.Play; result:=true; end; procedure TForm1.RGWavClick(Sender: TObject); begin
ativaplay(mediaplayer1,'\Delphi 2005\midias\Wav\'+rgwav.Items.Strings[rgwav.itemindex]+'.WAV');
end; procedure TForm1.RGAviClick(Sender: TObject); begin ativaplay(mediaplayer1,'\Delphi 2005\midias\Avi\'+rgavi.Items.Strings[rgavi.itemindex]+'.AVI'); end; procedure TForm1.RGMidClick(Sender: TObject); begin
ativaplay(mediaplayer1,'\Delphi 2005\midias\Mid\'+rgmid.Items.Strings[rgmid.itemindex]+'.MID');
end; Comentrios:
gondraf@hotmail.com
Pgina 99 de 272
Prtica 31 Tocando sons wave via funo Neste projeto utilizaremos a biblioteca MMSystem, que ser a responsvel pelas funes: SndPlaySound e PlaySound que faro o papel do mediaplayer, no entanto estas funes s conseguem abrir os arquivos WAV. No esquea de incluir a biblioteca MMSystem clausula Uses do projeto: Formulrio:
Objeto Form1
Valor Pratica 31 RGSN Utilizando mtodo SNDPLAYSOUND Telefone Impressora Sim No RGplay Utilizando mtodo PLAYSOUND Telefone Impressora Sim No
Evento Click
Procedimento RGsndClick
Click
RGplayClick
Procedimentos: procedure TForm1.RGSNDClick(Sender: TObject); var arquivo:Pchar; begin arquivo:=PChar('\Delphi 2005\midias\Wav\'+rgsnd.Items.Strings[rgsnd.itemindex]+'.WAV'); SndPlaySound(arquivo,SND_ASYNC); end; procedure TForm1.RGPlayClick(Sender: TObject); var arquivo:Pchar; begin arquivo:=PChar('\Delphi 2005\midias\Wav\'+rgplay.Items.Strings[rgplay.itemindex]+'.WAV'); PlaySound(arquivo,2,SND_ASYNC); end; Comentrios:
gondraf@hotmail.com
Capitulo XX Trabalhando com dilogos: Os Dilogos so objetos que criam vnculos com funes internas do windows, os dilogos disponveis controlam as fontes, cores, arquivos e impressoras que por ventura estajam incorporados ao sistema computacional. Prtica 32 Trabalhando com dilogos Formulrio:
Propriedade Caption Caption Caption Lines Align Align Stretch Arquivo Imagem
Evento com
Procedimento
alClient alClient True Novo Abrir Salvar Abrir Salvar Alterar fonte Alterar cor Localizar Substituir Imprimir Ajustar impressora
gondraf@hotmail.com
procedure TForm1.Salvar1Click(Sender: TObject); begin if SaveDialog1.Execute=true then RichEdit1.Lines.SaveToFile(SaveDialog1.FileName); end; procedure TForm1.Abrir2Click(Sender: TObject); begin if OpenPictureDialog1.Execute=true then image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); end; procedure TForm1.Salvar2Click(Sender: TObject); begin if SavePictureDialog1.Execute=true then Image1.Picture.SaveToFile(SavePictureDialog1.FileName); end; procedure TForm1.Novo1Click(Sender: TObject); begin RichEdit1.Clear; end; procedure TForm1.Alterarfonte1Click(Sender: TObject); begin if FontDialog1.Execute=true then RichEdit1.Font:=FontDialog1.Font; end; procedure TForm1.Alterarcor1Click(Sender: TObject); begin if ColorDialog1.Execute=true then Richedit1.Color:=ColorDialog1.Color; end; procedure TForm1.Localizar1Click(Sender: TObject); begin FindDialog1.Position := Point(RichEdit1.Left + RichEdit1.Width, RichEdit1.Top); FindDialog1.Execute; end; procedure TForm1.FindDialog1Find(Sender: TObject); var FoundAt: LongInt; StartPos, ToEnd: Integer; // define o incio e o fim do texto procurado begin with RichEdit1 do begin {comea a procura depois da seleo atual se h um caso contrrio, comea do incio do texto} if SelLength <> 0 then StartPos := SelStart + SelLength else StartPos := 0; {ToEnd o tamanho a partir do StartPos para o fim do texto no RichEdit} ToEnd := Length(Text) - StartPos; FoundAt := FindText(FindDialog1.FindText, StartPos, ToEnd,[stMatchCase]); if FoundAt <> -1 then begin
gondraf@hotmail.com
SetFocus; SelStart := FoundAt; SelLength := Length(FindDialog1.FindText); end; end; end; procedure TForm1.Substituir1Click(Sender: TObject); begin FindDialog1.Position := Point(RichEdit1.Left + RichEdit1.Width, RichEdit1.Top); ReplaceDialog1.Execute; end; procedure TForm1.ReplaceDialog1Replace(Sender: TObject); var SelPos: Integer; begin with TReplaceDialog(Sender) do begin {Procura o texto com busca em case-sensitive no RichEdit1} SelPos := Pos(FindText, RichEdit1.Lines.Text); if SelPos > 0 then begin RichEdit1.SelStart := SelPos - 1; RichEdit1.SelLength := Length(FindText); {Substitui o texto selecionado pelo texto indicado} RichEdit1.SelText := ReplaceText; end else MessageDlg('Concluda', mtError, [mbOk], 0); end; end; procedure TForm1.Imprimir1Click(Sender: TObject); begin if PrintDialog1.Execute=true then RichEdit1.Print('Impresso do Arquivo'); end; procedure TForm1.Ajustarimpressora1Click(Sender: TObject); begin PrinterSetupDialog1.Execute; end; procedure TForm1.Sair1Click(Sender: TObject); begin Halt; end; Comentrios:
gondraf@hotmail.com
Consideraes: Existem algumas propriedades dos dilogos devem ser mencionadas por se tratarem de propriedades de uso constante nos tratamentos de dilogos: Propriedade FileName Descrio Indica o nome do arquivo que dever ser aberto ou salvo por um dilogo Indica qual o tipo de arquivo (extenso) dever ser filtrado Indica qual o diretrio inicial para busca ou gravao de arquivo Indica o texto que dever ser procurado Dilogo OpenDialog SaveDialog OpenPictureDialog SavePictureDialog OpenDialog SaveDialog OpenPictureDialog SavePictureDialog OpenDialog SaveDialog OpenPictureDialog SavePictureDialog ReplaceDialog FindDialog
Filter
InitialDir FindText
Capitulo XXI Trabalhando unidades, pastas e arquivos: As vezes em um projeto necessrio se localizar uma pasta para gravao de um arquivo ou localizar um arquivo para excluso ou cpia, tais procedimentos feitos por um operador de micro, seriam realizados a nvel de sistema operacional, no entanto, um desenvolvedor um pouco mais experiente poder, entretanto, executar estes procedimentos a nvel de projeto, seja utilizando objetos destinados para tal ou carregando ferramentas Shell do prprio windows. Prtica 33 Localizando e executando arquivos via objetos Formulrio:
gondraf@hotmail.com
Objeto Form1 Label1 Label2 Label3 Label4 DriveComboBox1 DirectoryListBox1 FilterComboBox1 FileListBox1 StatusBar1 BitBtn1 BitBtn2
Procedimento
Procedimentos: procedure TForm1.FileListBox1Click(Sender: TObject); begin StatusBar1.SimpleText:=FileListBox1.FileName; end; procedure TForm1.BitBtn1Click(Sender: TObject); var arquivo:PChar; begin case filtercombobox1.ItemIndex of 0:arquivo:=pChar('c:\windows\notepad.exe '+StatusBar1.SimpleText); 2:arquivo:=pChar('c:\arquivos de programas\internet explorer\iexplore.exe '+StatusBar1.SimpleText); 3:arquivo:=pChar(StatusBar1.SimpleText); end; winexec(arquivo,SW_Show); // Executa um aplicativo baseado no windows end; procedure TForm1.BitBtn2Click(Sender: TObject); begin close; end; Comentrios:
gondraf@hotmail.com
Formulrio:
ShellComboBox1
ShellTreeView1
ShellListView1
Propriedade Caption Menu Caption Align ShellListView ShellTreeView Root UseShellImages ShellListView ShellComboBox Root Align ShellComboBox ShellTreeView PopUpMenu Align Caption Alignment Visible Text Caption Items Images
MainMenu1
Items
Valor Pratica 34 MainMenu1 Endereo: alTop ShellListView1 ShellTreeView1 rfDesktop True ShellListView1 ShellComboBox1 rfDesktop alLeft ShellComboBox1 ShellTreeView1 PopUpMenu1 alClient Nova Pasta: alLeftJustify False Vazio (null) Ok Nova Pasta ImageList1 Arquivo Criar Nova Pasta Fechar Visualizar Detalhes cones pequenos cones grandes Lista
Evento
Procedimento
Click
BitBtn1Click
gondraf@hotmail.com
begin ShellListView1.ViewStyle:=vsReport; // Ajusta para detalhes end; procedure TForm1.Iconespequenos1Click(Sender: TObject); begin ShellListView1.ViewStyle:=vsSmallIcon; // Ajusta para icones pequenos end; procedure TForm1.Iconesgrandes1Click(Sender: TObject); begin ShellListView1.ViewStyle:=vsIcon; // Ajusta para icones grandes end; procedure TForm1.Lista1Click(Sender: TObject); begin ShellListView1.ViewStyle:=vsList; // Ajusta para lista end; procedure TForm1.Criarnovapasta1Click(Sender: TObject); begin panel3.Visible:=true; edit1.Text:=ShellTreeView1.Path+'\'; //copia o caminho para edit1 edit1.SetFocus; end; procedure TForm1.BitBtn1Click(Sender: TObject); begin MKDir(edit1.Text); // Cria diretrio panel3.Visible:=false; end; procedure TForm1.Fechar1Click(Sender: TObject); begin close; end; Comentrios:
gondraf@hotmail.com
Propriedade Caption Name Align Color Font.Color Name Visible Name Visible Name Visible Name Visible Name Visible Align Align PopupMenu ShowGlyphs
Valor Pratica 35 StatusBar1 alTop clNavy clWhite Floppy False Fixed False Network False CDRom False RamDisk False alClient alClient PopArquivos True
Evento OnCreate
Procedimento Form1Create
OnChange OnChange
DirectoryOutline1Change FileList1Change
OnMouseDown
FileList1MouseDown
gondraf@hotmail.com
StaticText1
GroupBox1 CheckBox1 CheckBox2 CheckBox3 CheckBox4 BitBtn1 ScrollBox3 Label4 Label5 Label6
OnClick
BitBtn1Click
StaticText2
PopupMenu1
Items
gondraf@hotmail.com
Procedimentos: uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, FileCtrl, Grids, Outline, DirOutln, Tabs, ExtCtrls, Menus, Consts, ShellAPI, RtlConsts, Buttons; private // Procedimentos e funes criadas procedure ConfirmChange(const ACaption, FromFile, ToFile: string); procedure CopyFile(const FileName, DestName: string); procedure MoveFile(const FileName, DestName: string); function GetFileSize(const FileName: string): LongInt; function FileDateTime(const FileName: string): TDateTime; function HasAttr(const FileName: string; Attr: Word): Boolean; function ExecuteFile(const FileName, Params, DefaultDir: string; ShowCmd: Integer): THandle; type // Identificadores de erro EInvalidDest = class(EStreamError); // Destino invlido EFCantMove = class(EStreamError); // Impossivel movimento implementation const // Mensagens de erro SInvalidDest = 'Destino %s no existe'; // Destino invlido SFCantMove = 'Impossvel mover o arquivo %s'; // Impossivel movimento procedure TForm1.Sair1Click(Sender: TObject); begin Close; end; procedure TForm1.FormCreate(Sender: TObject); var Drive: Char; AddedIndex: Integer; begin for Drive := 'a' to 'z' do begin case GetDriveType(PChar(Drive + ':\')) of // Verifica o tipo do drive DRIVE_REMOVABLE: // Diskete AddedIndex := TabSet1.Tabs.AddObject(Drive, Floppy.Picture.Graphic); DRIVE_FIXED: // Winchester AddedIndex := TabSet1.Tabs.AddObject(Drive, Fixed.Picture.Graphic); DRIVE_CDROM: // CDRom AddedIndex := TabSet1.Tabs.AddObject(Drive, CDRom.Picture.Graphic); DRIVE_RAMDISK: // RamDrive AddedIndex := TabSet1.Tabs.AddObject(Drive, RamDisk.Picture.Graphic); DRIVE_REMOTE: // Drive de rede AddedIndex := TabSet1.Tabs.AddObject(Drive, Network.Picture.Graphic); else AddedIndex := 0; end; if UpCase(Drive) = FileList1.Drive then TabSet1.TabIndex := AddedIndex; end; end;
gondraf@hotmail.com
procedure TForm1.TabSet1Change(Sender: TObject; NewTab: Integer; var AllowChange: Boolean); begin if not (csDesigning in ComponentState) then begin AllowChange := True; try DirectoryOutline1.Drive := TabSet1.Tabs[NewTab][1]; except on EInOutError do // Verifica erro de entrada e sada begin AllowChange := False; DirectoryOutline1.Drive := TabSet1.Tabs[TabSet1.TabIndex][1]; raise; end; end; end; end; procedure TForm1.DirectoryOutline1Change(Sender: TObject); begin FileList1.Directory := DirectoryOutline1.Directory; StatusBar1.Caption := DirectoryOutline1.Directory; end; procedure TForm1.FileList1Change(Sender: TObject); var Nomedoarquivo,Nomedodiretorio,Tamanho: string; begin nomedodiretorio:=DirectoryOutline1.Directory; with FileList1 do begin if ItemIndex >= 0 then begin Tamanho:= Items[ItemIndex]; Nomedoarquivo := Format('%s, %d bytes', [tamanho, GetFileSize(tamanho)]); StatusBar1.Caption:=Nomedodiretorio+'\'+Nomedoarquivo; end else StatusBar1.Caption := ''; end; end; procedure TForm1.TabSet1MeasureTab(Sender: TObject; Index: Integer; var TabWidth: Integer); var BitmapWidth: Integer; begin // Este Procedimento determina o comprimento das abas do TabSet BitmapWidth := TBitmap(TabSet1.Tabs.Objects[Index]).Width; Inc(TabWidth, 2 + BitmapWidth); end; procedure TForm1.TabSet1DrawTab(Sender: TObject; TabCanvas: TCanvas; R: TRect; Index: Integer; Selected: Boolean); var Bitmap: TBitmap; begin // Este procedimento mostra a imagem na aba do TabSet Bitmap := TBitmap(TabSet1.Tabs.Objects[Index]); with TabCanvas do
gondraf@hotmail.com
begin Draw(R.Left, R.Top + 4, Bitmap); TextOut(R.Left + 2 + Bitmap.Width, R.Top + 2, TabSet1.Tabs[Index]); end; end; procedure TForm1.Arquivo1Click(Sender: TObject); var FileSelected: Boolean; begin // Este procedimento habilita uma ao do PopArquivo para o arquivo selecionado FileSelected := FileList1.ItemIndex >= 0; Abrir1.Enabled := FileSelected; Deletar1.Enabled := FileSelected; Copiar1.Enabled := FileSelected; Mover1.Enabled := FileSelected; Renomear1.Enabled := FileSelected; Propriedades1.Enabled := FileSelected; end; procedure TForm1.Deletar1Click(Sender: TObject); begin with FileList1 do if MessageDlg('Delete '+FileName+'?', mtConfirmation,[mbYes,mbNo],0)=mrYes then if DeleteFile(FileName) then Update; // Deleta o arquivo e atualiza a lista end; procedure TForm1.Propriedades1Click(Sender: TObject); var Attributes, NewAttributes: Word; begin // Este procedimento mostra os atributos do arquivo scrollBox2.Visible:=true; Arquivo.Caption := FileList1.Items[FileList1.ItemIndex]; Caminho.Caption := FileList1.Directory; Modificacoes.Caption := DateTimeToStr(FileDateTime(FileList1.FileName)); Attributes := FileGetAttr(Arquivo.Caption); ReadOnly.Checked := (Attributes and faReadOnly) = faReadOnly; Archive.Checked := (Attributes and faArchive) = faArchive; System.Checked := (Attributes and faSysFile) = faSysFile; Hidden.Checked := (Attributes and faHidden) = faHidden; end; procedure TForm1.ConfirmChange(const ACaption, FromFile, ToFile: string); begin // Este procedimento confirma a copia, a renomeao ou o movimento de um arquivo
if MessageDlg(Format('%s %s to %s?', [ACaption, FromFile, ToFile]),mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin if ACaption='Mover' then MoveFile(FromFile, ToFile) // Movimento do arquivo else if ACaption='Copiar' then CopyFile(FromFile, ToFile) // Copia do arquivo else if ACaption='Renomear' then RenameFile(FromFile, ToFile);// Renomeia FileList1.Update; // Atualiza lista showmessage('Operao executada!'); // informa ao usurio end; end;
gondraf@hotmail.com
begin // Este procedimento define as aes de copia, movimento ou renomeao ScrollBox3.Visible:=true; if Sender = Mover1 then StaticText2.Caption := 'Mover' else if Sender = Copiar1 then StaticText2.Caption := 'Copiar' else if Sender = Renomear1 then StaticText2.Caption := 'Renomear' else Exit; Diretorio.Caption := DirectoryOutline1.Directory; Origem.Text := FileList1.FileName; Destino.Text := ''; end; procedure TForm1.Abrir1Click(Sender: TObject); begin // Este procedimento executa um arquivo with FileList1 do begin
if HasAttr(FileName,faDirectory) then ExecuteFile(FileName,'',Directory,SW_SHOW); DirectoryOutline1.Directory := FileName else
end; end; procedure TForm1.FileList1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin end; // Procedimentos externos procedure TForm1.CopyFile(const FileName, DestName: string); var CopyBuffer: Pointer; { buffer de copia } BytesCopied: Longint; Source, Dest: Integer; { Ttulos } Len: Integer; Destination: TFileName; { nome do caminho de destino } const ChunkSize: Longint = 8192; { copia em blocos de 8K 8x1024 bytes} begin // Este procedimento copia o arquivo em blocos Destination := ExpandFileName(DestName); { expande o caminho de destino } if HasAttr(Destination, faDirectory) then { se destino um diretorio... } begin Len := Length(Destination); // Tamanho do destino if Destination[Len] = '\' then Destination := Destination + ExtractFileName(FileName) { ...clone do nome arquivo } else Destination := Destination + '\' + ExtractFileName(FileName); { ...clone do nome do arquivo } end; GetMem(CopyBuffer, ChunkSize); { aloca o buffer } try Source := FileOpen(FileName, fmShareDenyWrite); { abre arquivo de origem } if Source < 0 then raise EFOpenError.CreateFmt(SFOpenError, [FileName]); try Dest := FileCreate(Destination); { cria arquivo de sada; se existir sobrepe} if Dest < 0 then raise EFCreateError.CreateFmt(SFCreateError, [Destination]); try repeat BytesCopied := FileRead(Source, CopyBuffer^, ChunkSize); { l Bloco }
gondraf@hotmail.com
if BytesCopied > 0 then { J foi lido tudo?... } FileWrite(Dest, CopyBuffer^, BytesCopied); { ...escreve bloco } until BytesCopied < ChunkSize; { continue at o fim do bloco } finally FileClose(Dest); { fechar o arquivo de destino } end; finally FileClose(Source); { fechar o arquivo de origem } end; finally FreeMem(CopyBuffer, ChunkSize); { liberar o buffer } end; end; procedure TForm1.MoveFile(const FileName, DestName: string); var Destination: string; begin // Este procedimento movimenta o arquivo Destination := ExpandFileName(DestName); { expande o caminho de destino } if not RenameFile(FileName, Destination) then { renomeia o arquivo de destino } begin if HasAttr(FileName, faReadOnly) then { O arquivo somente de leitura?... } raise EFCantMove.Create(Format(SFCantMove, [FileName])); {No possvel mover ou deletar} CopyFile(FileName, Destination); { copia o arquivo para destino...} end; end; function TForm1.GetFileSize(const FileName: string): LongInt; var SearchRec: TSearchRec; begin // Esta funo calcula e retorna o tamanho do arquivo try if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then Result := SearchRec.Size else Result := -1; finally SysUtils.FindClose(SearchRec); end; end; function TForm1.FileDateTime(const FileName: string): System.TDateTime; begin // Retorna a data de criao do arquivo Result := FileDateToDateTime(FileAge(FileName)); end; function TForm1.HasAttr(const FileName: string; Attr: Word): Boolean; var FileAttr: Integer; begin // Captura os atributos do arquivo FileAttr := FileGetAttr(FileName); if FileAttr = -1 then FileAttr := 0; Result := (FileAttr and Attr) = Attr; end; function TForm1.ExecuteFile(const FileName, Params, DefaultDir: string;ShowCmd: Integer):THandle;
gondraf@hotmail.com
var zFileName, zParams, zDir: array[0..79] of Char; begin // Executa o arquivo atravs de um comando SHELL Result:=ShellExecute(Application.MainForm.Handle,nil, StrPCopy(zFileName,FileName),StrPCopy(zParams, Params), StrPCopy(zDir,DefaultDir),ShowCmd); end; procedure TForm1.BitBtn1Click(Sender: TObject); begin ScrollBox2.Visible:=false; end; procedure TForm1.BitBtn2Click(Sender: TObject); begin // confirma se ao de copia, renomeao ou movimento if Destino.Text <> '' then ConfirmChange(StaticText2.Caption, Origem.Text, Destino.Text); ScrollBox3.Visible:=false; end; Comentrios:
Capitulo XXII Trabalhando com grficos: TChart o componente mais importante em biblioteca de TeeChart. TChart deriva de TPanel e herda toda sua funcionalidade. Em resumo, TChart um standard componente bsico do TPanel com muitas capacidades especficas para desenhos com propsitos grficos. Voc pode criar grficos em tempo de projeto ou em run time. Os componentes TeeChart tambm podem estar em uma Forma de ActiveX, e dividem-se em trs componentes bsicos:
TChart Contido na paleta Additional, gera grficos dinmicos com valores randmicos ou TDBChart Contido na paleta Data Controls, gera grficos dinmicos com valores obtidos de
uma Tabela ou Query. TQRChart Contido na paleta QReport, introduz grficos em um relatrio gerado pelo QuickReport. informados.
Para a criao do TChart ou TDBChart, existem muitos passos comuns. Descreveremos a seguir tais passos. 1. 2. 3. Crie um novo formulrio e inclua um objeto TChart ou TDBChart; Ajuste o tamanho do Chart, para sua melhor visualizao; Com o boto direito do mouse, click sobre o Chart;
gondraf@hotmail.com
- About TeeChart Informa sobre o TeeChart; - Edit Chart Abre a tela de edio do Chart;
gondraf@hotmail.com
4. 5. 6. 7. 8.
Click sobre Edit Chart; Click sobre a aba Chart e nesta escolha a aba Series; Click sobre ADD... para comear a adio de novas sries: Escolha as series que comporo nosso grfico; Os passos seguintes sero pessoais e dependero do projeto.
gondraf@hotmail.com
Para melhor entendimento dos Charts faremos agora a nossa prtica. Prtica 36 Criando grficos: Formulrio:
Panel2
Panel3
CheckBox1 CheckBox2
Propriedade Caption Caption Align Name Visible Caption Align Name Visible Caption Align Name Visible Name Caption Name Caption Checked Name Max Min Position Caption Caption
Valor Pratica 36 Vazio (null) alBottom Panelanimacao False Vazio (null) alBottom PanelZoom False Vazio (null) alBottom Panel3D False Animar Animar Pizza Dimensao 3D True Velocidade 30 1 5 Lento Rpido
Evento
Procedimento
OnClick OnClick
animarClick dimensaoClick
gondraf@hotmail.com
BitBtn1 BitBtn2 BitBtn3 BitBtn4 Label3 Label4 Label5 Label6 Edit1 Edit2 Edit3 Edit4
UpDown1
UpDown2
UpDown3
UpDown4
OnClick
Fecha3dClick
gondraf@hotmail.com
MainMenu1
Items Visualizar
Para ajustar o nosso chart, prossiga da seguinte forma: 1 Inclua um objeto Chart ao formulrio; 2 Altere a propriedade Align para alClient; 3 D um click duplo sobre o chart, ou d um click com o boto direito do mouse e selecione Edit Chart... 4 Selecione a aba Chart; 5 Na aba Chart selecione Series; 6 Selecione ADD... 7 Da galeria inclua uma srie do tipo Bar; 8 Altere o ttulo da srie includa para Barras; 9 Da galeria inclua uma srie do tipo Area; 10 Altere o ttulo da srie includa para Areas; 11 Da galeria inclua uma srie do tipo Pie; 12 Altere o ttulo da srie includa para Pizza; 13 Da galeria inclua uma srie do tipo Fast Line; 14 Altere o ttulo da srie includa para Linhas; Uma vez ajustadas as propriedades descreveremos os procedimentos. Criao de funo: Para determinar qual srie dever ser ativa, criamos uma funo capaz ativar e desativar uma srie: Var Form1: TForm1; Function ativachart(grafico:TChart;numero:integer):Boolean; implementation Function ativachart(grafico:TChart;numero:integer):Boolean; var i:integer; begin for i:=0 to 3 do grafico.Series[i].Active:=false; // desativa todas as sries grafico.Series[numero].Active:=true; // ativa a srie indicada por nmero grafico.Visible:=true; // mostra o grfico result:=true; end; Procedimentos: procedure TForm1.Grficodebarras1Click(Sender: TObject); var tt:TchartTitle;
gondraf@hotmail.com
begin ativachart(chart1,0); // indica que a srie 0 dever ser ativa end; procedure TForm1.Grficodereas1Click(Sender: TObject); begin ativachart(chart1,1); // indica que a srie 1 dever ser ativa end; procedure TForm1.Grficopizza1Click(Sender: TObject); begin ativachart(chart1,2); // indica que a srie 2 dever ser ativa end; procedure TForm1.Grficodelinhas1Click(Sender: TObject); begin ativachart(chart1,3); // indica que a srie 3 dever ser ativa end; procedure TForm1.Button2Click(Sender: TObject); var i,t,c:integer; begin groupbox1.Visible:=false; // oculta o groupbox1 series1.Clear; // Limpa a srie1, deletando seus valores series2.Clear; // Limpa a srie2, deletando seus valores series3.Clear; // Limpa a srie3, deletando seus valores series4.Clear; // Limpa a srie4, deletando seus valores for t:=0 to 3 do begin // o lao abaixo carrega os valores do listbox1 e listbox2 nas sries1,2,3 e 4 do Chart for i:=0 to listbox1.Count-1 do chart1.Series[t].Add(strtoint(listbox1.Items.Strings[i]),listbox2.Items.Strings[i],clTeeColor); end; end; procedure TForm1.Informarvalores1Click(Sender: TObject); begin listbox1.Clear; // limpa o listbox1 listbox2.Clear; // limpa o listbox2 valor.Text:=; // zera valor descricao.Text:=; // zera descricao GroupBox1.Visible:=true; // mostra o groupbox1 end; procedure TForm1.animarClick(Sender: TObject); begin // verifica se o checkbox animar foi clicado if animar.Checked=true then chart1.AnimatedZoom:=true; chart1.AnimatedZoomSteps:=2; end; procedure TForm1.Timer1Timer(Sender: TObject); var t:longint; begin // se o checkbox est ativo efetua a rotao da serie3 (pizza) a cada 10 ms if animar.Checked=true then begin series3.Rotate(velocidade.Position); end;
gondraf@hotmail.com
end; procedure TForm1.Animar1Click(Sender: TObject); begin Panelanimacao.Visible:=true; // mostra o panel de animao end; procedure TForm1.ZoommaisClick(Sender: TObject); begin Chart1.ZoomPercent(110); // aumenta o grfico em 110% end; procedure TForm1.ZoommenosClick(Sender: TObject); begin chart1.ZoomPercent(80); // diminui o grfico para 80% end; procedure TForm1.Zoom1Click(Sender: TObject); begin panelzoom.Visible:=true; // mostra o panel de zoom end; procedure TForm1.FechazoomClick(Sender: TObject); begin panelzoom.Visible:=false; // oculta o panel de zoom end; procedure TForm1.FechaanimacaoClick(Sender: TObject); begin Panelanimacao.Visible:=false; // oculta o panel de animao end; procedure TForm1.AnexarClick(Sender: TObject); begin listbox1.Items.Add(valor.Text); // adiciona valor ao listbox1 listbox2.Items.Add(descricao.Text); // adiciona descrio ao listbox2 valor.Text:=; descricao.Text:=; end; procedure TForm1.FecharvaloresClick(Sender: TObject); var i,t,c:integer; begin groupbox1.Visible:=false; // oculta o groupbox1 series1.Clear; // apaga os valores da serie1 series2.Clear; // apaga os valores da serie2 series3.Clear; // apaga os valores da serie3 series4.Clear; // apaga os valores da serie4 for t:=0 to 3 do begin // o lao abaixo adiciona valores as series for i:=0 to listbox1.Count-1 do Chart1.Series[t].Add(strtoint(listbox1.Items.Strings[i]),listbox2.Items.Strings[i],clTeeColor); end; end; procedure TForm1.dimensaoClick(Sender: TObject); begin
// habilita / desabilita os objetos contidos no panel3d de acordo com o valor de dimensao (CheckBox)
gondraf@hotmail.com
chart1.View3D:=dimensao.Checked; Label3.Enabled:=dimensao.Checked; Label4.Enabled:=dimensao.Checked; Label5.Enabled:=dimensao.Checked; Label6.Enabled:=dimensao.Checked; Percentual3d.Enabled:=dimensao.Checked; UpDPercentual.Enabled:=dimensao.Checked; Rotacao.Enabled:=dimensao.Checked; UpDRotacao.Enabled:=dimensao.Checked; Perspectiva.Enabled:=dimensao.Checked; UpDPerspectiva.Enabled:=dimensao.Checked; Inclinacao.Enabled:=dimensao.Checked; UpDInclinacao.Enabled:=dimensao.Checked; end; procedure TForm1.percentual3dChange(Sender: TObject); begin chart1.Chart3DPercent:=strtoint(percentual3d.Text);// ajusta o tamanho do chart end; procedure TForm1.RotacaoChange(Sender: TObject); begin // ajusta o ngulo de rotao do chart Chart1.View3DOptions.Rotation:=strtoint(rotacao.Text); end; procedure TForm1.PerspectivaChange(Sender: TObject); begin // ajusta a perspectiva do chart Chart1.View3DOptions.Perspective:=strtoint(perspectiva.Text); end; procedure TForm1.InclinacaoChange(Sender: TObject); begin // ajusta a inclinao do chart Chart1.View3DOptions.Tilt:=Strtoint(inclinacao.Text); end; procedure TForm1.Fecha3dClick(Sender: TObject); begin Panel3d.Visible:=false; // oculta o panel3d end; procedure TForm1.N3Deposicoes1Click(Sender: TObject); begin Panel3d.Visible:=true; // mostra o panel3d end; Comentrios:
Prtica 37 Criando grficos com tabelas: Este projeto tem como finalidade gerar um grfico utilizando o objeto dbchart com dados obtidos atravs de uma tabela ou query, portanto crie uma base de dados contendo os campos descritos a seguir.
gondraf@hotmail.com
Uma vez criada a tabela, salve na pasta C:/Delphi 2005/tabelas e carregue dados conforme tabela abaixo: Descricao Joo Ana Paula Pedro Carlos Valor 16 9 6 14 10
O objeto dbchart possui a mesma funo do chart, porm os valores utilizados nas possveis series sero obtidos dos registros contidos na tabela, sempre que um valor armazenado em um campo sofrer uma alterao, esta variao ser transferida para o dbchart. Montagem do Formulrio:
Propriedades: Objeto Form1 Panel1 Panel2 CheckBox1 CheckBox2 GroupBox1 Propriedade Caption Align Align Caption Checked Caption Checked Align Valor Pratica 36 alLeft alClient Legenda True Marcas True alBottom Evento OnActivate OnClose Procedimento FormActivate FormClose
OnClick OnClick
CheckBox1Click CheckBox2Click
gondraf@hotmail.com
RadioGroup1
Items ItemIndex Name DatabaseName TableName DataSet Align DataSource Align SeriesList
OnClick
RadioGroup1Click
Em DBChart1, na aba Series, selecione Data Source e ajuste as opes conforme a figura abaixo:
Terminado os ajustes das propriedades devemos descrever os procedimentos necessrios para controlar o nosso projeto. Procedimentos: procedure TForm1.FormActivate(Sender: TObject); begin Tgrafico.Open; // abre a tabela sempre que o form ativo end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Tgrafico.Close; // fecha a tabela antes de fechar o formulrio end; procedure TForm1.CheckBox1Click(Sender: TObject); begin // mostra ou oculta a legenda de acordo com o marco de checagem do checkbox1 series1.ShowInLegend:=checkbox1.Checked; end; procedure TForm1.CheckBox2Click(Sender: TObject); begin // mostra ou oculta as marcas de acordo com o marco de checagem do checkbox2
gondraf@hotmail.com
series1.marks.Visible:=Checkbox2.Checked; end; procedure TForm1.RadioGroup1Click(Sender: TObject); begin // Este procedimento determina o estilo das marcas a serem mostradas case radiogroup1.ItemIndex of 0:series1.Marks.Style:=smsValue; 1:series1.Marks.Style:=smsPercent; 2:series1.Marks.Style:=smsLabel; 3:series1.Marks.Style:=smsLabelValue; 4:series1.Marks.Style:=smsLabelPercent; end; end; Comentrios:
gondraf@hotmail.com
Capitulo XXIII Literatura complementar Literatura 01 Criando o arquivo de ajuda O Help ou arquivo de ajuda est constitudo por trs arquivos bsicos:
O arquivo de projeto (.HPJ); O arquivo de contedo (.CNT); e O arquivo de texto no formato rich-text (.RTF).
Cada um dos trs arquivos contm instrues especiais que controlam a construo e o comportamento do arquivo de ajuda gerado. Antes de voc criar o arquivo de projeto ou o arquivo de contedo, voc precisa compor o texto de ajuda propriamente dito. Este arquivo consiste de texto simples com a ajuda de alguns caracteres especiais e outros atributos de formatao que definem os tpicos de ajuda e os relacionamentos entre eles. Voc organiza o texto por tpicos, colocando cada tpico em uma pgina separada. Dentro de cada tpico, voc usa notas de rodap com caracteres customizados para denotar o ttulo de um tpico, seu nmero, sua seqncia de navegao, e suas entradas no ndice. Voc usa atributos especiais de texto para denotar links de um tpico para outro. Caracteres especiais e atributos de texto usados na composio de arquivos de ajuda Smbolo/Atributo # $ K + Duplo sublinhado Texto escondido Significado Define o identificador do tpico que ser usado para se fazer referncia a este tpico Define o ttulo do tpico Define uma entrada no ndice ou um conjunto de entradas (palavras chave) Define a ordem deste tpico na seqncia de navegao Define um salto para outro tpico Identifica o tpico para onde saltar
Construindo o arquivo texto de ajuda Utilizando o Microsoft Word criaremos quatro tpicos sendo: trs tpicos simples, e um tpico de contedo, e em seguida criaremos links entre eles e definiremos entradas no ndice para cada um deles. Vamos iniciar digitando o primeiro tpico: Tpico 1 Este o texto de ajuda do tpico 1. Logo a seguir voc ver outros tpicos. Criando o identificador do tpico Posicione o cursor exatamente antes da palavra Tpico e insira uma nota de rodap com o caractere #. Isto ir denotar o identificador do tpico ou a string de contexto. Digite Tpico1 no texto da nota de rodap. Os outros tpicos que estabelecerem links com este iro usar este identificador para criar o link.
gondraf@hotmail.com
Criando o ttulo do tpico Reposicione o cursor antes da palavra Tpico e insira uma nota de rodap com o caractere $. Digite Tpico 1 no texto da nota de rodap. O Word permite pesquisar tpicos usando seus ttulos, ento uma boa idia colocar ttulos nos tpicos. O ttulo que voc especificar para um tpico exibido na lista de histrico do WinHelp, na caixa de dilogo Pesquisa, e no menu Bookmark. Usualmente, o ttulo que voc especificar dever ser o mesmo que o texto da primeira linha do tpico. Voc pode formatar a primeira linha do tpico como qualquer ttulo. Voc pode usar um tamanho de fonte maior e negrito para destac-lo. Criando as palavras chaves do tpico Insira uma nota de rodap com o caractere K antes da palavra Tpico e digite Tpico1;Tpico 1;Primeiro. Estas entradas iro aparecer no ndice do arquivo de ajuda, e ajudaro os usurios a encontrar mais facilmente os tpicos de interesse. Criando os tpicos restantes Insira uma quebra de pgina aps o texto do tpico. Todas as definies de tpicos terminam com uma quebra de pgina. Agora que o Tpico1 est definido, voc pode criar os dois tpicos restantes de acordo com o texto abaixo: Tpico 2 Tpico 3 Insira as notas de rodap para o identificador, o ttulo e palavras chaves destes dois tpicos. Use o mesmo tipo de notas de rodap customizadas que voc usou para o Tpico 1 e no esquea de formatar a primeira linha de cada tpico de maneira a salient-la e inserir uma quebra de pgina entre eles. Na tabela abaixo voc ver como ficam as notas de rodap dos trs tpicos: Notas de rodap dos tpicos de exemplo Smbolo # $ K Tpico 1 Tpico1 Tpico 1 Tpico1; Tpico 1; Primeiro Tpico 2 Tpico2 Tpico 2 Tpico2; Tpico 2; Segundo Tpico 3 Tpico3 Tpico 3 Tpico3; Tpico 3; Terceiro; ltimo
Linkando dois tpicos Depois que os tpicos foram criados, voc pode linkar o segundo com o primeiro. Posicione o cursor logo aps a palavra primeiro no segundo tpico (sem espaos). Digite Tpico1, e ento selecione a palavra Tpico1 e esconda-a com o comando Formatar/Fonte/Oculto. A seguir selecione a palavra primeiro e formate-a com duplo sublinhado usando o comando Formatar/Fonte/Sublinhado/Duplo. Isto ir transformar a palavra primeiro em um link para o Tpico 1. Quando o usurio clicar nela, o Tpico 1 ser exibido. Agora crie dois links como foi feito anteriormente, porm no Tpico 3 e usando as palavras primeiro e segundo, e use sublinhado simples ao invs de usar sublinhado duplo. O link na palavra primeiro dever chamar o Tpico 1 e o link na palavra segundo dever chamar o Tpico 2. A
gondraf@hotmail.com
diferena deste tipo de link para o anterior, que este no salta diretamente para o tpico, mas sim exibe-o em uma janela pop-up. Criando o tpico de contedo At agora j criamos os tpicos do arquivo de ajuda e os links entre eles, agora voc precisa criar um tpico chamado Contedo no seu arquivo de ajuda. Este tpico consiste em nada mais do que o ttulo e links para os outros tpicos. O compilador de help assume que o tpico de contedo o primeiro no arquivo contendo o texto de ajuda, ento insira uma quebra de pgina no comeo do seu arquivo. E digite o seguinte texto: Contedo do arquivo de ajuda de exemplo Tpico 1 Tpico 2 Tpico 3 Depois disto, crie as notas de rodap como voc j fez anteriormente e nas trs use apenas o texto Contedo. Depois das notas de rodap, basta linkar cada um dos tpicos usando o sublinhado duplo. Agora, s falta mais uma coisa a fazer antes de passarmos para os arquivos de projeto e contedo. Voc precisa determinar a ordem em que o usurio ir mover-se seqencialmente atravs dos tpicos no seu arquivo de ajuda. Posicione o cursor imediatamente depois da palavra exemplo no tpico de contedo e insira uma nota de rodap com o caractere + e no seu texto digite auto. Repita este processo para os outros trs tpicos. A especificao auto diz ao compilador de ajuda para numerar os tpicos seqencialmente conforme eles aparecem no arquivo de ajuda. Voc poderia informar um nmero de seqncia fixo para cada tpico, mas usar auto mais flexvel pois permite a insero de mais tpico sem precisar reorganizar a seqncia dos demais tpicos. Depois que voc terminar de especificar a seqncia de navegao, voc terminou o arquivo com o texto de ajuda. Salve o arquivo no formato rich-text (RTF) com o nome de teste.rtf. Criando o arquivo de contedo da ajuda Utilizaremos o aplicativo Help Workshop ou simplesmente HCW.EXE, que o aplicativo distribudo pela Borland para criao de arquivos de ajuda: Help Author A primeira coisa que voc precisa fazer habilitar a opo Help Author no menu File. Habilitar esta opo libera vrios benefcios. Primeiro, faz com que diversas informaes adicionais sobre seu sistema de ajuda seja exibida enquanto voc o est construindo, como o nmero dos tpicos de ajuda como se voc navegasse atravs deles. Segundo, ele habilita que voc se mova para trs e para frente no seu arquivo de ajuda (sem considerar se voc habilitou os botes de navegao) usando Ctrl+Shift+Left e Ctrl+Shift+Right. Voc pode mover-se para o comeo ou o fim do seu arquivo de ajuda usando Ctrl+Shif+Home e Ctrl+Shift+End. A seguir, clique na opo New no menu File e selecione Help Contents. A Figura 1 lhe mostra a tela resultante.
gondraf@hotmail.com
Digite ./teste.hlp na caixa Default filename. Digite Arquivo de ajuda de exemplo na caixa Default title. A seguir, clique o boto Add Above e digite Contedo do arquivo de ajuda de exemplo na caixa Title do dilogo que ir aparecer, e Contedo na caixa Topic ID. Clique OK para salvar. A seguir, clique o boto Add Below e repita o processo para os trs tpicos que voc criou. O dilogo de definio de contedo do Help Workshop
Depois de ter adicionado o ltimo tpico lista, voc est pronto para salvar seu arquivo de contedo. Salve-o juntamente com o arquivo RTF com o nome de teste.cnt. Criando o arquivo de projeto da ajuda Selecione New no menu File e selecione Help Project. A primeira coisa que o Help Workshop faz lhe pedir o nome do arquivo do projeto. Posicione no diretrio onde voc colocou os outros arquivos e digite teste para o nome do arquivo, ento clique no boto Save. O Help Workshop adicionar a extenso HPJ para este arquivo. A Figura 2 lhe mostra a tela resultante. Adicionando seus arquivos .RTF e .CNT ao projeto Clique o boto Options e especifique Contedo para Default topic e Arquivo de ajuda de exemplo para Help title, ento clique em Compression e especifique Maximum. A seguir, clique em Files e especifique seu teste.rtf na caixa Rich Text Format files (.RTF), e seu teste.cnt na caixa Contents file (.CNT). Depois disto, salve suas configuraes clicando em OK para sair do dilogo. Adicionando botes de navegao ao projeto Clique o boto Windows, e ento digite main no dilogo Create a Window. Clique OK para salvar seu novo tipo de janela. Uma vez de volta para o dilogo Window Properties, clique o
gondraf@hotmail.com
boto Buttons e marque o checkbox Browse. Isto ir habilitar os botes de navegao do WinHelp fazendo com que voc possa navegar atravs de sua ajuda usando a seqncia que voc definiu anteriormente. Clique OK para salvar suas alteraes. O TESTE.HPJ como ele aparece inicialmente no Help Workshop
Mapeando os identificadores de tpicos Antes de retornar tela principal do Help Workshop, clique o boto Map. A seguir, clique Add, e digite Contedo na caixa Topic ID e 0 (zero) na caixa Mapped numeric-value. Isto permite que os elementos da aplicao para a qual esta ajuda est sendo desenvolvida possam exibir o contedo da ajuda quando o usurio solicita a ajuda sensitiva ao contexto. Clique OK para salvar seu mapeamento. Agora repita o procedimento para os demais tpicos, usando os seguintes valores para Tpic ID e Mapped numeric-values respectivamente: Tpico1 e 100, Tpico2 e 200 e Tpico3 e 300. uma boa idia deixar um espao grande entre seus tpicos para que voc consiga adicionar novos tpicos entre eles sem reorganiz-los. Estes nmero sero usados em sua aplicao para linkar elementos do programa com o sistema de ajuda. Quando voc terminar o mapeamento dos tpicos, voc est pronto para salvar o projeto e compil-lo. Clique o boto Save and Compile que est na parte inferior da tela. A Figura 3 mostra os resultados da compilao. Testando seu arquivo de ajuda Voc pode facilmente testar seu arquivo de ajuda sem sair do Help Workshop. Selecione Run WinHelp no menu File, e voc ver o dilogo View Help File. O drop-down Mapped Topic ID permite a voc simular uma aplicao passando um identificador de ajuda de contexto para o WinHelp.
gondraf@hotmail.com
Clique o boto View Help para abrir o seu arquivo de ajuda recentemente criado. Voc dever ver o tpico Contedo. Linkando o arquivo de ajuda com a sua aplicao O passo final ao integrar ajuda Windows com a sua aplicao linkar o arquivo de ajuda com a sua aplicao e configurar a ajuda de contexto corretamente. Carregue o Delphi e selecione Project/Options no menu. Depois selecione Application. Voc ver que a entrada para o arquivo de ajuda est em branco. Informe o nome do arquivo de ajuda neste espao e clique OK. Agora basta colocar o nmero identificador do tpico na propriedade HelpContext de cada componente que voc queira e pronto.
gondraf@hotmail.com
Literatura 02 O Rave Report Preparando a Aplicao Tomando como base a nossa aplicao final, vamos selecionar o Data Module dados e colocar nele 3 componentes da palheta Rave:
RvProject: Responsvel pela ligao entre o projeto Delphi e o projeto de relatrios Rave.
RvDataSetConnection
RvSystem
Name: rvsysEmp TitlePreview: Previso do Relatrio TitleSetup: Opes de Impresso TitleStatus: Status de Impresso
RvProject
Agora execute um duplo clique sobre o componente RvProject para abrir o Rave Visual Designer.
gondraf@hotmail.com
Configuraes Gerais File - New File Save: Empregados.rav Barra de ferramentas Palhetas de componentes
A Pgina
Na rvore de Objetos, selecione RaveProject e, no Painel de Propriedades, altere a propriedade Units para unMM (milmetros) Explicao sobre a propr. atual
gondraf@hotmail.com
Na rvore de Objetos, selecione Report Library, e dentro dele selecione Report1. No Painel de Propriedades, altere as propriedades:
Ainda na rvore de Objetos, selecione Page1 e no Painel de Propriedades, configure as seguintes propriedades.
Acesso aos Dados Para termos acesso aos dados que iremos imprimir, precisamos criar um Data Object. Para isso voc seleciona File - New Data Object, ou ento clica no boto correspondente da barra de ferramentas . Aparecer a tela:
aos
Selecione Direct Data View. Isto nos dar acesso DataSets criados dentro do nosso projeto Delphi. Depois clique Next.
gondraf@hotmail.com
Aparecero todos os componentes RvDataSetConnection que colocamos no projeto Delphi, no nosso caso, apenas 1. Selecione-o e clique Finish.
Na
rvore de Objetos, veremos todos os campos de tbEmp. Selecione DataView1 e altere as propriedades mostradas acima.
Desenhando o Relatrio Nas palhetas de componentes, selecione a palheta Report e traga para a Pgina um componente Region . Ele determina e delimita a rea de impresso da pgina.
Redimensione o componente Region de modo que ocupe quase toda a rea da folha. Deixe uma rea livre no final da pgina, l criaremos nosso rodap de pgina.
gondraf@hotmail.com
rodap de pgina
Nas palhetas de componentes, selecione a palheta Report e traga para Region1 um objeto Band - e um objeto DataBand relatrio. . Eles sero usados para criarmos as reas de impresso do
gondraf@hotmail.com
BandStyle:
Selecione: Body Header (Cabealho) First (Primeira pgina) New Page (Nova pgina)
ControllerBand: DataBand1 Name: PageHeader Selecione o objeto Band2 e altere as propriedades: DataView: dvEmp Name: Detalhe
Os cones esquerda de cada banda mudaro, como mostra a figura. Traga um componente BitMap da palheta Standard e coloque sobre a banda de cabealho.
gondraf@hotmail.com
Altere a sua propriedade Image, selecionando uma figura do disco. Altere tambm a propriedade MatchSide para msBoth, isto far a figura ocupar toda a rea do componente.
Para colocar os ttulos no cabealho de pgina, utilize o componente Text Standard. Altere as propriedades:
-da palheta
Text: RELATRIO GERAL DE FUNCIONRIOS FontJustify: pjCenter Font: Aumente o tamanho da fonte, o seu nome e estilo de acordo com a sua preferncia. Aumente a largura e a posio do componente Text para que fique centralizado horizontalmente. Coloque um subttulo com o nome da sua empresa. Para exibir a data de impresso do relatrio, traga para o cabealho um componente DataText da palheta Report. Na sua propriedade DataField, clique nos pontinhos...
gondraf@hotmail.com
Em Report Variables, selecione DateShort Clique no boto Insert Report Var e a varivel selecionada ser inserida no quadro Data Text.
Depois escreva em Data Text, um ttulo para a varivel que foi inserida.
Para colocarmos uma linha separando o cabealho do restante da pgina, selecione a palheta Drawing e traga um componente HLine para configur-la como desejado. . Utilize as propriedades LineWidth, Color etc..
gondraf@hotmail.com
Agora vamos montar a banda de detalhe. Este relatrio ser um relatrio no formato de ficha, semelhante a um crach. Por isso no teremos cabealho de colunas. Traga para a banda de detalhe, um componente BitMap da palheta Standard. Altere seu tamanho e posio como mostra a figura.
Altere as propriedades: DataView: dvEmp DataField: FOTO Vamos agora montar os ttulos dos campos que aparecero na banda de detalhe. Para isso, traga 6 componentes Text da palheta Standard e configure-os como mostra a figura.
de
Com a tecla CONTROL pressionada, arraste cada campo da rvore de Objetos, para a posio correspondente na banda detalhe. Aparecer um componente DataText, devidamente configurado para exibir o campo.
gondraf@hotmail.com
gondraf@hotmail.com
Capitulo XXIV Dicas da internet As dicas contidas neste material foram colhidas em sites da internet, portanto, nem todas as dicas aqui contidas foram testadas no delphi 2005 Dica 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. Descrio Pintar um Bitmap diretamente no Canvas do Form Verificar se a impressora est ligada Obter a letra do drive onde est o Windows Mostrar o nome do EXE no caption do form Fazer pesquisa incremental apenas com DBGrid Obter tipo de uma propriedade Consulta SQL que usa a data do sistema Abrir uma coneco Dial-Up Pintar uma imagem JPG no form Executar comando do MS DOS Formatar CEP Permitir cancelar processo demorado Descobrir se uma data fim do ms Programar teclas de atalho do Windows Obter o tipo de dado de um valor no Registro do Windows Obter a clula de um StringGrid que est sob o cursor do mouse Limpar todas as clulas de um StringGrid Programar meu aplicativo para abrir arquivos a partir do Windows Explorer Consultar por ms de um campo data Criando tabelas via SQL Obter nomes dos campos de uma tabela Nomeando um relatrio no spool de impresso do Windows Obter tamanho de um arquivo Ocultar aplicao da lista de tarefas CTRL+ALT+DEL Obter path de um Alias do BDE Ativar a proteo de tela do Windows Desligar/Ligar monitor Abrir e fechar o drive de CD ROM Impedir que o form seja arrastado para fora das margens da tela Mostrar mensagem mesmo que esteja no Prompt do DOS Copiar todos os registros de uma tabela para o Clipboard Copiar um registro de uma tabela para o Clipboard Criar sub diretrio no diretrio do EXE Ocultar o aplicativo do CTRL+ALT+DEL Pg 145 146 146 146 147 148 148 149 149 149 150 150 151 151 152 153 154 154 154 156 157 157 158 158 158 159 159 159 159 160 160 161 161 162
gondraf@hotmail.com
35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72.
Personalizar a caixa de mensagem de excees (erro) do Delphi Implementar procedure Delay do Pascal no Delphi Enviar comandos de rolagem vertical para um TMemo Criar uma DLL de Bitmaps e usa- la Construir a barra de ttulo do form com um Panel Criar form sem ttulo que possa ser arrastado Obter status da memria do sistema Definir data/hora de um arquivo Mostrar o dilogo About (Sobre) do Windows Ocultar/exibir o cursor do mouse Converter de Hexadecimal para Inteiro Mudar a cor de um DBEdit dentro de um DBCtrlGrid de acordo com uma condio Colocar uma ProgressBar da StatusBar Executar um programa e aguardar sua finalizao antes de continuar Simular o pressionamento de uma combinao de teclas (ex: Ctrl+F2) Simular o pressionamento de uma tecla Ligar/desligar a tecla Caps Lock Verificar se uma determinada tecla est pressionada Verificar o estado de NumLock e CapsLock Configurar linhas de diferentes alturas em StringGrid Adicionar o evento OnClick do DBGrid Criar caixas de dilogo em tempo de execuo Converter a primeira letra de um Edit para maisculo Verificar se uma string contm uma hora vlida Verificar se uma string contm um valor numrico vlido Mostrar uma mensagem durante um processamento Mostrar um cursor de ampulheta durante um processamento Ler e escrever dados binrios no Registro do Windows Mudar a resoluo do vdeo via programao Ler e escrever dados no Registro do Windows Adicionar barra de rolagem horizontal no ListBox Simular um CharCase no DBGrid Verificar se uma string uma data vlida Fazer pesquisa incremental com DBGrid e Edit Adicionar zeros esquerda de um nmero Limpar um campo tipo data via programao Implementar um campo auto incremental via programao Obter o endereo IP do Dial Up
162 163 163 164 165 165 166 166 167 167 168 168 168 169 170 170 171 171 172 172 172 173 174 175 175 175 176 176 178 178 179 180 180 180 181 181 182 182
gondraf@hotmail.com
73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110.
Exibir a caixa de dilogo padro de solicitao de senha do banco de dados Obter a verso da biblioteca ComCtl32.DLL (usada na unit ComCtrls do Delphi) Implementar rotinas assembly em Pascal Exibir o dilogo About do Windows Obter a linha e coluna atual em um TMemo Exibir um arquivo de ajuda do Windows Obter o valor de uma varivel de ambiente Determinar se uma janela (form) est maximizada Determinar se o cursor do mouse est em determinado controle Determinar se o aplicativo est minimizado Fechar um aplicativo com uma mensagem de erro fatal Usar o evento OnGetText de um TField Maximizar um form de forma que cubra toda a tela, inclusive a barra de tarefas Verificar, via programao, se Local Share do BDE est TRUE Criar um EXE que seja executado apenas atravs de outro EXE criado por mim Resolver "Internal error near: IBCheck" do Interbase 5.1.1 Server no NT Inverter os botes do mouse Obter/definir o tempo mximo do duplo click do mouse Obter os atributos de um arquivo/diretrio Obter o espao total e livre de um disco Obter o tipo de um drive (removvel, fixo, CD ROM, unidade de rede, etc) Obter informaes de um volume/disco (label, serial, sistema de arquivos, etc) Alterar o nome de volume (Label) de um disco Saber quais as unidades de disco (drives) esto presentes "truncar" valores reais para apenas n casas decimais Excluir todos os registros de uma tabela (como DELETE ALL do Clipper) Saber se o sistema est usando 4 dgitos para o ano Imprimir caracteres acentuados diretamente para a impressora Imprimir texto justificado com formatao na impressora Epson LX300 Formatar um disquete atravs de um programa Delphi Alterar (e restaurar) o tamanho da pgina na impressora Reproduzir um arquivo de som WAV sem o TMediaPlayer Obter o nome do usurio e da empresa informado durante a instalao do Windows Mostrar uma barra de progresso enquanto copia arquivos Copiar arquivos usando o Shell do Windows Descobrir o cdigo ASCII de uma tecla Evitar que seu programa aparea na barra de tarefas Usar eventos de som do Windows
183 183 184 184 185 185 185 186 186 187 187 187 188 188 188 189 189 190 190 190 191 192 192 192 193 193 194 194 194 195 196 197 197 197 197 198 198 199
gondraf@hotmail.com
111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148.
Mudar a coluna ativa em um DBGrid via programao Fechar o Windows a partir do seu programa Carregar um cursor animado (.ani) Enviar um arquivo para a lixeira Obter o nmero do registro atual Trabalhar com Filter de forma mais prtica Reproduzir um arquivo WAV Executar um programa DOS e fecha- lo em seguida Fechar um programa a partir de um programa Delphi Colocar Hint's de vrias linhas Reproduzir um vdeo AVI em um Form Separar (filtrar) caracteres de uma string Colocar zeros esquerda de nmeros Copiar arquivos usando curingas (*.*) Copiar arquivos Trabalhar com cores no formato string Verificar se determinado programa est em execuo (Word, Delphi, etc) Excluir arquivos usando curingas (*.*) Gerar uma tabela no Word atravs do Delphi Obter a quantidade de registros total e visvel de uma tabela Evitar que um programa seja executado mais de uma vez Executar um "COMMIT" no Delphi Posicionar Form's em relao ao Desktop do Windows Saber a resoluo de tela atual Verificar se uma unidade de disco (disk drive) est preparada Salvar/restaurar o tamanho e posio de Form's Definir a quantidade de registros a ser impressa em uma pgina do QuickReport Onde encontrar tutoriais sobre construo de componentes em Delphi Para que servem OnGetEditMask, OnGetEditText e OnSetEditText do TStringGrid Mostrar um Form de LogOn antes do Form principal Limitar a regio de movimentao do mouse Descobrir o nome de classe de uma janela do Windows Ocultar/exibir a barra de tarefas do Windows Evitar a proteo de tela durante seu programa Fazer a barra de ttulo ficar intermitente (piscante) Posicionar o cursor do mouse em um controle Criar cores personalizadas (sistema RGB) Adicionar uma nova fonte no Windows
199 199 199 200 200 200 201 201 201 201 202 202 203 203 203 204 204 204 205 206 206 207 207 208 208 209 210 210 210 211 212 212 213 213 213 214 215 215
gondraf@hotmail.com
149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186.
Saber se a impressora atual possui determinada fonte Saber se determinada Font est instalada no Windows Acertar a data e hora do sistema atravs do programa ENTER em vez de TAB no formulrio, no DBGrid e no StringGrid Simular a vrgula atravs do ponto do teclado numrico Paralizar um programa durante n segundos Criar uma tabela (DB, DBF) atravs do seu programa Verificar se um diretrio existe Verificar se um arquivo existe Criar um Alias temporrio atravs do seu programa Criar um Alias atravs do seu programa Icone na Barra de Tarefas Abrir arquivos com aplicativo associado Adiciona a barra invertida a um texto selecionado Apagar um subdiretrio Como verificar se um arquivo existe? Compara dois arquivos textos Copiando arquivos de diretrio para diretrio Copiando Um Arquivo Com Um Gauge Exibindo as propriedades do arquivo Lendo e gravando arquivos de texto Procurando um arquivo em todo o HD Acessando o banco de dados Oracle a partir do Delphi Alterando o NetDir via programao Apagando todos os registros da tabela Armazenando sons, vdeos em bancos de dados Backup & Restaurao Como acessar pelo Delphi, tabelas no Acess Como alterar o driver de acesso do access no bde automaticamente Como converter DBF para Paradox e Acess para Paradox Como importar dados de um arquivo texto para uma Tabela Evitando o erro de Key Violation Gravar imagem JPG em tabela Paradox Ler imagem JPG da tabela Paradox Listando os campos da tabela num Memo PARADOX EM REDE Alterando a fonte de determinado registro em um DBGrid Alterando cor de linha de um DBGrid
215 215 215 216 216 217 217 218 218 218 218 220 221 222 222 223 223 224 224 226 227 228 230 233 234 234 235 236 236 237 237 238 239 240 240 240 241 241
gondraf@hotmail.com
187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214.
DbGrid Zebrado Procura e substituio de string num campo memo Sql relacionada com a primeira letra Consultar por ms de um campo data Colocar o mes por extenso Retornar quantidade de dias meses e anos entre duas datas Alinhar Panel ao Centro do Formulrio Colorao Gradiente no Form Como Criar Forms em Tempo de Execuo Como evitar efeito de maximizao Como Saber se o aplicativo j foi aberto Criando janelas no retangulares Form com um furo Formulrio Transparente Texto Na Diagonal e Girando Como Bloquear Mouse e Teclado Detectando o Numero Serial do HD Como desenhar um Bitmap num form Converte um arquivo JPEG em BMP Carregar um cursor animado (*.ani) Como pegar a posio do mouse na tela Como Alterar o Volume do Som do Computador Com o Delphi Gravando Sons do Microfone Com o Delphi Como converter decimal para romanos Alinhar Texto do Edit Direita Como Limpar Todos os Edit's de um Form de uma s vez? Baixando arquivos da internet Chamar um e-mail pelo Delphi
241 242 242 243 244 245 245 245 246 246 247 247 247 247 248 249 249 250 250 251 251 251 252 252 253 253 253 254
Pintar um Bitmap diretamente no Canvas do Form - Declare a variavel Bmp na seo private: private Bmp: TBitmap; - Coloque um boto no Form e no evento OnClick digite: Bmp:= TBitMap.Create; try Bmp.LoadFromFile('c:\teste\arquivo.bmp'); Canvas.Draw(0,0, Bmp); finally Bmp.Free;
gondraf@hotmail.com
end; Verificar se a impressora est ligada Os possveis parmetros para esta funo so: 1 - para LPT1 2 - para LPT2 3 - para LPT3 4 - para LPT4 function tbTestLPT(Port: byte): boolean; var Pto : Word; Rdo : byte; begin Pto := Port -1; asm MOV DX,Pto MOV AX,$0200 {AH := $02 : Leer el estado de la impresora} INT $17 MOV Rdo,AH {Guarda el estado en AL} end; Result := Rdo = 144; end; Observaes: Provavelmente esta funo no funcionar em Windows NT devido ao acesso em baixo nvel. Obter a letra do drive onde est o Windows Inclua na seo uses: Windows function GetWindowsDrive: Char; var S: string; begin SetLength(S, MAX_PATH); if GetWindowsDirectory(PChar(S), MAX_PATH) > 0 then Result := string(S)[1] else Result := #0; end; { Exemplo de uso: } procedure TForm1.Button1Click(Sender: TObject); begin Caption := GetWindowsDrive; end; Mostrar o nome do EXE no caption do form { Esta funo extrai apenas o nome do arquivo passado, sem path e extenso } function Titulo(Nome: String): String; var N, D: String; begin N := ExtractFileName(Nome); { Retira o path }
gondraf@hotmail.com
D := ChangeFileExt(N,''); { Retira a extenso } { Coloca a primeira letra em maiscula e o resto em minscula } Titulo := UpperCase(Copy(D,1,1)) + LowerCase(Copy(D,2,Length(D)-1)); end; { No OnCreate do form, coloque: } procedure TForm1.FormCreate(Sender: TObject); begin Caption := Titulo(ParamStr(0)); end; Fazer pesquisa incremental apenas com DBGrid - Coloque no form: TTable, TDataSource, TDBGrid e TLabel. - Ajuste as propriedades do Table1: DatabaseName = seu alias TableName = sua tabela Active = true - Ajuste as propriedades do DataSource1: DataSet = Table1 - Ajuste as propriedades do DBGrid1: DataSource = DataSource1 Options -> dgEditing = false ReadOnly = true * Pode tambm ajustar a propriedades Columns para escolher as colunas que sero exibidas. - Na seo private da unit declare: private FTexto: string; - No evento OnCreate do form coloque: FTexto := ''; Label1.Caption := ''; - No evento OnKeyPress do DBGrid1: procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char); begin if Key in [#8, #32..#255] then begin if Key = #8 then { BackSpace } FTexto := Copy(FTexto, 1, Length(FTexto)-1) else FTexto := FTexto + Key; { Posiciona na coluna Nome } Table1.FieldByName('Nome').FocusControl; { Escolhe o ndice e procura } Table1.IndexFieldNames := 'Nome'; Table1.FindNearest([FTexto]);
gondraf@hotmail.com
{ Mostra o texto procurado } Label1.Caption := FTexto; end; end; Observaes No nosso exemplo estamos pesquisando atravs do campo "Nome". Para esta pesquisa precisamos de um ndice com este campo. Obter tipo de uma propriedade Inclua na seo uses: TypInfo { Esta funo retorna uma string com o nome do tipo de dado de uma propriedade. Exemplos de retornos: PropType(Button1, 'Caption'); // Retorna 'TCaption' PropType(Edit1, 'Width'); // Retorna 'Integer'; PropType(Edit1, 'Color'); // Retorna 'TColor';} function PropType(const Obj: TObject; const PropName: string): string; var Info: PPropInfo; begin Info := GetPropInfo(Obj.ClassInfo, PropName); if Assigned(Info) then Result := Info^.PropType^.Name else Result := ''; end; { Exemplo de uso: - Coloque um TButton e um TEdit; - No OnClick do Button1 coloque o cdigo abaixo; - Execute, digite 'Caption' no Edit1 e clique em Button1.} procedure TForm1.Button2Click(Sender: TObject); begin ShowMessage(PropType(Button1, Edit1.Text)); end; Consulta SQL que usa a data do sistema Query.Close; Query.SQL.Text := 'select * from Tabela where CampoData <= :Hoje'; Query.ParamByName('Hoje').AsDate := Date; Query.Open; Observaes: Este exemplo foi testado com tabelas Paradox, mas deve funcionar na maioria dos bancos de dados com pouca ou nenhuma alterao. Abrir uma coneco Dial-Up Inclua na seo uses: Windows { A funo abaixo abre a caixa de dilogo de coneco com a rede Dial-Up. O parmetro "name" o nome da coneco previamente configurada.} procedure DialUpConnect(const Name: string);
gondraf@hotmail.com
begin WinExec(PChar('rundll32.exe rnaui.dll,RnaDial ' + Name), SW_SHOW); end; { Exemplo de uso: } procedure TForm1.Button1Click(Sender: TObject); begin DialUpConnect('NomeDaConeco'); end; Pintar uma imagem JPG no form Inclua na seo uses: Graphics, JPeg Para trabalhar com arquivos JPG voc precisa usar um objeto TPicture, assim como colocar no uses a unit JPeg. Siga os passos abaixo para pintar uma imagem JPG no form: - No evento OnPaint do form coloque o cdigo abaixo: procedure TForm1.FormPaint(Sender: TObject); var Imagem: TPicture; begin Imagem := TPicture.Create; try Imagem.LoadFromFile('c:\teste\foto.jpg'); Canvas.StretchDraw(ClientRect, Imagem.Graphic); finally Imagem.Free; end; end; - E no evento OnResize do form, coloque: procedure TForm1.FormResize(Sender: TObject); begin Repaint; end; Observaes No se esquea de trocar o nome do arquivo JPG conforme sua necessidade. Este exemplo foi elaborado usando Delphi4. Executar comando do MS-DOS Usando WinExec voc pode executar qualquer comando do DOS. Para isto chame o COMMAND.COM passando como parmetro a linha de comando a ser executada. O parmetro /C opcional e faz com que a janela do DOS seja fechada assim que o comando terminar. No exemplo abaixo estou executando a seguinte linha de comando: DIR C:\*.* WinExec('COMMAND.COM /C DIR C:\*.*', SW_SHOW); Observaes Para que a janela do DOS no seja exibida, use SW_HIDE no lugar de SW_SHOW. Formatar CEP { Esta funo forma CEP como: 99.999-999 }
gondraf@hotmail.com
function tbFormataCEP(const CEP: string): string; var I: integer; begin Result := ''; for I := 1 to Length(CEP) do if CEP[I] in ['0'..'9'] then Result := Result + CEP[I]; if Length(Result) <> 8 then raise Exception.Create('CEP invlido.') else Result := Copy(Result, 1, 2) + '.' + Copy(Result, 3, 3) + '-' + Copy(Result, 6, 3); end; === Para testar === - Coloque um Edit e um Button no form; - No evento OnClick do Button coloque a instruo abaixo: Edit1.Text := tbFormataCEP(Edit1.Text); Observaes Para formatar outros cdigos como CPF, CGC, etc., pode-se usar a mesma idia. Permitir cancelar processo demorado Em aplicativos para Windows comum, em processamentos demorados, o programa mostrar uma janela de dilogo avisando que o processo pode levar um tempo extra. Nesta mesma janela normalmente coloca-se tambm um boto "Cancelar" que d ao usurio a opo aguardar ou desistir do processo. Para fazer isto em um aplicativo Delphi, siga os passos abaixo: - Vamos considerar em nosso exemplo que o processamento ocorre na unit do Form1. - Declare, na seo public do Form1, uma varivel boolean. public; Cancelar: boolean; - Crie um novo form (vou cham-lo de Form2); - Coloque um boto neste novo form. Programe o OnClick deste boto conforme abaixo: Form1.Cancelar := true; - Na parte onde ocorre o loop do processamento demorado coloque algo como: try { Antes de comear o processamento } Form2.Caption := 'Processamento demorado...'; Form2.Show; { No incio do loop "Cancelar" precisa ser false } Cancelar := false; { Aqui inicia o loop do processamento demorado }
gondraf@hotmail.com
while {...} do begin { ... Processa algo aqui... } { Permite que o programa processe mensagens do Windows } Application.ProcessMessages; { Se a varivel "Cancelar" foi alterada para true... } if Cancelar then begin ShowMessage('Operao cancelada pelo usurio.'); Break; { Sai do loop } end; end; finally Form2.Close; end; Observaes No se esquea de que o Form1 precisa usar Form2 e vice-versa. Descobrir se uma data fim do ms Inclua na seo uses: SysUtils { Esta funo retorna true se a data passada como parmetro fim de ms. Retorna false caso contrrio. } function tbFimDoMes(const Data: TDateTime): boolean; var Ano, Mes, Dia: Word; begin DecodeDate(Data +1, Ano, Mes, Dia); Result := Dia = 1; end; Programar teclas de atalho do Windows Inclua na seo uses: Windows, Dialogs - No evento OnCreate do form coloque o cdigo abaixo: procedure TForm1.FormCreate(Sender: TObject); begin if not RegisterHotkey(Handle, 1, MOD_CONTROL or MOD_ALT, VK_F11) then ShowMessage('Erro ao programar Ctrl+Alt+F11'); if not RegisterHotkey(Handle, 2, MOD_CONTROL or MOD_ALT, VK_F12) then ShowMessage('Erro ao programar Ctrl+Alt+F12'); end; - No evento OnDestroy do form coloque o cdigo abaixo: procedure TForm1.FormDestroy(Sender: TObject); begin UnRegisterHotkey(Handle, 1); UnRegisterHotkey(Handle, 2); end; - Declere a procedure abaixo na seo private: private
gondraf@hotmail.com
procedure WMHotkey(var Msg: TWMHotkey); message WM_HOTKEY; - Abaixo da palavra implementation escreva a procedure: procedure TForm1.WMHotkey(var Msg: TWMHotkey); begin case Msg.HotKey of 1: WinExec('calc.exe', SW_SHOW); 2: ShowMessage('Ctrl+Alt+F12 foram pressionadas'); end; end; - Execute este programa e experimente pressionar Ctrl+Alt+F11 ou Ctrl+Alt+F12. Observaes Se a combinao de teclas j estiver em uso (num atalho, por exemplo), no ser possvel us-la em nossa aplicao. Existem outras formas de implementar teclas de atalho em programas escritos em Delphi, mas a forma apresentada bastante funcional. Obter o tipo de dado de um valor no Registro do Windows Inclua na seo uses: Registry, Dialogs - Coloque um boto no form; - Altere o evento OnClick do boto conforme abaixo: procedure TForm1.Button1Click(Sender: TObject); const cRegPath = 'System\CurrentControlSet\control\FileSystem'; cRegValue = 'ACDriveSpinDown'; var Reg: TRegistry; S: string; begin Reg := TRegistry.Create; try Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.OpenKey(cRegPath, false) then begin case Reg.GetDataType(cRegValue) of rdUnknown: S := 'Tipo Desconhecido'; rdString: S := 'String'; rdExpandString: S := 'ExpandString'; rdInteger: S := 'Inteiro'; rdBinary: S := 'Binrio'; end; ShowMessage(S); end else ShowMessage('Erro ao abrir chave do Registro'); finally Reg.Free; end; end; Observaes A unit Dialogs foi acrescentada no uses somente para podermos usar a procedure ShowMessage. Obter a clula de um StringGrid que est sob o cursor do mouse Inclua na seo uses: Windows
gondraf@hotmail.com
Esta procedure pega a linha e coluna da clula onde estiver o mouse. Valores negativos para Linha ou Coluna indicam que o mouse est fora da rea cliente do StringGrid procedure MouseCell(Grid: TStringGrid; var Coluna, Linha: integer); var Pt: TPoint; begin GetCursorPos(Pt); Pt := Grid.ScreenToClient(Pt); if PtInRect(Grid.ClientRect, Pt) then Grid.MouseToCell(Pt.X, Pt.Y, Coluna, Linha) else begin Coluna := -1; Linha := -1; end; end; Exemplo de uso: - Coloque um boto no form; - Altere o evento OnClick deste boto como abaixo: procedure TForm1.Button1Click(Sender: TObject); var Coluna, Linha: integer; begin MouseCell(StringGrid1, Coluna, Linha); if (Coluna >= 0) and (Linha >= 0) then Caption := 'Coluna: ' + IntToStr(Coluna) + ' - ' + 'Linha: ' + IntToStr(Linha); else Caption := 'O mouse no est no StringGrid'; end; Para testar: - Execute o programa; - Posicione o cursor do mouse sobre alguma clula do StringGrid; - Pressione TAB at chegar ao boto e pressione ENTER; - O resultado ser mostrado no Caption do form; Observaes Note que a procedure MouseCell usa um valor negativo (-1) para coluna e linha se o mouse no estiver sobre o StringGrid. Limpar todas as clulas de um StringGrid Existem trs mtodos que podemos aplicar para limpar um StringGrid. { Limpando uma clula de cada vez: } procedure TForm1.Button1Click(Sender: TObject); var I, J: integer; begin with StringGrid1 do for I := 0 to ColCount -1 do for J := 0 to RowCount -1 do Cells[I,J] := '';
gondraf@hotmail.com
end; { Limpando uma linha de cada vez: } procedure TForm1.Button2Click(Sender: TObject); var I: integer; begin with StringGrid1 do for I := 0 to RowCount -1 do Rows[I].Clear; end; { Limpando uma coluna de cada vez: } procedure TForm1.Button3Click(Sender: TObject); var I: integer; begin with StringGrid1 do for I := 0 to ColCount -1 do Cols[I].Clear; end; Observaes Em todos os exemplos estamos limpando o StringGrid completamente, inclusive linhas e colunas fixas. Para preservar linhas ou colunas fixas troque os valores iniciais de I ou J conforme a necessidade. Programar meu aplicativo para abrir arquivos a partir do Windows Explorer Inclua na seo uses: Registry Para fazer isto ser necessria a criao de algumas chaves no Registro do Windows. O exemplo abaixo cria todas as chaves necessrias. - Coloque um TButton e no evento OnClick dele coloque o cdigo abaixo: procedure TForm1.Button1Click(Sender: TObject); var Reg: TRegistry; begin Reg := TRegistry.Create; try Reg.RootKey := HKEY_CLASSES_ROOT; Reg.LazyWrite := false; Define o nome interno (ArquivoAluno) e uma legenda que aparecer no Windows Explorer (Arquivo do Aluno) Reg.OpenKey('ArquivoAluno', true); Reg.WriteString('', 'Arquivo do Aluno'); Reg.CloseKey; { Define o comando a ser executado quando abrir um arquivo pelo Windows Explorer (NomeDoExe %1). O smbolo %1 indica que o arquivo a ser aberto ser passado como primeiro parmetro para o aplicativo ParamStr(1). } Reg.OpenKey('ArquivoAluno\shell\open\command', true); Reg.WriteString('', ParamStr(0) + ' %1'); { NomeDoExe %1 }
gondraf@hotmail.com
Reg.CloseKey; { Define o cone a ser usado no Windows Explorer: 0 - primeiro cone do EXE 1 - segundo cone do EXE, etc } Reg.OpenKey('ArquivoAlunol\DefaultIcon', true); Reg.WriteString('', ParamStr(0) + ',0'); { 0 = primeiro cone } Reg.CloseKey; { Define as extenses de arquivos que sero abertos pelo aplicativo } { *.dpg } Reg.OpenKey('.dpg', true); Reg.WriteString('', 'ArquivoAluno'); Reg.CloseKey; { *.alu } Reg.OpenKey('.alu', true); Reg.WriteString('', 'ArquivoAluno'); Reg.CloseKey; finally Reg.Free; end; end; - Coloque um TMemo; - No evento OnShow do Form coloque o cdigo abaixo: procedure TForm1.FormShow(Sender: TObject); begin { Se o primeiro parmetro for um nome de arquivo existente... } if FileExists(ParamStr(1)) then { Carrega o contedo do arquivo no memo } Memo1.Lines.LoadFromFile(ParamStr(1)); end; *** Para testar *** - Execute este programa; - Clique no boto para criar as chaves no Registro do Windows; - Feche o programa; - Crie alguns arquivos com as extenses .dpg e .alu; - V ao Windows Explorer e procure pelos arquivos criados; - Experimente dar um duplo-clique sobre qualquer dos arquivos com uma das extenses acima. Observaes Existem outros recursos que podero ser configurados. Porm, para comear, este j um bom exemplo. Consultar por ms de um campo data Use uma Query como abaixo: - Coloque no form os seguintes componentes: * TQuery * TDataSource * TDBGrid * TEdit * TButton - Altere as propriedades dos componentes como abaixo: * Query1.DatabaseName = (alias do BDE)
gondraf@hotmail.com
* DataSource1.DataSet = Query1 * DBGrid1.DataSource = DataSource1 - Coloque o cdigo abaixo no evento OnClick de Button1: Query1.Close; Query1.SQL.Clear; Query1.SQL.Add('select * from dCli'); Query1.SQL.Add('where extract(month from DataNasc) = :Mes'); Query1.ParamByName('Mes').AsInteger := StrToInt(Edit1.Text); Query1.Open; - Execute. Digite um nmero de 1 a 12 no Edit e clique no boto. Observaes Os nmeros de 1 a 12 representam, respectivamente, os meses de Janeiro a Dezembro. Este exemplo foi testado com Delphi4, BDE5 e tabela Paradox7. Criando tabelas via SQL Inclua na seo uses: dbTables - Coloque um TButton no form; - Escreve no OnClick do Button como abaixo: procedure TForm1.Button1Click(Sender: TObject); var Q: TQuery; begin Q := TQuery.Create(Application); try Q.DatabaseName := 'SF'; with Q.SQL do begin Add('Create Table Funcionarios'); Add('( Codigo AutoInc,'); Add(' Nome Char(30),'); Add(' Salario Money,'); Add(' Depto SmallInt,'); Add(' Primary Key (Codigo) )'); end; Q.ExecSQL; finally Q.Free; end; end; Observaes Este exemplo foi testado com banco de dados Paradox, porm dever funcionar em vrios outros bancos de dados com pouca ou nenhuma alterao. Obter nomes dos campos de uma tabela Inclua na seo uses: dbTables, Classes, Forms A funo abaixo obtm os nomes de todos os campos de uma tabela do banco de dados. procedure tbGetFieldNames(const DBName, TblName: string; List: TStringList); var I: integer;
gondraf@hotmail.com
begin List.Clear; with TTable.Create(Application) do try DatabaseName := DBName; TableName := TblName; with FieldDefs do begin Update; for I := 0 to Count -1 do List.Add(Items[I].Name); end; finally Free; end; end; === Exemplo de uso === - Coloque um TMemo e um TButton no Form; - Coloque o cdigo abaixo no evento OnClick do Button: procedure TForm1.Button1Click(Sender: TObject); var List: TStringList; begin List := TStringList.Create; try tbGetFieldNames(Edit1.Text, Edit2.Text, List); Memo1.Lines.Assign(List); finally List.Free; end; end; Nomeando um relatrio no spool de impresso do Windows Inclua na seo uses: Printers Antes de enviar seu relatrio, faa assim: Printer.Title := 'Nome do relatrio'; Observaes Esta soluo aplica-se perfeitamente aos relatrios feitos usando o objeto Printer. Nos casos de geradores de relatrios, estes provavelmente possuem uma propriedade equivalente. Obter tamanho de um arquivo Inclua na seo uses: SysUtils { A funo abaixo retorna o tamanho do arquivo, ou -1 se o arquivo no for encontrado } function tbFileSize(const FileName: string): integer; var SR: TSearchRec; I: integer; begin I := FindFirst(FileName, faArchive, SR); try if I = 0 then
gondraf@hotmail.com
Result := SR.Size else Result := -1; finally FindClose(SR); end; end; Ocultar aplicao da lista de tarefas - CTRL+ALT+DEL - Declare a funo abaixo antes da palavra implementation: function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall; external 'KERNEL32.DLL'; - Coloque dois botes no Form; - No evento OnClick do Button1 coloque: RegisterServiceProcess(GetCurrentProcessID, 1); - No evento OnClick do Button2 coloque: RegisterServiceProcess(GetCurrentProcessID, 0); === Para testar === Clique no Button1 e pressione CTRL+ALT+DEL. O seu programa no aparecer na lista. Clique no Button2 e pressione CTRL+ALT+DEL. Agora seu programa aparecer na lista. Obter path de um Alias do BDE Inclua na seo uses: BDE { A funo abaixo retorna o path (caminho) de um Alias do BDE } function GetAliasPath(AliasName: String):String; var dbDes: DBDesc; begin Result:=''; DBiInit(Nil);// invoca o BDE , se no inicializado If DbiGetDatabaseDesc(PChar(AliasName), @dbDes)= DBIERR_NONE then with dbDes do Result:=StrPas(szPhyName); DBiExit;// Libera o BDE end; Observaes Se a unit em que essa rotina for colocada utilizar as units DB e DBTABLES, as chamadas a DbiInit() e DbiExit() podero ser omitidas. Ativar a proteo de tela do Windows Inclua na seo uses: Windows { Ativa a proteo de tela do Windows, se estiver configurada. } SendMessage(Application.Handle, WM_SYSCOMMAND, SC_SCREENSAVE, 0);
gondraf@hotmail.com
Desligar/Ligar monitor Inclua na seo uses: Windows No Win95 podemos desligar o monitor afim de economizar energia eltrica. Normalmente este recurso controlado pelo prprio Windows. Porm sua aplicao Delphi tambm pode fazer isto. O exemplo abaixo desliga o monitor, aguarde 5 segundos e religa monitor. SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0); Sleep(5000); { Aguarde 5 segundos } SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1); Observaes Este recurso pode no funcionar dependendo da configurao do sistema. Abrir e fechar o drive de CD-ROM Inclua na seo uses: MMSystem { Para abrir } mciSendString('Set cdaudio door open wait', nil, 0, handle); { Para fechar } mciSendString('Set cdaudio door closed wait', nil, 0, handle); Impedir que o form seja arrastado para fora das margens da tela - Na seo Private declare a procedure abaixo: private procedure WMMove(var Msg: TWMMove); message WM_MOVE; - Abaixo da palavra implementation escreva a procedure abaixo: procedure TForm1.WMMove(var Msg: TWMMove); begin if Left < 0 then Left := 0; if Top < 0 then Top := 0; if Screen.Width - (Left + Width) < 0 then Left := Screen.Width - Width; if Screen.Height - (Top + Height) < 0 then Top := Screen.Height - Height; end; Para testar: - Execute o programa e tente arrastar o form para fora das margens da tela e veja o que acontece. Mostrar mensagem mesmo que esteja no Prompt do DOS Inclua na seo uses: Windows Antes de mostrar a mensagem, coloque sua aplicao na frente das demais. SetForegroundWindow(Application.Handle); ShowMessage('Teste');
gondraf@hotmail.com
Copiar todos os registros de uma tabela para o Clipboard Inclua na seo uses: Clipbrd Siga os passos abaixo: - Crie seu form normalmente, colocando DataSource, Table e demais componentes; - Coloque um boto e no evento OnClick deste boto coloque o cdigo abaixo: procedure TForm1.Button1Click(Sender: TObject); const SeparadorCampoValor = ': '; SeparadorCampo = #13#10; { Quebra de linha } SeparadorRegistro = '===========' + #13#10; var S: string; I: integer; begin S := ''; Table1.First; while not Table1.EOF do begin for I := 0 to Table1.FieldCount -1 do S := S + Table1.Fields[I].FieldName + SeparadorCampoValor + Table1.Fields[I].AsString + SeparadorCampo; S := S + SeparadorRegistro; Table1.Next; end; Clipboard.AsText := S; end; Para testar: - Execute este aplicativo; - Clique no boto; - V em outro aplicativo (ex: MS-Word) e mande colar (Ctrl+V). Observaes CUIDADO! No use este recurso com tabelas grandes, pois poder usar memria demasiadamente. No teste que fiz, o tamanho da string S atingiu 20K e funcionou normalmente. Mas isto pode variar de uma mquina para outra. Copiar um registro de uma tabela para o Clipboard Inclua na seo uses: Clipbrd Siga os passos abaixo: - Crie seu form normalmente, colocando DataSource, Table e demais componentes; - Coloque um boto e no evento OnClick deste boto coloque o cdigo abaixo: procedure TForm1.Button1Click(Sender: TObject); const SeparadorCampoValor = ': '; SeparadorCampo = #13#10; { Quebra de linha } var S: string; I: integer; begin S := ''; for I := 0 to Table1.FieldCount -1 do
gondraf@hotmail.com
S := S + Table1.Fields[I].FieldName + SeparadorCampoValor +Table1.Fields[I].AsString + SeparadorCampo; Clipboard.AsText := S; end; Para testar: - Execute este aplicativo; - Clique no boto; - V em outro aplicativo (ex: MS-Word) e mande colar (Ctrl+V). Criar sub-diretrio no diretrio do EXE Inclua na seo uses: FileCtrl, SysUtils Primeiramente vamos conhecer algumas funes do Delphi que precisaremos us-las: ParamStr(Indice) - Retorna valores passados na linha de comando quando executamos o programa. Se o valor de Indice for 0 (zero) ser retornado o caminho+nome do EXE. ExtractFilePath(NomeArq) - Retorna o caminho (path) do nome de arquivo informado. Exemplo: S := 'C:\NomeDir\Programa.exe'; ExtractFilePath(S); { retorna: 'C:\NomeDir\' } DirectoryExists(CaminhoDir) - Retorna true se o diretrio informado existe. False em caso contrrio. CreateDir(CaminhoDir) - Tenta criar o diretrio informado. Se conseguir, retorna true. Caso contrrio retorna false. Agora que sabemos como trabalham estas funes, vamos escrever uma funo que precisamos para criar um sub-diretrio conforme proposto. function CriaSubDir(const NomeSubDir: string): boolean; var Caminho: string; begin Caminho := ExtractFilePath(ParamStr(0)) + NomeSubDir; if DirectoryExists(Caminho) then Result := true else Result := CreateDir(Caminho); end; Exemplo de uso: - Chame a funo no evento OnCreate do form: procedure TForm1.FormCreate(Sender: TObject); begin if not CriaSubDir('MeuSubDir') then ShowMessage('No foi possvel criar o sub-diretrio MeuSubDir.'); end; Ocultar o aplicativo do CTRL+ALT+DEL Inclua no implementation de seu programa a seguinte linha:
gondraf@hotmail.com
function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall; external 'KERNEL32.DLL'; e depois no OnCreate ponha a seguinte linha: RegisterServiceProcess(GetCurrentProcessID, 1); Isso vai fazer o programa nao aparecer no CTRL+ALT+DEL, mas seu form principal vai continuar aparecendo. Para ocultar tambm o form, basta por no OnCreate antes da linha acima a seguinte linha: Application.ShowMainForm:=False; Observaes Segundo o autor desta resposta, esta soluo foi testada em Win95, mas tambm deve funcionar em Win98. No sabe se funciona em NT. Personalizar a caixa de mensagem de excees (erro) do Delphi Siga os passos abaixo: - Declare um mtodo (procedure) na seo private do form principal conforme abaixo: private procedure ManipulaExcecoes(Sender: TObject; E: Exception); - V at a seo implementation e implemente este mtodo, conforme o exemplo: procedure TForm1.ManipulaExcecoes(Sender: TObject; E: Exception); begin MessageDlg(E.Message + #13#13 + 'Suporte tcnico:'#13 + 'tecnobyte@ulbrajp.com.br', mtError, [mbOK], 0); end; - No evento OnCreate do Form principal escreva o cdigo abaixo: procedure TForm1.FormCreate(Sender: TObject); begin Application.OnException := ManipulaExcecoes; end; === Para testar === - Coloque um Button no form; - No evento OnClick deste boto coloque o cdigo abaixo: procedure TForm1.Button1Click(Sender: TObject); begin StrToInt('ABCD'); { Isto provoca uma exception } end; Observaes Cuidado! No coloque cdigo que possa gerar exceo na rotina que manipula as excees, pois se ocorrer uma exceo neste rotina, esta ser chamada recursivamente at estourar a pilha.
gondraf@hotmail.com
Implementar procedure Delay do Pascal no Delphi Inclua na seo uses: Windows, Forms procedure Delay(MSec: Cardinal); var Start: Cardinal; begin Start := GetTickCount; repeat Application.ProcessMessages; until (GetTickCount - Start) >= MSec; end; === Exemplos de uso: === Delay(1000); { Aguarda 1 segundo } Delay(5000); { Aguarda 5 segundos } Delay(60000); { Aguarda 60 segundos - 1 minuto } Observaes Alm da procedure Delay criada acima, o programador Delphi pode usar tambm a API do Windows Sleep. H porm uma diferena: Delay permite que que o programa continue a processar as mensagens do Windows (mouse, teclado, etc). Enviar comandos de rolagem vertical para um TMemo Inclua na seo uses: Windows Utilizando mensagens do Windows isto fcil. Vejamos algums exemplos: SendMessage(Memo1.Handle, WM_VSCROLL, SBPAGEDOWN, 0); Onde: Memo1.Handle = manipulador da janela do Memo1. WM_VSCROLL = Mensagem do Windows - rolagem vertical. SB_PAGEDOWN = Comanndo de rolagem - pgina para baixo. Outros exemplos: { Pgina para cima } SendMessage(Memo1.Handle, WM_VSCROLL, SBPAGEUP, 0); { Linha para baixo } SendMessage(Memo1.Handle, WM_VSCROLL, SBLINEDOWN, 0); { Linha para cima } SendMessage(Memo1.Handle, WM_VSCROLL, SBLINEUP, 0); Observaes Alm desta tcnica existem API's do Windows que fazem um trabalho equivalente. Criar uma DLL de Bitmaps e us-la Siga os passos abaixo para criar a DLL de bitmaps: - Crie um arquivo de recursos (.RES) contendo os Bitmaps. Use o Image Editor do Delphi para criar este arquivo. Salve-o com o nome BMPS.RES na pasta onde ser salvo o projeto do Delphi; - Crie um novo projeto no Delphi; - Remova todos os forms do projeto;
gondraf@hotmail.com
- Salve este projeto com o nome DLLBmp.dpr; - Abra o arquivo de projeto (DLLBmp.dpr) e altere para ficar somente com as linhas abaixo: {$R BMPS.RES} library DLLBmp; end. - Compile o projeto (Ctrl+F9). Ser criado o arquivo DLLBmp.DLL. - Feche o projeto atual e crie um novo projeto; - Salve-o na mesma pasta que salvou o anterior, mas com outro nome qualquer; - Coloque no form um Edit e um Button; - No evento OnClick do Button coloque o cdigo abaixo: procedure TForm1.Button1Click(Sender: TObject); var Bmp: TBitmap; HandleDLL: THandle; begin { Carrega a DLL } HandleDLL := LoadLibrary('DLLBmp.DLL'); if HandleDLL = 0 then ShowMessage('No foi possvel carregar DLLBmp.DLL') else try Bmp := TBitmap.Create; try Bmp.Handle := LoadBitmap(HandleDLL, PChar(Edit1.Text)); if Bmp.Handle = 0 then ShowMessage('No foi possvel carregar o Bitmap.') else { Pinta o Bitmap no form } Canvas.Draw(0, 0, Bmp); finally Bmp.Free; end; finally { Libera a DLL } FreeLibrary(HandleDLL); end; end; === Para testar === - Execute este projeto; - Digite no Edit1 o nome que foi dado ao Bitmap no arquivo de recursos (.RES); - Clique no boto. O bitmap dever ser pintado no form. Observaes O arquivo DLL poder ser colocado na pasta onde estiver o EXE, no diretrio do Windows ou ainda no sub-diretrio System do Windows. Alm de bitmaps podemos colocar qualquer outro tipo de recurso em DLL's. Construir a barra de ttulo do form com um Panel Pegue o arquivo tbtitle.zip na seo Download do IntereSite: www.ulbrajp.com.br/~tecnobyte Criar form sem ttulo que possa ser arrastado Siga os passos abaixo:
gondraf@hotmail.com
- Crie um novo projeto; - Mude as seguintes propriedades do Form1: BorderStyle = bsNone, FormStyle = fsStayOnTop, - Coloque um Label; - Coloque um Timer; - Altere o evento OnTimer do Timer1 conforme abaixo: procedure TForm1.Timer1Timer(Sender: TObject); begin Label1.Caption := TimeToStr(Time); end; - Altere o evento OnCreate do Form1 conforme abaixo: procedure TForm1.FormCreate(Sender: TObject); begin Width := 80; Height := 40; Label1.Left := 10; Label1.Top := 10; end; - V na seo private do Form1 e declare a procedure abaixo: private procedure WMNCHitTest(var Msg: TMessage); message WM_NCHitTest; public { Public declarations } end; - V na seo implementation e escreva a procedure abaixo: implementation {$R *.DFM} procedure TForm1.WMNCHitTest(var Msg: TMessage); begin if GetAsyncKeyState(VK_LBUTTON) < 0 then Msg.Result := HTCAPTION else Msg.Result := HTCLIENT; end; - Execute e experimente arrastar form com o mouse. Observaes Para fechar este aplicativo pressione Alt+F4. Uma alternativa mais elegante colocar um menu local (PopupMenu) com um comando para fechar. Obter status da memria do sistema Inclua na seo uses: Windows, SysUtils - Coloque um TMemo no form - Coloque um TButton no form e altere seu OnClick conforme abaixo: procedure TForm1.Button1Click(Sender: TObject);
gondraf@hotmail.com
const cBytesPorMb = 1024 * 1024; var M: TMemoryStatus; begin M.dwLength := SizeOf(M); GlobalMemoryStatus(M); Memo1.Clear; with Memo1.Lines do begin Add(Format('Memria em uso: %d%%', [M.dwMemoryLoad])); Add(Format('Total de memria fsica: %f MB', [M.dwTotalPhys / cBytesPorMb])); Add(Format('Memria fsica disponvel: %f MB', [M.dwAvailPhys / cBytesPorMb])); Add(Format('Tamanho mximo do arquivo de paginao: %f MB', [M.dwTotalPageFile / cBytesPorMb])); Add(Format('Disponvel no arquivo de paginao: %f MB', [M.dwAvailPageFile / cBytesPorMb])); Add(Format('Total de memria virtual: %f MB', [M.dwTotalVirtual / cBytesPorMb])); Add(Format('Memria virtual disponvel: %f MB', [M.dwAvailVirtual / cBytesPorMb])); end; end; Definir data/hora de um arquivo Inclua na seo uses: SysUtils Esta funo altera a data e hora de um arquivo. Se obter sucesso retorna true, caso contrrio retorna false. function DefineDataHoraArq(NomeArq: string; DataHora: TDateTime): boolean; var F: integer; begin Result := false; F := FileOpen(NomeArq, fmOpenWrite or fmShareDenyNone); try if F > 0 then Result := FileSetDate(F, DateTimeToFileDate(DataHora)) = 0; finally FileClose(F); end; end; { Exemplo de uso 1: Usa a data atual do sistema (Now) } if DefineDataHoraArq('c:\teste\logo.bmp', Now) then ShowMessage('Data/Hora do arquivo definida com sucesso.') else ShowMessage('No foi possvel definir data/hora do arquivo.'); { Exemplo de uso 2: Usa uma data fixa } var DataHora: TDateTime; begin { Define a data para 5-Fev-1999 e a hora para 10:30 }
gondraf@hotmail.com
DataHora := EncodeDate(1999, 2, 5) + EncodeTime(10, 30, 0, 0); if DefineDataHoraArq('c:\teste\logo.bmp', DataHora) then ShowMessage('Data/Hora do arquivo definida com sucesso.') else ShowMessage('No foi possvel definir data/hora do arquivo.'); end; Mostrar o dilogo About (Sobre) do Windows Inclua na seo uses: ShellApi procedure TForm1.Button1Click(Sender: TObject); begin ShellAbout(Handle, 'Sistema Financeiro', 'Marcelo Senger', Application.Icon.Handle); end; Observaes Dica enviada por: Marcelo Senger Ocultar/exibir o cursor do mouse Inclua na seo uses: Windows - Escreva a funo abaixo: function MouseShowCursor(const Show: boolean): boolean; var I: integer; begin I := ShowCursor(LongBool(true)); if Show then begin Result := I >= 0; while I < 0 do begin Result := ShowCursor(LongBool(true)) >= 0; Inc(I); end; end else begin Result := I < 0; while I >= 0 do begin Result := ShowCursor(LongBool(false)) < 0; Dec(I); end; end; end; - Exemplos de uso: MouseShowCursor(false); { Oculta o cursor } MouseShowCursor(true); { Exibe o cursor } Converter de Hexadecimal para Inteiro Inclua na seo uses: SysUtils var I: integer; begin
gondraf@hotmail.com
I := StrToInt('$' + Edit1.Text); {...} end; Observaes No Delphi, um nmero na notao decimal deve iniciar com o smbolo $. Mudar a cor de um DBEdit dentro de um DBCtrlGrid de acordo com uma condio - Monte o form normalmente colocando DataSource, Table, DBCtrlGrid e os DBEdit's, DBText's, etc. - Escreva no manipulador do evento OnPaintPanel do DBCtrlGrid conforme abaixo: procedure TForm1.DBCtrlGrid1PaintPanel(DBCtrlGrid: TDBCtrlGrid; Index: Integer); begin if Table.FieldByName('NomeDoCampo').AsFloat < 0 then DBEdit1.Font.Color := clRed else DBEdit1.Font.Color := clBlue; end; Observaes Neste exemplo mudamos a cor da fonte do componente DBEdit, Porm, pode-se tambm mudar a cor do prprio componente (DBEdit1.Color). Colocar uma ProgressBar da StatusBar - Coloque uma StatusBar no form. - Adicione dois paineis na StatusBar (propriedade Panels). - Ajuste as propriedades do primeiro painel conforme abaixo: Style = psOwnerDraw Width = 150 - Coloque uma ProgressBar no form e mude sua propriedade Visible para false. - No evento OnDrawPanel da StatusBar digite o cdigo abaixo: procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect); begin { Se for o primeiro painel... } if Panel.Index = 0 then begin { Ajusta a tamanho da ProgressBar de acordo com o tamanho do painel } ProgressBar1.Width := Rect.Right - Rect.Left +1; ProgressBar1.Height := Rect.Bottom - Rect.Top +1; { Pinta a ProgressBar no DC (device-context) da StatusBar } ProgressBar1.PaintTo(StatusBar.Canvas.Handle, Rect.Left, Rect.Top); end; end; - Coloque um Button no form - Digite no evento OnClick do Button o cdigo abaixo: procedure TForm1.Button1Click(Sender: TObject); var I: integer; begin for I := ProgressBar1.Min to ProgressBar1.Max do begin { Atualiza a posio da ProgressBar }
gondraf@hotmail.com
ProgressBar1.Position := I; { Repinta a StatusBar para forar a atualizao visual } StatusBar1.Repaint; { Aguarda 50 milisegundos } Sleep(50); end; { Aguarde 500 milisegundos } Sleep(500); { Reseta (zera) a ProgressBar } ProgressBar1.Position := ProgressBar1.Min; { Repinta a StatusBar para forar a atualizao visual } StatusBar1.Repaint; end; - Execute e clique no boto para ver o resultado. Observaes Com um pouco de criatividade podemos fazer outras coisas interessantes usando o evento OnDrawPanel da StatusBar. Executar um programa e aguardar sua finalizao antes de continuar Inclua na seo uses: Windows function ExecAndWait(const FileName, Params: string; const WindowState: Word): boolean; var SUInfo: TStartupInfo; ProcInfo: TProcessInformation; CmdLine: string; begin { Coloca o nome do arquivo entre aspas. Isto necessrio devido aos espaos contidos em nomes longos } CmdLine := '"' + Filename + '"' + Params; FillChar(SUInfo, SizeOf(SUInfo), #0); with SUInfo do begin cb := SizeOf(SUInfo); dwFlags := STARTF_USESHOWWINDOW; wShowWindow := WindowState; end; Result := CreateProcess(nil, PChar(CmdLine), nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, PChar(ExtractFilePath(Filename)), SUInfo, ProcInfo); { Aguarda at ser finalizado } if Result then begin WaitForSingleObject(ProcInfo.hProcess, INFINITE); { Libera os Handles } CloseHandle(ProcInfo.hProcess); CloseHandle(ProcInfo.hThread); end; end; - Exemplo de uso: ExecAndWait('c:\windows\notepad.exe', '', SW_SHOW); Observaes No se esquea de informar o caminho (path) do arquivo completo. Esta funo foi desenvolvida para Delphi 32 bits (2, 3, 4,...).
gondraf@hotmail.com
Simular o pressionamento de uma combinao de teclas (ex: Ctrl+F2) Inclua na seo uses: Windows { Mantm pressionada CTRL } keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY or 0, 0); { Pressiona F2 } keybd_event(VK_F2, 0, 0, 0); { Libera (solta) CTRL } keybd_event(VK_CONTROL, $45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0); Observaes Neste exemplo pressionamos Ctrl+F2. No se esquea das teclas que precisam manter pressionadas: Ctrl, Alt, Shift. Simular o pressionamento de uma tecla Inclua na seo uses: Windows A API keybd_event do Windows serve para fazer isto. No exemplo abaixo estamos simulando o pressionamento da tecla F2: keybd_event(VK_F2, 0, 0, 0); Para testar faa o exemplo a seguir: - Mude a propriedade KeyPreview do form para true. - Escreva no evento OnKeyDown do form como abaixo: procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_F2 then ShowMessage('F2 pressionada'); end; - Coloque um boto e escreva no OnClick (do boto) como abaixo: procedure TForm1.Button1Click(Sender: TObject); begin keybd_event(VK_F2, 0, 0, 0); end; Observaes Consulte as constantes para os cdigos das teclas (ex: VK_RETURN, VK_DOWN, etc). Ligar/desligar a tecla Caps Lock Inclua na seo uses: Windows { Esta funo liga/desliga Caps Lock, conforme o parmetro State } procedure tbSetCapsLock(State: boolean); begin if (State and ((GetKeyState(VK_CAPITAL) and 1) = 0)) or ((not State) and ((GetKeyState(VK_CAPITAL) and 1) = 1)) then begin
gondraf@hotmail.com
keybd_event(VK_CAPITAL, $45, KEYEVENTF_EXTENDEDKEY or 0, 0); keybd_event(VK_CAPITAL,$45, KEYEVENTF_EXTENDEDKEY KEYEVENTF_KEYUP, 0); end; end; { Exemplos de uso: } tbSetCapsLock(true); { Liga Caps Lock }
or
tbSetCapsLock(false); { Desliga Caps Lock } Observaes Aparentemente, podemos usar esta mesma tcnica para ligar/desligar Num Lock. Neste caso trocaramos VK_CAPITAL por VK_NUMLOCK. Por incrvel que parea no funcionou (pelo menos no teste que fiz). E tem mais: isto est na documentao do (R)Windows. Verificar se uma determinada tecla est pressionada Inclua na seo uses: Windows { Esta funo retorna true se a tecla informada estiver pressionada. False em caso contrrio. } function tbKeyIsDown(const Key: integer): boolean; begin Result := GetKeyState(Key) and 128 > 0; end; { Exemplos de uso: } if tbKeyIsDown(VK_CONTROL) then { Tecla Ctrl pressionada } if tbKeyIsDown(VK_MENU) then { Tecla Alt pressionada } if tbKeyIsDown(VK_SHIFT) then { Tecla Shift pressionada } if tbKeyIsDown(VK_F2) then { Tecla F2 pressionada } Observaes Qualquer tecla pode ser verificada. Para isto basta saber o cdigo virtual (Virtual Key Code) da tecla. Verificar o estado de NumLock e CapsLock Inclua na seo uses: Windows { Esta funo retorna true se a tecla informada estiver ligada. False em caso contrrio } function tbKeyIsOn(const Key: integer): boolean; begin Result := GetKeyState(Key) and 1 > 0; end; { Exemplo de uso: } if tbKeyIsOn(VK_NUMLOCK) then { ... NumLock est ligada }
gondraf@hotmail.com
else { ... NumLock est desligada } Observaes Qualquer tecla que possua os estados On/Off pode ser verificada. Basta, para isto, saber seu cdigo. O cdigo de CapsLock VK_CAPITAL. Configurar linhas de diferentes alturas em StringGrid - Coloque o StringGrid no form. - No evento OnCreate do form coloque o cdigo abaixo: procedure TForm1.FormCreate(Sender: TObject); begin StringGrid1.RowHeights[0] := 15; StringGrid1.RowHeights[1] := 20; StringGrid1.RowHeights[2] := 50; StringGrid1.RowHeights[3] := 35; end; Observaes Cuidado para no especificar uma linha inexistente. Adicionar o evento OnClick do DBGrid - Monte seu form normalmente, colocando o DBGrid e demais componentes; - V na seo "private" da unit e declare a procedure abaixo: private procedure DBGridClick(Sender: TObject); - Logo aps a palavra "implementation", escreva a procedure: implementation {$R *.DFM} procedure TForm1.DBGridClick(Sender: TObject); begin ShowMessage('Clicou no DBGrid.'); end; - Coloque as instrues abaixo no evento OnCreate do Form: procedure TForm1.FormCreate(Sender: TObject); begin DBGrid1.ControlStyle := DBGrid1.ControlStyle + [csClickEvents]; TForm(DBGrid1).OnClick := DBGridClick; end; Observaes O segredo principal desta dica est OnCreate do Form. A primeira instruo ativa o evento OnClick. A segunda instruo acessa o manipulador do evento OnClick. Para isto precisamos tratar o DBGrid como se fosse Form, pois o evento OnClick est declarado como protegido (protected) na classe TDBGrid. Criar caixas de dilogo em tempo de execuo Inclua na seo uses: Forms, StdCtrls, Buttons
gondraf@hotmail.com
A funo abaixo demonstra a criao de uma caixa de dilogo que pode ser usada para permitir ao usurio digitar o seu nome: { Esta funo retorna true se for pressionado OK e false em caso contrrio. Se for OK, o texto digitado pelo usurio ser copiado para a varivel Nome } function ObterNome(var Nome: string): boolean; var Form: TForm; { Varivel para o Form } Edt: TEdit; { Varivel para o Edit } begin Result := false; { Por padro retorna false } { Cria o form } Form := TForm.Create(Application); try { Altera algumas propriedades do Form } Form.BorderStyle := bsDialog; Form.Caption := 'Ateno'; Form.Position := poScreenCenter; Form.Width := 200; Form.Height := 150; { Coloca um Label } with TLabel.Create(Form) do begin Parent := Form; Caption := 'Digite seu nome:'; Left := 10; Top := 10; end; { Coloca o Edit } Edt := TEdit.Create(Form); with Edt do begin Parent := Form; Left := 10; Top := 25; { Ajusta o comprimento do Edit de acordo com a largura do form } Width := Form.ClientWidth - 20; end; { Coloca o boto OK } with TBitBtn.Create(Form) do begin Parent := Form; { Posiciona de acordo com a largura do form } Left := Form.ClientWidth - (Width * 2) - 20; Top := 80; Kind := bkOK; { Boto Ok } end; { Coloca o boto Cancel } with TBitBtn.Create(Form) do begin Parent := Form; Left := Form.ClientWidth - Width - 10; Top := 80; Kind := bkCancel; { Boto Cancel } end; { Exibe o form e aguarda a ao do usurio. Se for OK... } if Form.ShowModal = mrOK then begin Nome := Edt.Text; Result := true; end; finally Form.Free;
gondraf@hotmail.com
end; end; Para chamar esta funo siga o exemplo abaixo: procedure TForm1.Button1Click(Sender: TObject); var S: string; begin if ObterNome(S) then Edit1.Text := S; end; Observaes Os componentes Label, Edit (var Edt) e BitBtn's (botes) no so destrudos explicitamente (Componente.Free). Isto no necessrio, pois ao cri-los informei como proprietrio o Form (ex: TLabel.Create(Form)). Neste caso, estes componentes so destrudos automaticamente ao destruir o Form (Form.Free). Converter a primeira letra de um Edit para maisculo with Edit2 do if Text <> '' then Text := AnsiUpperCase(Text[1]) + Copy(Text, 2, Length(Text)); Isto pode ser colocado, por exemplo, no OnExit do Edit. Voc pode tambm converter durante a digitao. Para isto coloque o cdigo abaixo no evento OnKeyPress do Edit: if Edit1.SelStart = 0 then Key := AnsiUpperCase(Key)[1] else Key := AnsiLowerCase(Key)[1]; Verificar se uma string contm uma hora vlida - Use a funo abaixo: function StrIsTime(const S: string): boolean; begin try StrToTime(S); Result := true; except Result := false; end; end; Verificar se uma string contm um valor numrico vlido - Use uma das funes abaixo, conforme o tipo de dado que se quer testar: function StrIsInteger(const S: string): boolean; begin try StrToInt(S); Result := true; except Result := false;
gondraf@hotmail.com
end; end; function StrIsFloat(const S: string): boolean; begin try StrToFloat(S); Result := true; except Result := false; end; end; Mostrar uma mensagem durante um processamento - Crie um form com a mensagem. Um pequeno form com um Label j suficiente. Aqui vou cham-lo de FormMsg. - V em Project|Options e passe o FormMsg de "Auto-create forms" para "Available forms". - Abaixo vou simular um processamento demorado, usando a API Sleep: procedure TForm1.Button1Click(Sender: TObject); var Form: TFormMsg; I: integer; begin Form := TFormMsg.Create(Self); try Form.Label1.Caption := 'Processamento demorado...'; Form.Show; for I := 1 to 5 do begin Form.UpDate; Sleep(1000); { Aguarda um segundo } end; finally Form.Free; end; end; Observaes A funo Sleep uma API do Windows e serve para paralisar a aplicao por um determinado dempo. Este tempo em milisegundos. Mostrar um cursor de ampulheta durante um processamento - Salve o cursor atual - Defina o novo cursor (crHourGlass ampulheta) - Faa o processamento - Restaure o cursor. var PrevCur: TCursor; begin PrevCur := Screen.Cursor; try Screen.Cursor := crHourGlass; { Coloque aqui as instrues do processamento } finally Screen.Cursor := PrevCur; end; end;
gondraf@hotmail.com
Observaes Existem diversos outros cursores pr-definidos no Delphi. D uma olhada na propriedade Cursor de um componente visual para ver uma lista de todos eles. Voc poder tambm criar o seu prprio cursor. Ler e escrever dados binrios no Registro do Windows Inclua na seo uses: Registry Coloque no Form: - trs edits; - dois botes. Logo abaixo da palavra implementation declare: type { Declara um tipo registro } TFicha = record Codigo: integer; Nome: string[40]; DataCadastro: TDateTime; end; - Escreva o evento OnClick do Button1 conforme abaixo: procedure TForm1.Button1Click(Sender: TObject); var Reg: TRegistry; Ficha: TFicha; begin { Coloca alguns dados na varivel Ficha } Ficha.Codigo := StrToInt(Edit1.Text); Ficha.Nome := Edit2.Text; Ficha.DataCadastro := StrToDate(Edit3.Text); Reg := TRegistry.Create; try { Define a chave-raiz do registro } Reg.RootKey := HKEY_CURRENT_USER; { Abre uma chave (path). Se no existir cria e abre. } Reg.OpenKey('Cadastro\Pessoas\', true); { Grava os dados (o registro) } Reg.WriteBinaryData('Dados', Ficha, SizeOf(Ficha)); finally Reg.Free; end; end; - Escreva o evento OnClick do Button2 conforme abaixo: procedure TForm1.Button2Click(Sender: TObject); var Reg: TRegistry; Ficha: TFicha; begin Reg := TRegistry.Create;
gondraf@hotmail.com
try { Define a chave-raiz do registro } Reg.RootKey := HKEY_CURRENT_USER; { Se existir a chave (path)... } if Reg.KeyExists('Cadastro\Pessoas') then begin { Abre a chave (path) } Reg.OpenKey('Cadastro\Pessoas', false); { Se existir o valor... } if Reg.ValueExists('Dados') then begin { L os dados } Reg.ReadBinaryData('Dados', Ficha, SizeOf(Ficha)); Edit1.Text := IntToStr(Ficha.Codigo); Edit2.Text := Ficha.Nome; Edit3.Text := DateToStr(Ficha.DataCadastro); end else ShowMessage('Valor no existe no registro.') end else ShowMessage('Chave (path) no existe no registro.'); finally Reg.Free; end; end; Observaes Qualquer tipo de dado pode ser gravado e lido de forma binria no registro do Windows. Para isto voc precisa saber o tamanho do dado. Para dados de tamanho fixo, use SizeOf(). Lembrete: no grave dados muito extensos no Registro do Windows (ex: imagens), pois isto prejudicar o desempenho do sistema. Mudar a resoluo do vdeo via programao - Coloque um ListBox no form - Modifique o OnCreate do form assim: procedure TForm1.FormCreate(Sender: TObject); var i : Integer; DevMode : TDevMode; begin i := 0; while EnumDisplaySettings(nil,i,Devmode) do begin with Devmode do ListBox1.Items.Add(Format('%dx%d %d Colors', [dmPelsWidth,dmPelsHeight, 1 shl dmBitsperPel])); Inc(i); end; end; - Coloque um boto no form - Altere o evento OnClick do boto conforme abaixo: procedure TForm1.Button1Click(Sender: TObject); var DevMode : TDevMode; begin EnumDisplaySettings(nil,Listbox1.ItemIndex,Devmode);
gondraf@hotmail.com
ChangeDisplaySettings(DevMode,0); end; Ler e escrever dados no Registro do Windows Inclua na seo uses: Registry - Coloque no form dois edits e dois botes. - No evento OnClick do Button1 escreva o cdigo abaixo: procedure TForm1.Button1Click(Sender: TObject); var Reg: TRegistry; begin Reg := TRegistry.Create; try { Define a chave-raiz do registro } Reg.RootKey := HKEY_CURRENT_USER; { Abre a chave (path). Se no existir, cria e abre. } Reg.OpenKey('MeuPrograma\Configurao', true); { Escreve um inteiro } Reg.WriteInteger('Numero', StrToInt(Edit1.Text)); { Escreve uma string } Reg.WriteString('Nome', Edit2.Text); finally Reg.Free; end; end; - No evento OnClick do Button2, escreva: procedure TForm1.Button2Click(Sender: TObject); var Reg: TRegistry; begin Reg := TRegistry.Create; try Reg.RootKey := HKEY_CURRENT_USER; if Reg.KeyExists('MeuPrograma\Configurao') then begin Reg.OpenKey('MeuPrograma\Configurao', false); if Reg.ValueExists('Numero') then Edit1.Text := IntToStr(Reg.ReadInteger('Numero')) else ShowMessage('No existe valor com o nome "Numero"'); if Reg.ValueExists('Nome') then Edit2.Text := Reg.ReadString('Nome') else ShowMessage('No existe valor com o nome "Nome"'); end else ShowMessage('No existe a chave no registro'); finally Reg.Free; end; end;
gondraf@hotmail.com
Observaes Use o aplicativo RegEdit.exe do windows para ver o registro. Cuidado para no alterar as configuraes do Windows! Adicionar barra de rolagem horizontal no ListBox { - Coloque um ListBox no form; - Altere o OnCreate do Form conforme abaixo:} procedure TForm1.FormCreate(Sender: TObject); var I, Temp, MaxTextWidth: integer; begin { Adiciona algumas linhas no ListBox } Listbox1.Items.Add('Linha 1'); Listbox1.Items.Add('Linha 2, longa para que seja necessria a barra de rolagem horizontal'); Listbox1.Items.Add('Linha 3'); if Listbox1.Items.Count > 1 then begin { Obtm o comprimento, em pixels, da linha mais longa } MaxTextWidth := 0; for I := 0 to Listbox1.Items.Count - 1 do begin Temp := ListBox1.Canvas.TextWidth(ListBox1.Items[I]); if Temp > MaxTextWidth then MaxTextWidth := Temp; end; { Acrescenta a largura de um "W" } MaxTextWidth := MaxTextWidth + Listbox1.Canvas.TextWidth('W'); { Envia uma mensagem ao ListBox } SendMessage(ListBox1.Handle, LB_SETHORIZONTALEXTENT, MaxTextWidth, 0); end; end; { Para ocultar use a instruo abaixo: } SendMessage(ListBox1.Handle, LB_SETHORIZONTALEXTENT, 0, 0); Simular um CharCase no DBGrid Para converter a digitao para maisculo, coloque isto no evento OnKeyPress do DBGrid: Key := AnsiUpperCase(Key)[1]; Para converter para minsculo, troque por: Key := AnsiLowerCase(Key)[1]; Verificar se uma string uma data vlida Escreva a funo abaixo: function tbStrIsDate(const S: string): boolean; begin try StrToDate(S); Result := true;
gondraf@hotmail.com
except Result := false; end; end; Para testar: - Coloque um Edit no form; - Coloque um Button; - No evento OnClick do boto coloque o cdigo abaixo: if tbStrIsDate(Edit1.Text) then ShowMessage(Edit1.Text + ' data vlida.') else ShowMessage(Edit1.Text + ' NO data vlida.'); Fazer pesquisa incremental com DBGrid e Edit - Crie um ndice na tabela com campo a ser usado na pesquisa. Coloque no Form: - Um DataSource - Um Table - Um DBGrid - Um Edit Altere as seguintes propriedades: - DataSource1.DataSet = Table1 - Table1.DatabaseName = 'NomeDoAlias' - Table1.TableName = 'NomeDaTabela' - Table1.IndexFieldNames = 'NomeDoCampo' - Table1.Active = true - DBGrid1.DataSource = DataSource1 Escreva a instruo abaixo no evento OnChange do Edit: Table1.FindNearest([Edit1.Text]); Observaes Este exemplo considera que o campo seja tipo string. Para outros tipos de campos pode ocorrer erro dependendo dos valores digitados no Edit1. Adicionar zeros esquerda de um nmero Existem vrias formas. Vejamos uma: function tbStrZero(const I: integer; const Casas: byte): string; var Ch: Char; begin Result := IntToStr(I); if Length(Result) > Casas then begin Ch := '*'; Result := ''; end else Ch := '0'; while Length(Result) < Casas do Result := Ch + Result; end;
gondraf@hotmail.com
{ Exemplo de como us-la: } var S: string; Numero: integer; {...} begin {...} S := tbStrZero(Numero, 6); {...} end; Observaes Se o comprimento desejado (Casas) no for suficiente para conter o nmero, sero colocados asteriscos. Limpar um campo tipo data via programao Table1.FieldByName('Data').Clear; { ou } Table1.FieldByName('Data').AsString := ''; Observaes Podemos usar este recurso para limpar tambm campos numricos, string, etc. Implementar um campo auto-incremental via programao Inclua na seo uses: dbTables procedure tbAutoInc(Table: TTable; const FieldName: string); var Q: TQuery; begin if not Table.FieldByName(FieldName).IsNull then Exit; Q := TQuery.Create(nil); try Q.DatabaseName := Table.DatabaseName; Q.SQL.Add('select max(' + FieldName + ') from ' + Table.TableName); Q.Open; try Table.FieldByName(FieldName).AsInteger := Q.Fields[0].AsInteger +1; finally Q.Close; end; finally Q.Free; end; end; { Chame esta procedure no evento BeforePost de um Table: } procedure TForm1.Table1BeforePost(DataSet: TDataSet); begin tbAutoInc(Table1, 'Codigo'); end;
gondraf@hotmail.com
Observaes A funo acima incrementa o campo somente se estiver vazio. Assim podemos dar ao usurio a opo de digitar neste campo ou deix-lo vazio para que seja auto-incrementado. Existem vrias outras formas de implementar este recurso. Obter o endereo IP do Dial-Up Inclua na seo uses: WinSock { Esta funo retorna o endereo IP do Dial-Up. } function GetLocalIP : string; type TaPInAddr = array [0..10] of PInAddr; PaPInAddr = ^TaPInAddr; var phe : PHostEnt; pptr : PaPInAddr; Buffer : array [0..63] of char; I : Integer; GInitData : TWSADATA; begin WSAStartup($101, GInitData); Result := ''; GetHostName(Buffer, SizeOf(Buffer)); phe :=GetHostByName(buffer); if phe = nil then Exit; pptr := PaPInAddr(Phe^.h_addr_list); I := 0; while pptr^[I] <> nil do begin result:=StrPas(inet_ntoa(pptr^[I]^)); result := StrPas(inet_ntoa(pptr^[I]^)); Inc(I); end; WSACleanup; end; Observaes Se o endereo IP for designado pelo servidor, a cada coneco teremos um endereo IP diferente e, obviamente, se no estivermos conectados, no conseguiremos obt-lo. Exibir a caixa de dilogo padro de solicitao de senha do banco de dados Inclua na seo uses: DbPwDlg { Coloque um boto no form e escreve seu evento OnClick como abaixo } procedure TForm1.Button1Click(Sender: TObject); var pw: TPasswordDialog; begin pw := TPasswordDialog.Create(Self); try pw.Caption := 'Banco de Dados'; pw.GroupBox1.Caption := 'Senha'; pw.AddButton.Caption := '&Adicionar'; pw.RemoveButton.Caption := '&Remover'; pw.RemoveAllButton.Caption := 'Remover &Tudo'; pw.OKButton.Caption := '&OK'; pw.CancelButton.Caption := '&Cancelar';
gondraf@hotmail.com
pw.ShowModal; finally pw.Free; end; end; Observaes As senhas adicionadas nesta caixa de dilogo so adicionadas na sesso (TSession) atual. Isto til quando colocamos senha em tabelas Paradox, ou mesmo quando trabalhamos com banco de dados Client Servidor, e queremos que o usurio digite a senha de acesso. Se no fizermos desta forma, nem adicionarmos via programao as senhas necessrias, esta caixa de dilogo ser mostrada quando o programa tentar abrir uma tabela com senha. A grande vantagem aqui que podemos traduzir os Caption's dos componentes. Obter a verso da biblioteca ComCtl32.DLL (usada na unit ComCtrls do Delphi) Inclua na seo uses: ComCtrls { A verso desta biblioteca determina a aparncia de alguns controles do Delphi, tais como ToolBar e CoolBar. O exemplo abaixo obtm a verso desta biblioteca. Para este exemplo, coloque um TEdit e um TButton no Form. O evento OnClick do boto escreva o cdigo abaixo: } procedure TForm1.Button1Click(Sender: TObject); var Ver: Cardinal; MaiorVer, MenorVer: Word; begin Ver := GetComCtlVersion; MaiorVer := HiWord(Ver); MenorVer := LoWord(Ver); Edit1.Text := IntToStr(MaiorVer) + '.' + IntToStr(MenorVer); end; Observaes Normalmente, a verso 4.72 est presente quando o Internet Explorer 4 est instalado. Implementar rotinas assembly em Pascal { O Delphi permite a implementao de rotinas assembly mescladas ao cdigo Pascal. No entrarei em detalhes minuciosos, mas darei alguns exemplos bsicos de como implementar rotinas simples que retornam nmeros inteiros.} { Soma dois inteiros de 8 bits } function Soma8(X, Y: byte): byte; asm mov al, &X add al, &Y end; { Soma dois inteiros de 16 bits } function Soma16(X, Y: Word): Word; asm mov ax, &X add ax, &Y end; { Soma dois inteiros de 32 bits } function Soma32(X, Y: DWord): DWord; asm mov eax, &X
gondraf@hotmail.com
add eax, &Y end; {Achamada a estas funes so feitas da mesma forma que chamamos uma funo Pascal. Exemplo: } var A: byte; begin A := Soma8(30, 25); { A = 55 } end; Exibir o dilogo About do Windows Inclua na seo uses: Windows { About padro do Windows } ShellAbout(Handle, 'Windows', '', 0); { Personalizada } ShellAbout(Handle, 'NomePrograma', 'Direitos autorais reservados a'#13'Fulano de Tal', Application.Icon.Handle); Obter a linha e coluna atual em um TMemo { === SOLUO 1 === } { Esta procedure obtm a linha e coluna atual de um TMemo } procedure tbGetMemoLinCol(Memo: TMemo; var Lin, Col: Cardinal); begin with Memo do begin Lin := Perform(EM_LINEFROMCHAR, SelStart, 0); Col := SelStart - Perform(EM_LINEINDEX, Lin, 0); end; end; { Use-a como abaixo: } var Lin, Col: Cardinal; begin tbGetMemoLinCol(Memo1, Lin, Col); { ... } end; { === SOLUO 2 === } var Lin, Col: integer; begin Lin := Memo1.CaretPos.y; Col := Memo1.CaretPos.x; {...} end; Exibir um arquivo de ajuda do Windows Inclua na seo uses: Windows
gondraf@hotmail.com
{ Voc precisa saber: - Caminho e nome do arquivo; - A estrutura do arquivo de Help. No exemplo abaixo abre o arquivo de ajuda da Calculadora do Windows e vai para o tpico n. 100} procedure TForm1.Button1Click(Sender: TObject); begin WinHelp(0, 'c:\Win95\Help\Calc.hlp', HELP_CONTEXT, 100); end; Observaes Para utilizar um arquivo de ajuda em seu programa desenvolvido em Delphi, basta usar os recursos do prprio Delphi. O exemplo acima somente para mostrar o uso de uma API para este fim. Obter o valor de uma varivel de ambiente Inclua na seo uses: Windows { Esta funo recebe o nome da varivel de ambiente que queremos acessar e retorna uma string com seu valor, ou uma string vazia se a varivel no existir. } function tbGetEnvVar(const VarName: string): string; var I: integer; begin Result := ''; { Obtm o comprimento da varivel } I := GetEnvironmentVariable('PATH', nil, 0); if I > 0 then begin SetLength(Result, I); GetEnvironmentVariable('PATH', PChar(Result), I); end; end; { Para us-la, faa como neste exemplo: } Edit1.Text := tbGetEnvVar('PATH'); Determinar se uma janela (form) est maximizada Inclua na seo uses: Windows if IsZoomed(Form1.Handle) then { Form1 est maximizado } else { Form2 NO est maximizado } Determinar se o cursor do mouse est em determinado controle Inclua na seo uses: Windows { Os exemplos abaixo verificam se o cursor do mouse est em Button1: } { Soluo 1: } var Pt: TPoint; Rct: TRect;
gondraf@hotmail.com
begin GetCursorPos(Pt); GetWindowRect(Button1.Handle, Rct); if PtInRect(Rct, Pt) then { Est no boto } else { NO est no boto } end; { Soluo 2: } var Pt: TPoint; begin GetCursorPos(Pt); if WindowFromPoint(Pt) = Button1.Handle then { Est no boto } else { No est no boto } end; Observaes A API GetWindowRect obtm o retngulo (TRect) ocupado por uma janela. Podemos usar GetClientRect para obter o somente da parte cliente da janela. Podemos tambm usar a propriedade BoundsRect que existe na maioria dos componentes visuais, ou mesmo informar qualquer outro retngulo da tela. Se usarmos a propriedade BoundsRect, precisaremos converter as coordenadas clientes para coordenadas de tela (com a funo ClientToScreen). Um lembrete: a soluo 2 s poder ser aplicada a controles ajanelados. Determinar se o aplicativo est minimizado Inclua na seo uses: Windows if IsIconic(Application.Handle) then { Minimizado } else { No minimizado } Observaes Pode-se verificar qualquer janela (form). S um lembrete: quando clicamos no boto de minimizar do form principal, na verdade ele oculto e o Application que minizado. Fechar um aplicativo com uma mensagem de erro fatal Inclua na seo uses: Windows procedure TForm1.Button1Click(Sender: TObject); begin FatalAppExit(0, 'Erro fatal na aplicao.'); end; Observaes A funo FatalAppExit uma API do Windows. Esta mostra uma caixa de dilogo (normalmente branca) com a mensagem passada no segundo parmetro. Quando a caixa de dilogo fechada a aplicao finalizada. O evento OnCloseQuery dos forms no so chamados quando usamos esta funo. Usar o evento OnGetText de um TField - Adicione todos os campos no Field Editor; - Clique no campo "Tipo"; - V ao Object Inspector e d um duplo-click
gondraf@hotmail.com
no evento OnGetText; - Neste evento, digite o cdigo abaixo: procedure TForm1.Table1TipoGetText(Sender: TField; var Text: String; DisplayText: Boolean); begin if DisplayText then begin case Table1Tipo.AsInteger of 1: Text := 'Promissria'; 2: Text := 'Duplicata'; 3: Text := 'Boleto'; else Text := 'Desconhecido'; end; end else Text := Table1Tipo.AsString; end; Observaes Ao exibir ser exibido os nomes. Mas ao digitar continue com os 1, 2, 3, etc. Para usar este recurso em relatrios, acesse a propriedade DisplayText em vez de AsString para obter o valor do campo. Maximizar um form de forma que cubra toda a tela, inclusive a barra de tarefas { um "maximizar" com jeitinho brasileiro... mas funciona. No evento OnShow do form coloque o cdigo abaixo: } Top := 0; Left := 0; Width := Screen.Width; Height := Screen.Height; Verificar, via programao, se Local Share do BDE est TRUE Inclua na seo uses: Registry, SysUtils, Windows { Esta funo retorna true se Local Share estiver "TRUE". Caso contrrio, retorna false. } function tbBDELocalShare: boolean; const BdeKey = 'SOFTWARE\Borland\Database Engine\Settings\SYSTEM\INIT'; Ident = 'LOCAL SHARE'; var Reg: TRegistry; begin Result := false; Reg := TRegistry.Create; try Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.OpenKey(BdeKey, False) then if Reg.ValueExists(Ident) then Result := UpperCase(Reg.ReadString(Ident)) = 'TRUE'; finally Reg.Free; end; end; { Use-a como abaixo: } if tbBDELocalShare then { Local Share est TRUE } else
gondraf@hotmail.com
{ Local Share est FALSE } Observaes A funo acima faz a verificao no registro do Windows. Por isto est sujeita a falha caso o BDE coloque as configuraes em outro local ( o caso do BDE salvar as configuraes no formato do Windows 3.x). O ideal seria usar uma API do BDE, mas at o momento no conheo uma que retorne esta informao. Caso algum saiba, queira por gentileza nos informar. Criar um EXE que seja executado apenas atravs de outro EXE criado por mim Inclua na seo uses: Windows Antes da linha "Application.Initialize;" de Prog1.dpr (programa a ser chamado), coloque o cdigo abaixo:} if ParamStr(1) <> 'MinhaSenha' then begin { Para usar ShowMessage, coloque Dialogs no uses } ShowMessage('Execute este programa atravs de Prog2.EXE'); Halt; { Finaliza } end; { No Form1 de Prog2 (programa chamador) coloque um boto e escreva o OnClick deste boto como abaixo:} procedure TForm1.Button1Click(Sender: TObject); var Erro: Word; begin Erro := WinExec('Pro2.exe MinhaSenha', SW_SHOW); if Erro <= 31 then { Se ocorreu erro... } ShowMessage('Erro ao executar o programa.'); end; Observaes Aqui o parmetro passado foi 'MinhaSenha'. Voc dever trocar 'MinhaSenha' por algo que apenas voc saiba (uma senha). Caso uma pessoa conhea esta senha, ser possvel chamar este programa passando-a como parmetro. Neste caso sua "trava" estar violada. Resolver "Internal error near: IBCheck" do Interbase 5.1.1 Server no NT Esse erro: 'Internal error near: IBCheck' acontece apenas em algumas mquinas NT 4. Na hora da instalao, criada uma chave com valor errado. Entre no registry do Windows e altere a opo, PATH de binrio para string, da chave: HKEY_CURRENT_USER\Environment Inverter os botes do mouse Inclua na seo uses: Windows { Para inverter: } SwapMouseButton(true); { Para voltar ao normal: } SwapMouseButton(false);
gondraf@hotmail.com
Obter/definir o tempo mximo do duplo-click do mouse Inclua na seo uses: Windows { - Coloque um boto no form e escreva seu OnClick como abaixo: } procedure TForm1.Button6Click(Sender: TObject); var Tempo: Cardinal; begin { Obtm } Tempo := GetDoubleClickTime; ShowMessage(IntToStr(Tempo) + ' milisegundos'); { Define } SetDoubleClickTime(300); end; Observaes Um duplo-click nada mais que dois cliques consecutivos (bvio). Porm estes dois cliques podem ser interpretados de duas formas: dois cliques isolados ou um duplo-click. Para o Windows resolver esta situao, ele usa o que chamo de "tempo mximo do duplo-click". Se o intervalo entre o primeiro e o segundo click for menor ou igual a esse tempo, ento houve duplo-click. E voc pode alterar este tempo. O padro do Windows 500 milisegundos. Um tempo muito curto (ex: 100), faz com que o duplo-click tenha que ser muito rpido (quase impossvel), enquanto muito longo (ex: 2000) faz com que o Windows interprete dois clicks isolados como duplo-click. Obter os atributos de um arquivo/diretrio Inclua na seo uses: Windows { No form: - Coloque um memo; - Coloque um edit; - Coloque um boto e escreva seu OnClick como abaixo: } procedure TForm1.Button1Click(Sender: TObject); var Attr: DWord; begin Memo1.Clear; Attr := GetFileAttributes(PChar(Edit1.Text)); if Attr > 0 then with Memo1.Lines do begin if (Attr and FILE_ATTRIBUTE_ARCHIVE) > 0 then Add('Archive'); if (Attr and FILE_ATTRIBUTE_COMPRESSED) > 0 then Add('Compressed'); if (Attr and FILE_ATTRIBUTE_DIRECTORY) > 0 then Add('Directory'); if (Attr and FILE_ATTRIBUTE_HIDDEN) > 0 then Add('Hidden'); if (Attr and FILE_ATTRIBUTE_NORMAL) > 0 then Add('Normal'); if (Attr and FILE_ATTRIBUTE_OFFLINE) > 0 then Add('OffLine'); if (Attr and FILE_ATTRIBUTE_READONLY) > 0 then Add('ReadOnly'); if (Attr and FILE_ATTRIBUTE_SYSTEM) > 0 then Add('System');
gondraf@hotmail.com
if (Attr and FILE_ATTRIBUTE_TEMPORARY) > 0 then Add('Temporary'); end; end; Obter o espao total e livre de um disco Inclua na seo uses: Windows { - Coloque um memo (TMemo) no form; - Coloque um boto e altere seu OnClick como abaixo: } procedure TForm1.Button1Click(Sender: TObject); var SetoresPorAgrup, BytesPorSetor, AgrupLivres, TotalAgrup: DWord; begin Memo1.Clear; if GetDiskFreeSpace('C:\', SetoresPorAgrup, BytesPorSetor, AgrupLivres, TotalAgrup) then with Memo1.Lines do begin Add('Setores por agrupamento: ' + IntToStr(SetoresPorAgrup)); Add('Bytes por setor: ' + IntToStr(BytesPorSetor)); Add('Agrupamentos livres: ' + IntToStr(AgrupLivres)); Add('Total de agrupamentos: ' + IntToStr(TotalAgrup)); Add('----- Resumo -----'); Add('Total de bytes: ' + IntToStr(TotalAgrup * SetoresPorAgrup * BytesPorSetor)); Add('Bytes livres: ' + IntToStr(AgrupLivres * SetoresPorAgrup * BytesPorSetor)); end; end; { O exemplo acima retorna as medidas em Bytes, Setores e Agrupamentos. Se preferir algo mais simples, use funes do Delphi. Veja: } Memo1.Lines.Add('Total de bytes: ' + IntToStr(DiskSize(3))); Memo1.Lines.Add('Bytes livres: ' + IntToStr(DiskFree(3))); { Onde o parmetro (3) o nmero da unidade, sendo 1=A, 2=B, 3=C, ... } Observaes Para usar as funes DiskSize e DiskFree coloque SysUtils em uses. Obter o tipo de um drive (removvel, fixo, CD-ROM, unidade de rede, etc) Inclua na seo uses: Windows, Dialogs { - Coloque um edit (Edit1) e um boto no form; - Altere o OnClick do boto conforme abaixo: } procedure TForm1.Button1Click(Sender: TObject); var S: string; Tipo: byte; begin Tipo := GetDriveType(PChar(Edit1.Text[1] + ':\')); case Tipo of
gondraf@hotmail.com
0: S := 'Tipo indeterminado'; 1: S := 'Drive no existe'; DRIVE_REMOVABLE: S := 'Disco removvel'; DRIVE_FIXED: S := 'Disco Fixo'; DRIVE_REMOTE: S := 'Unidade de rede'; DRIVE_CDROM: S := 'CD-ROM'; DRIVE_RAMDISK: S := 'RAM Disk'; else S := 'Erro'; end; ShowMessage(S); end; { Para pegar o tipo da unidade atual troque...} Tipo := GetDriveType(PChar(Edit1.Text[1] + ':\')); { por } Tipo := GetDriveType(nil); Observaes Para testar digite a letra do drive no Edit1 e clique no boto. A unit Dialogs foi colocada no uses apenas por causa da procedure ShowMessage. Para exibir todas as unidades existentes e seus respectivos tipos, use a funo tbGetDrives (da pergunta 64) em conjunto com este exemplo. Obter informaes de um volume/disco (label, serial, sistema de arquivos, etc) Inclua na seo uses: Windows, System { - Coloque um memo (TMemo) no form; - Coloque um boto e escreve seu evento OnClick como abaixo: } procedure TForm1.Button1Click(Sender: TObject); var SLabel, SSysName: PChar; Serial, FileNameLen, X: DWord; begin Memo1.Clear; GetMem(SLabel, 255); GetMem(SSysName, 255); try GetVolumeInformation('C:\', SLabel, 255, @Serial, FileNameLen, X, SSysName, 255); with Memo1.Lines do begin Add('Nome do volume (Label): ' + string(SLabel)); Add('Nmero Serial: ' + IntToHex(Serial, 8)); Add('Tamanho mximo p/ nome arquivo: ' + IntToStr(FileNameLen)); Add('Sistema de Arquivos: ' + string(SSysName)); end; finally FreeMem(SLAbel, 255); FreeMem(SSysName, 255); end; end; Alterar o nome de volume (Label) de um disco Inclua na seo uses: Windows { Da unidade C: } SetVolumeLabel('c:\', 'NovoLabel');
gondraf@hotmail.com
{ Da unidade atual: } SetVolumeLabel(nil, 'NovoLabel'); Saber quais as unidades de disco (drives) esto presentes Inclua na seo uses: Windows { A funo abaixo retorna uma string contendo as letras de unidades de discos presentes. } function tbGetDrives: string; var Drives: DWord; I: byte; begin Result := ''; Drives := GetLogicalDrives; if Drives <> 0 then for I := 65 to 90 do if ((Drives shl (31 - (I - 65))) shr 31) = 1 then Result := Result + Char(I); end; { Para saber se uma determinada unidade est presente, basta fazer algo como: } if Pos('A', tbGetDrives) > 0 then ShowMessage('Unidade A: presente.') else ShowMessage('Unidade A: ausente.'); Observaes A string retornada pela funo tbGetDrives est sempre em letras maisculas. "truncar" valores reais para apenas n casas decimais { s vezes voc precisa considerar apenas duas casas de valores reais, mas o Delphi no oferece algo pronto para isto. Se usarmos funes como Round que vem com o Delphi, o valor ser arredondado (e no truncado). Com Round() o valor abaixo ser 135.55 (e no 135.54) com duas casas decimais.} ValorReal := 135.54658; { Somente a parte inteira - nenhuma casa decimal } X := Trunc(ValorReal); // X ser 135 { Duas casas } X := Trunc(ValorReal * 100) / 100; // X ser 135.54 { Trs casas } X := Trunc(ValorReal * 1000) / 1000; // X ser 135.5465 Observaes Isto pode no funcionar se ValorReal for muito alto. Isto por causa da multiplicao que poder estourar a capacidade do tipo em uso. Lembre-se: os tipos reais aceitam valores muuuiiiito altos. Excluir todos os registros de uma tabela (como DELETE ALL do Clipper) procedure tbDBDeleteAll(const DataSet: TDataSet); begin with DataSet do while RecordCount > 0 do Delete;
gondraf@hotmail.com
end; { Chame-a como nos exemplos abaixo: } tbDBDeleteAll(Table1); ou tbDBDeleteAll(Query1); Observaes Se houver um filtro ou range ativo, somente os registros filtrados sero excludos. Portanto diferente de Table1.EmptyTable. Esta funo poder ser chamada no evento BeforeDelete do Table (ou Query) principal em um formulrio mestre-detalhe para excluir os itens (da parte detalhe). Saber se o sistema est usando 4 dgitos para o ano { Para no correr o risco de surpresas desagradveis, melhor que seu programa em Delphi verifique se o Windows est ajustado para trabalhar com 4 dgitos para o ano. Assim seu programa pode alertar o usurio quando o ano estiver sendo representado com apenas 2 dgitos. A funo abaixo retorna true se estiver ajustado para 4 dgitos.} function Is4DigitYear: Boolean; begin result:=(Pos('yyyy',ShortDateFormat)>0); end; Imprimir caracteres acentuados diretamente para a impressora { Usando comandos da impressora podemos fazer isto de uma forma bastante simples. Quando enviamos o caractere ASCII nmero 8 (oito) para a impressora, a cabea de impresso retrocede uma posio, pois este caractere o BackSpace. Ento podemos imprimir a letra sem acento e, sem seguida, voltar e imprimir o acento desejado. Vejamos um exemplo: - Coloque um boto no form; - Altere o evento OnClick deste boto conforme abaixo:} procedure TForm1.Button2Click(Sender: TObject); var F: TextFile; begin AssignFile(F, 'LPT1'); Rewrite(F); try { Regra: caractere sem acento + chr(8) + acento } WriteLn(F, 'Este e' + #8 + '''' + ' um teste.'); WriteLn(F, 'Acentuac' + #8 + ',a' + #8 + '~o.'); WriteLn(F, 'Vovo' + #8 + '^'); WriteLn(F, 'U' + #8 + '''' + 'ltimo.'); WriteLn(F, #12); // Eject finally CloseFile(F); end; end; Observaes Usando este recurso, a acentuao no fica excelente, mas melhora bastante. Imprimir texto justificado com formatao na impressora Epson LX-300
gondraf@hotmail.com
{ A impressora Epson LX-300 dispe de um comando que justifica o texto. Este recurso interessante, pois com ele podemos continuar a enviar os comandos de formatao de caracteres como condensado, negrito, italico, expandido, etc. Para o exemplo abaixo: - Coloque um boto no form; - Altere o evento OnClick deste boto como abaixo: } procedure TForm1.Button1Click(Sender: TObject); const cJustif = #27#97#51; cEject = #12; { Tamanho da fonte } c10cpi = #18; c12cpi = #27#77; c17cpi = #15; cIExpandido = #14; cFExpandido = #20; { Formatao da fonte } cINegrito = #27#71; cFNegrito = #27#72; cIItalico = #27#52; cFItalico = #27#53; var Texto: string; F: TextFile; begin Texto := c10cpi + 'Este e um teste para impressora Epson LX 300. ' + 'O objetivo e imprimir texto justificado sem deixar ' + 'de usar formatacao, tais como: ' + cINegrito + 'Negrito, ' + cFNegrito + cIItalico + 'Italico, ' + cFItalico + c17cpi + 'Condensado (17cpi), ' + c10cpi + c12cpi + '12 cpi, ' + c10cpi + cIExpandido + 'Expandido.' + cFExpandido + ' Este e apenas um exemplo, mas voce podera adapta-lo ' + 'a sua realidade conforme a necessidade.'; AssignFile(F, 'LPT1'); Rewrite(F); try WriteLn(F, cJustif, Texto); WriteLn(F, cEject); finally CloseFile(F); end; end; Observaes Este recurso de justificao da Epson LX-300 pode ser usado em qualquer linguagem de programao. Formatar um disquete atravs de um programa Delphi { Coloque o cdigo abaixo imediatamente abaixo da palavra implementation: } const SHFMT_ID_DEFAULT = $FFFF; { Opes de formatao } SHFMT_OPT_QUICKFORMAT = $0000; { Formatao rpida } SHFMT_OPT_FULL = $0001; { Formatao completa } SHFMT_OPT_SYSONLY = $0002; { Copia sistema }
gondraf@hotmail.com
{ Cdigos de errros } SHFMT_ERROR = $FFFFFFFF; { Ocorreu erro } SHFMT_CANCEL = $FFFFFFFE; { Foi cancelado } SHFMT_NOFORMAT = $FFFFFFFD; { No formatou } function SHFormatDrive(Handle: HWND; Drive, ID, Options: Word): LongInt; stdcall; external 'shell32.dll' name 'SHFormatDrive' { Coloque um boto no form e altere o evento OnClick dele conforme abaixo: } procedure TForm1.Button3Click(Sender: TObject); var Erro: DWord; Msg: string; begin Erro := SHFormatDrive(Handle, 0, SHFMT_ID_DEFAULT, SHFMT_OPT_QUICKFORMAT); case Erro of SHFMT_ERROR: Msg := 'Ocorreu um erro.'; SHFMT_CANCEL: Msg := 'A formatao foi cancelada.'; SHFMT_NOFORMAT: Msg := 'No foi possvel formatar.'; else Msg := 'Disco formatado com sucesso.'; end; ShowMessage(Msg); end; Observaes Para formatao completa troque SHFMT_OPT_QUICKFORMAT por SHFMT_OPT_FULL. O segundo parmetro (zero no exemplo) indica a unidade, sendo que A 0 (zero), B 1, etc. Alterar (e restaurar) o tamanho da pgina na impressora Inclua na seo uses: tbPrn { - Peque em nosso Download o arquivo tbPrn.zip. Ele contm funo tbPrnSetPaperSize usada no exemplo abaixo; - Adicione a unit tbPrn.pas em seu projeto; - Siga o exemplo abaixo para criar seus relatrios usando o TPrinter.} procedure TForm1.Button1Click(Sender: TObject); var Papel: TtbPrnPaper; begin Papel.Size := 256; // 256 o tam. personalizado Papel.Width := 2100; // 21 cm Papel.Height := 1000; // 10 cm Papel := tbPrnSetPaperSize(Papel); try Printer.BeginDoc; try { coloque aqui os comandos para impresso } finally Printer.EndDoc; end; finally a unit tbPrn.pas, onde est a
gondraf@hotmail.com
tbPrnSetPaperSize(Papel); // Restaura o tamanho end; end; { Papel.Size refere-se ao tamanho do papel. Veja alguns: 0 - Default 1 - Letter 5 - Legal 8 - A3 9 - A4 11 - A5 256 - Custom (personalizado) } Observaes S ser necessrio informar Papel.Height e Papel.Width quando Papel.Size for 256. Reproduzir um arquivo de som WAV sem o TMediaPlayer Inclua na seo uses: MMSystem { Sncrona: aguarda terminar a reproduo para continuar: } SndPlaySound('C:\Win95\Media\Office97\Lembrete.wav', SND_SYNC); { Assncrona: a execuo continua normalmente enquanto ocorre a reproduo: } SndPlaySound('C:\Win95\Media\Office97\Lembrete.wav', SND_ASYNC); { Contnua: a reproduo repetida num efeito de loop. Este tipo de reproduo precisa ser assncrona: } SndPlaySound('C:\Win95\Media\Office97\Lembrete.wav', SND_ASYNC or SND_LOOP); { Interrompe uma reproduo contnua: } SndPlaySound(nil, 0); Observaes A reproduo contnua pode ser usada, por exemplo, para altertar o usurio em uma situao extremamente crtica. Se o equipamento no possuir placa de som, o arquivo no ser reproduzido. Obter o nome do usurio e da empresa informado durante a instalao do Windows Inclua na seo uses: Registry { Coloque um boto no form e altere seu evento OnCkick como abaixo: } procedure TForm1.Button1Click(Sender: TObject); var Reg: TRegIniFile; S: string; begin Reg := TRegIniFile.Create('SOFTWARE\MICROSOFT\MS SETUP (ACME)\'); try S := Reg.ReadString('USER INFO','DefName',''); S := S + #13; S := S + Reg.ReadString('USER INFO','DefCompany',''); ShowMessage(S); finally Reg.free; end; end; Mostrar uma barra de progresso enquanto copia arquivos
gondraf@hotmail.com
Veja a prxima Copiar arquivos usando o Shell do Windows Inclua na seo uses: ShellApi { - Coloque um boto no form e altere o evento OnClick deste boto conforme abaixo: } procedure TForm1.Button1Click(Sender: TObject); var Dados: TSHFileOpStruct; begin FillChar(Dados,SizeOf(Dados), 0); with Dados do begin wFunc := FO_COPY; pFrom := PChar('c:\teste\*.txt'); pTo := PChar('a:\'); fFlags:= FOF_ALLOWUNDO; end; SHFileOperation(Dados); end; Observaes Esta forma de copiar arquivos oferecem vrias vantagens. O Shell avisa para pr um prximo disco quando o atual estiver cheio. Mostra a barra de progresso. Pode copiar arquivos usando mscara de uma forma extremamente simples. Descobrir o cdigo ASCII de uma tecla { - Coloque um Label no form (Label1); - Mude a propriedade KeyPreview do form para true; - Altere o evento OnKeyDown do form como abaixo: } procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin Label1.Caption := Format('O cdigo da tecla pressionada : %d', [Key]); end; Observaes Para testar execute e observe o Label enquanto pressiona as teclas desejadas. Evitar que seu programa aparea na barra de tarefas Inclua na seo uses: Windows { Voc j observou a caixa "Propriedades", aquela que mostra as propriedades de um arquivo no Windows Explorer, no aparece na lista do Alt+Tab e tampouco na barra de tarefas? Isto ocorre porque ela funciona como uma ToolWindow, enquanto os demais aplicativos funcionam como AppWindow. Porm podemos mudar o comportamento de nossos programas feito em Delphi para que se comportem como uma ToolWindow tambm. Para experimentar, crie um novo projeto e altere o Project1.dpr como abaixo (no esquea do uses): } program Project1; uses Forms, Windows,
gondraf@hotmail.com
Unit1 in 'Unit1.pas' {Form1}; {$R *.RES} var ExtendedStyle : Integer; begin Application.Initialize; ExtendedStyle := GetWindowLong(Application.Handle, gwl_ExStyle); SetWindowLong(Application.Handle, gwl_ExStyle, ExtendedStyle or ws_Ex_ToolWindow and not ws_Ex_AppWindow); Application.CreateForm(TForm1, Form1); Application.Run; end. Observaes Ao executar observe a barra de tarefas e teste o Alt+Tab (seu programa no estar l!). Usar eventos de som do Windows { Evento Som Padro } MessageBeep(0); { ou Beep; } { Evento Parada Crtica } MessageBeep(16); { Evento Pergunta } MessageBeep(32); { Evento Exclamao } MessageBeep(48); { Evento Asterisco } MessageBeep(64); Mudar a coluna ativa em um DBGrid via programao { Usando nmero da coluna (zero a primeira coluna): } DBGrid1.SelectedIndex := 0; { Usando o nome do campo } DBGrid1.SelectedField := Table1.FieldByName(Edit2.Text); Observaes Aconselho usar o nome do campo quando o que importa o campo e no a posio. Use o nmero da coluna somente quando o que importa a posio, e no o campo. Fechar o Windows a partir do seu programa { Reinicia o Windows } ExitWindowsEx(EWX_REBOOT, 0); { Desliga o Windows } ExitWindowsEx(EWX_SHUTDOWN, 0); { Fora todos os programa a desligarem-se } ExitWindowsEx(EWX_FORCE, 0);
gondraf@hotmail.com
Carregar um cursor animado (.ani) { Altere o evento OnCreate do Form conforme abaixo: } procedure TForm1.FormCreate(Sender: TObject); begin Screen.Cursors[1] := LoadCursorFromFile('c:\win95\cursors\globe.ani'); Button1.Cursor := 1; end; Observaes Para este exemplo necessrio ter o arquivo de cursor conforme apontado e tambm ter, no form, um Button1. Para usar este cursor em outros componentes basta atribuir propriedade Cursor do componente em questo o valor 1 (um). Exemplo: Edit1.Cursor := 1; Form1.Cursor := 1;, etc. Enviar um arquivo para a lixeira Inclua na seo uses: ShellApi { Coloque a procedure abaixo na seo implementation } procedure ArqParaLixeira(const NomeArq: string; var MsgErro: string); var Op: TSHFileOpStruct; begin MsgErro := ''; if not FileExists(NomeArq) then begin MsgErro := 'Arquivo no encontrado.'; Exit; end; FillChar(Op, SizeOf(Op), 0); with Op do begin wFunc := FO_DELETE; pFrom := PChar(NomeArq); fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_SILENT; end; if ShFileOperation(Op) <> 0 then MsgErro := 'No foi possvel enviar o arquivo para a lixeira.'; end; { - Coloque um boto no Form; - Altere o evento OnClick do boto conforme abaixo: } procedure TForm1.Button1Click(Sender: TObject); var S: string; begin ArqParaLixeira('c:\Diretorio\Teste.doc', S); if S = '' then ShowMessage('O arquivo foi enviado para a lixeira.') else ShowMessage(S); end; Obter o nmero do registro atual Table1.RecNo() Trabalhar com Filter de forma mais prtica
gondraf@hotmail.com
Se voc est habituado a usar este cdigo no filter... Table1.Filter := 'Nome = '''+ Edit1.Text + ''''; ou Table1.Filter := 'Data = ''' + DateToStr(Date) + ''''; Tente usar este: Table1.Filter := 'Nome = ' + QuotedStr(Edit1.Text); ou Table1.Filter := 'Data = ' + QuotedStr(DateToStr(Date)); Observaes A funo QuitedStr() coloca apstrofos envolvendo a string. Se houver um apstrofo como parte da string, ela o subtitui por dois apstrofos, para que seja corretamente interpretado. Reproduzir um arquivo WAV Inclua na seo uses: MMSystem PlaySound('C:\ArqSom.wav', 1, SND_ASYNC); Observaes Troque o nome do arquivo (C:\ArqSom.wav) pelo arquivo desejado. Executar um programa DOS e fech-lo em seguida { Coloque isto no evento OnClick de um boto: } WinExec('command.com /c programa.exe',sw_ShowNormal); { Se quizer passar parmetros pasta adicion-los aps o nome do programa. Exemplo: } WinExec('command.com /c programa.exe param1 param2',sw_ShowNormal); Observaes Se quizer que a janela do programa no aparea, troque sw_ShowNormal por sw_Hide. Fechar um programa a partir de um programa Delphi { - Coloque um boto no form e altere seu evento OnClick conforme abaixo: } procedure TForm1.Button1Click(Sender: TObject); var Janela: HWND; begin Janela := FindWindow('OpusApp'), nil); if Janela = 0 then ShowMessage('Programa no encontrado') else PostMessage(Janela, WM_QUIT, 0, 0); end; Observaes Este exemplo fecha o MS Word 97 se estiver aberto. A mensagem WM_QUIT fecha o programa da forma "ignorante". Isto significa que se houver dados no salvos, o programa a ser fechado no oportunidade para salv-los. Uma alternativa mais suave trocar a mensagem WM_QUIT por WM_CLOSE. Veja as perguntas 18 e 36. Colocar Hint's de vrias linhas { - Coloque um TButton no Form; - Altere o evento OnCreate do Form como abaixo: }
gondraf@hotmail.com
procedure TForm1.FormCreate(Sender: TObject); begin Button1.Hint := 'Linha 1 da dica' + #13 + 'Linha 2 da dica' + #13 + 'Linha 3 da dica'; Button1.ShowHint := true; end; Reproduzir um vdeo AVI em um Form { - Crie um novo projeto. Este j dever ter o Form1; - Adicione um novo Form (Form2); - Coloque, no Form1, um TMediaPlayer (paleta System) e um boto; - Altere o evento OnClick do boto como abaixo: } procedure TForm1.Button1Click(Sender: TObject); begin with MediaPlayer1 do begin FileName := 'c:\speedis.avi'; Open; { Ajusta tamanho do Form } with MediaPlayer1.DisplayRect do begin Form2.ClientHeight := Bottom - Top; Form2.ClientWidth := Right - Left; end; Display := Form2; Form2.Show; Play; end; end; Observaes Em vez de ajustar o Form ao vdeo, podemos ajustar o vdeo ao Form. Para isto troque o trecho with..end; por MediaPlayer1.DisplayRect := Form2.ClientRect; Separar (filtrar) caracteres de uma string { Abaixo da palavra implementation digite: } type TChars = set of Char; function FilterChars(const S: string; const ValidChars: TChars): string; var I: integer; begin Result := ''; for I := 1 to Length(S) do if S[I] in ValidChars then Result := Result + S[I]; end; { Para usar a funo: - Coloque um boto no Form; - Altere o evento OnClick deste boto conforme abaixo: } procedure TForm1.Button4Click(Sender: TObject);
gondraf@hotmail.com
begin { Pega s letras } ShowMessage(FilterChars('D63an*%i+/e68l13', ['A'..'Z', 'a'..'z'])); { Pega s nmeros } ShowMessage(FilterChars('D63an*%i+/e68l13', ['0'..'9'])); end; Observaes Se quizer usar este funo em outras unit's, coloque a declarao do tipo TChars na seo interface. Coloque a tambm uma declarao da funo FilterChars. E no se esquea da clusula uses. Colocar zeros esquerda de nmeros { Isto coloca zeros esquerda do nmero at completar 6 casas } S := FormatFloat('000000', 5); Observaes "S" precisa ser uma varivel string. Copiar arquivos usando curingas (*.*) { - Coloque um Button no Form; - Altere o evento OnClick deste Button conforme abaixo: } procedure TForm1.Button2Click(Sender: TObject); var SR: TSearchRec; I: integer; Origem, Destino: string; begin I := FindFirst('c:\Origem\*.*', faAnyFile, SR); while I = 0 do begin if (SR.Attr and faDirectory) <> faDirectory then begin Origem := 'c:\Origem\' + SR.Name; Destino := 'c:\Destino\' + SR.Name; if not CopyFile(PChar(Origem), PChar(Destino), true) then ShowMessage('Erro ao copiar ' + Origem + ' para ' + Destino); end; I := FindNext(SR); end; end; Observaes No exemplo acima, se o arquivo j existir no destino, a funo falha (no copia). Para que a funo possa sobreescrever o arquivo destino (caso exista), altere o ltimo parmetro de CopyFile para false. CUIDADO! Se um arquivo for sobreescrito. Copiar arquivos { - Coloque um Button no Form; - Altere o evento OnClick deste Button conforme abaixo: } procedure TForm1.Button2Click(Sender: TObject); var Origem, Destino: string; begin Origem := 'c:\Origem\NomeArq.txt'; Destino := 'c:\Destino\NomeArq.txt'; if not CopyFile(PChar(Origem), PChar(Destino), true) then
gondraf@hotmail.com
ShowMessage('Erro ao copiar ' + Origem + ' para ' + Destino); end; Observaes No exemplo acima, se o arquivo j existir no destino, a funo falha (no copia). Para que a funo possa sobreescrever o arquivo destino (caso exista), altere o ltimo parmetro de CopyFile para false. CUIDADO! Se um arquivo for sobreescrito, estar perdido para sempre!. Trabalhar com cores no formato string procedure TForm1.Button3Click(Sender: TObject); begin { Exibe as cores atuais dos Edit's } ShowMessage(ColorToString(Edit1.Color)); ShowMessage(ColorToString(Edit2.Color)); { Altera as cores dos Edit's } Edit1.Color := StringToColor('clBlue'); Edit2.Color := StringToColor('$0080FF80'); end; Verificar se determinado programa est em execuo (Word, Delphi, etc) { Coloque um Button no Form e altere o evento OnClick deste como abaixo: } procedure TForm1.Button1Click(Sender: TObject); begin { Verifica o Delphi } if FindWindow('TAppBuilder', nil) > 0 then ShowMessage('O Delphi est aberto') else ShowMessage('O Delphi NO est aberto'); { Verifica o Word } if FindWindow('OpusApp', nil) > 0 then ShowMessage('O Word est aberto') else ShowMessage('O Word NO est aberto'); { Verifica o Excell } if FindWindow('XLMAIN', nil) > 0 then ShowMessage('O Excell est aberto') else ShowMessage('O Excell NO est aberto'); end; Observaes H uma margem de erro nesta verificao: pode haver outros programas que possuam uma janela com os mesmos nomes. Voc mesmo pode criar aplicativos em Delphi e, propositadamente, criar uma janela com um destes nomes. Veja a pergunta n 18. Excluir arquivos usando curingas (*.*) { - Coloque um Button no Form; - Altere o evento OnClick do Button conforme abaixo: } procedure TForm1.Button2Click(Sender: TObject); var SR: TSearchRec; I: integer; begin
gondraf@hotmail.com
I := FindFirst('c:\Teste\*.*', faAnyFile, SR); while I = 0 do begin if (SR.Attr and faDirectory) <> faDirectory then if not DeleteFile('c:\Teste\' + SR.Name) then ShowMessage('No consegui excluir c:\Teste\' + SR.Name); I := FindNext(SR); end; end; Observaes No exemplo acima todos os arquivos do diretrio c:\Teste sero excludos. CUIDADO! Arquivos excludos desta forma no vo para a lixeira. Gerar uma tabela no Word atravs do Delphi Inclua na seo uses: ComObj { - Coloque um boto no Form; - Altere o evento OnClick do boto conforme abaixo: } procedure TForm1.Button1Click(Sender: TObject); var Word: Variant; begin { Abre o Word } Word := CreateOleObject('Word.Application'); try { Novo documento } Word.Documents.Add; try { Adiciona tabela de 2 linhas e 3 colunas } Word.ActiveDocument.Tables.Add( Range := Word.Selection.Range, NumRows := 2, NumColumns := 3); { Escreve na primeira clula } Word.Selection.TypeText(Text := 'Linha 1, Coluna 1'); { Prxima clula } Word.Selection.MoveRight(12); { Escreve } Word.Selection.TypeText(Text := 'Linha 1, Coluna 2'); Word.Selection.MoveRight(12); Word.Selection.TypeText(Text := 'Linha 1, Coluna 3'); Word.Selection.MoveRight(12); Word.Selection.TypeText(Text := 'Linha 2, Coluna 1'); Word.Selection.MoveRight(12); Word.Selection.TypeText(Text := 'Linha 2, Coluna 2'); Word.Selection.MoveRight(12); Word.Selection.TypeText(Text := 'Linha 2, Coluna 3'); { Auto-Formata } Word.Selection.Tables.Item(1).Select; { Seleciona a 1 tabela } Word.Selection.Cells.AutoFit; { auto-formata } { Imprime 1 cpia } Word.ActiveDocument.PrintOut(Copies := 1); ShowMessage('Aguarde o trmino da impresso...'); { Para salvar... } Word.ActiveDocument.SaveAs(FileName := 'c:\Tabela.doc'); finally { Fecha documento } Word.ActiveDocument.Close(SaveChanges := 0);
gondraf@hotmail.com
end; finally { Fecha o Word } Word.Quit; end; end; Observaes Foram usados neste exemplo o Delphi4 e MS-Word97, testado por mim no delphi 2005 Word 2003 Obter a quantidade de registros total e visvel de uma tabela Inclua na seo uses: DbiProcs Os componentes TTable e TQuery possuem a propriedade RecordCount que indicam a quantidade de registros da tabela.No entanto esta propriedade dependente de filtros, ou seja, se tivermos uma tabela com dez registros com campo "Codigo" de 1 a 10 e aplicarmos o filtro mostrado a seguir, a propriedade RecordCount retornar 5 e no 10. Table1.Filter := 'Codigo <= 5'; Table1.Filtered := true; Se quizermos obter a quantidade total de registros, independentemente de filtros, devemos usar uma API do BDE conforme abaixo: var Total: integer; begin Check(DbiGetRecordCount(Table1.Handle, Total)); ShowMessage('Total de registros: ' + IntToStr(Total)); end; Observaes Para testar o exemplo acima, o Table1 precisa estar aberto. Evitar que um programa seja executado mais de uma vez { Muitos programas Windows permitem apenas uma cpia em execuo de cada vez. Isto interessante principalmente quando um grande aplicativo, pois duas cpias ao mesmo tempo usuaria muito mais memria. Em aplicativos desenvolvidos em Delphi podemos ter esta caracterstica. Vejamos: - Crie um novo projeto; - Mude o "Name" do Form1 para DPGFormPrinc; - Altere o cdigo-fonte do arquivo Project1.dpr conforme abaixo: } program Project1; uses Forms, Windows, Unit1 in 'Unit1.pas' {DPGFormPrinc}; {$R *.RES} var Handle: THandle; begin
gondraf@hotmail.com
Handle := FindWindow('TDPGFormPrinc', nil); if Handle <> 0 then begin { J est aberto } Application.MessageBox('Este programa j est aberto. A cpia ' + 'anterior ser ativada.', 'Programa j aberto', MB_OK); if not IsWindowVisible(Handle) then ShowWindow(Handle, SW_RESTORE); SetForegroundWindow(Handle); Exit; end; Application.Initialize; Application.CreateForm(TDPGFormPrinc, DPGFormPrinc); Application.Run; end. Observaes Para testar este programa voc dever compilar o projeto e fechar o Delphi. Depois, procure o Project1.exe (projeto compilado) usando o Windows Explorer e tente execut-lo mais de uma vez e veja o que acontece. Mas porque alterar o name do form principal para "DPGFormPrinc"? Este poderia ser qualquer outro nome, mas preferi usar as iniciais do meu nome (DPG). Procurei deixar um nome bem pessoal para no correr o risco de colocar um nome que possa ser encontrado em outro aplicativo do Windows. Por exemplo: se deixar Form1, ser bem fcil encontrar outro aplicativo feito em Delphi que possua uma janela com este nome, o que causaria problema. Executar um "COMMIT" no Delphi Inclua na seo uses: DbiProcs { Se estiver usando TTable, coloque nos eventos AfterPost e AfterDelete a seguinte linha: } dbiSaveChanges(Table1.Handle); { Para TQuery, a instruo semelhante: } dbiSaveChanges(Query1.Handle); Posicionar Form's em relao ao Desktop do Windows { Quando usamos a propridade Position de um Form para centraliz-lo estamos sujeitos a um inconveniente: dependendo da posio/tamanho da barra de tarefas do Windows, o nosso Form poder ficar parcialmente coberto por ela. Uma forma eficaz de resolver este problema posicionar o form considerando apenas a rea livre do Desktop. Vejamos este exemplo: - Crie um novo projeto; - Na seo implementation digite a procedure abaixo:} procedure FormPos(Form: TForm; const Horz, Vert: byte); { Horz: 1=esquerda, 2=centro, 3=direita Vert: 1=topo, 2=centro, 3=em baixo } var R: TRect; begin if not SystemParametersInfo(SPI_GETWORKAREA, 0, @R, 0) then R := Rect(0, 0, Screen.Width, Screen.Height); with Form do case Horz of 1: Form.Left := 0; 2: Form.Left := (R.Right - R.Left - Width) div 2; 3: Form.Left := R.Right - Width; end; with Form do case Vert of 1: Form.Top := 0; 2: Form.Top := (R.Bottom - R.Top - Height) div 2;
gondraf@hotmail.com
3: Form.Top := R.Bottom - Height; end; end; { - Coloque dois TEdit's: Edit1 e Edit2; - Coloque um TButton e altere o evento OnClick deste conforme abaixo:} procedure TForm1.Button1Click(Sender: TObject); begin FormPos(Form1, StrToInt(Edit1.Text), StrToInt(Edit2.Text)); end; Observaes Para testar, execute este exemplo e experimente digitar nmeros de 1 a 3 em ambos os Edit's e clique no Button para ver o resultado. O Edit1 indica a posio horizontal (esquerda, centro e direita) e o Edit2 indica a posio vertical (topo, centro e em baixo). Saber a resoluo de tela atual { Coloque um TButton no Form e altere o evento OnClick deste boto como abaixo: } procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage('Largura: ' + IntToStr(Screen.Width) + #13 + 'Altura: ' + IntToStr(Screen.Height)); end; Observaes O objeto Screen contm vrias informaes importantes: largura e altura da tela, fontes instaladas no Windows, etc. Verificar se uma unidade de disco (disk-drive) est preparada Inclua na seo uses: System, SysUtils { - Crie um novo projeto; - Na seo implementation da Unit1 digite a funo abaixo: } function DriveOk(Drive: Char): boolean; var I: byte; begin Drive := UpCase(Drive); if not (Drive in ['A'..'Z']) then raise Exception.Create('Unidade incorreta'); I := Ord(Drive) - 64; Result := DiskSize(I) >= 0; end; { - Coloque no Form1 um TEdit (Edit1) - Coloque no Form1 um TButton - Altere o evento OnClick do Button1 conforme abaixo: } procedure TForm1.Button1Click(Sender: TObject); begin if DriveOk(Edit1.Text[1]) then ShowMessage('Drive OK') else ShowMessage('Drive no preparado'); end;
gondraf@hotmail.com
Observaes Para testar voc dever executar o exemplo e digitar no Edit a letra do drive a ser testado (no precisa os dois-pontos). Aps digitar, clique no Button1. Salvar/restaurar o tamanho e posio de Form's { Crie uma nova Unit conforme abaixo: } unit uFormFunc; interface uses Forms, IniFiles, SysUtils, Messages, Windows; procedure tbLoadFormStatus(Form: TForm; const Section: string); procedure tbSaveFormStatus(Form: TForm; const Section: string); implementation procedure tbSaveFormStatus(Form: TForm; const Section: string); var Ini: TIniFile; Maximized: boolean; begin Ini := TIniFile.Create(ChangeFileExt( ExtractFileName(ParamStr(0)),'.INI')); try Maximized := Form.WindowState = wsMaximized; Ini.WriteBool(Section, 'Maximized', Maximized); if not Maximized then begin Ini.WriteInteger(Section, 'Left', Form.Left); Ini.WriteInteger(Section, 'Top', Form.Top); Ini.WriteInteger(Section, 'Width', Form.Width); Ini.WriteInteger(Section, 'Height', Form.Height); end; finally Ini.Free; end; end; procedure tbLoadFormStatus(Form: TForm; const Section: string); var Ini: TIniFile; Maximized: boolean; begin Maximized := false; { Evita msg do compilador } Ini := TIniFile.Create(ChangeFileExt( ExtractFileName(ParamStr(0)),'.INI')); try Maximized := Ini.ReadBool(Section, 'Maximized', Maximized); Form.Left := Ini.ReadInteger(Section, 'Left', Form.Left); Form.Top := Ini.ReadInteger(Section, 'Top', Form.Top); Form.Width := Ini.ReadInteger(Section, 'Width', Form.Width); Form.Height := Ini.ReadInteger(Section, 'Height', Form.Height); if Maximized then Form.Perform(WM_SIZE, SIZE_MAXIMIZED, 0); { A propriedade WindowState apresenta Bug. Por isto usei a mensagem WM_SIZE } finally Ini.Free; end; end;
gondraf@hotmail.com
end. { Em cada formulrio que deseja salvar/restaurar: - Inclua na seo uses: uFormFunc - No evento OnShow digite: tbLoadFormStatus(Self, Self.Name); - No evento OnClose digite: tbSaveFormStatus(Self, Self.Name);} Observaes O arquivo INI ter o nome do executvel e extenso INI e ser salvo no diretrio do Windows. A palavra Self indica o Form relacionado com a unit em questo. Poderia ser, por exemplo, Form1, Form2, etc. Onde aparece Self.Name poder ser colocado um nome a sua escolha. Este nome ser usado como SectionName no arquivo INI e deve ser idntico no evento OnShow e OnClose de um mesmo Form, porm para cada Form dever ser usado um nome diferente. Definir a quantidade de registros a ser impressa em uma pgina do QuickReport Ou seja, gostaria que, ao visualizar ou imprimir um relatrio do Quick Report, saia em cada pgina apenas um registro, mesmo que o espao permita mais de um. Existem pelo menos duas formas de resolver este problema: 1. A forma mais simples consiste em alterar a altura (Height) da banda Detail do nosso relatrio de modo que a altura total da pgina seja inferior a duas vezes a altura da banda. Desta forma, cada registro ser impresso em uma nova pgina, teoricamente por falta de espao na pgina atual. 2. Uma outra forma mais sofisticada usar o evento AfterPrint da banda Detail. Nele testamos se ainda no chegou no fim da tabela e, caso positivo, pedimos uma nova pgina: if not Table1.EOF then QuickRep1.NewPage; Deve existir outras alternativas, mas as duas anteriores funcionaram bem nos testes realizados. Onde encontrar tutoriais sobre construo de componentes em Delphi Pegue apostila no download. Para que servem OnGetEditMask, OnGetEditText e OnSetEditText do TStringGrid O evento OnGetEditMask ocorre quando entramos no modo de edio. Neste momento podemos verificar em qual linha/coluna se encontra o cursor e ento, se quiser, poder especificar uma mscara de edio. Exemplo: procedure TForm1.StringGrid1GetEditMask(Sender: TObject; ACol, ARow: Integer; var Value: String); begin if (ARow = 1) and (ACol = 1) then Value := '(999) 999-9999;1;_'; // Telefone end; O evento OnGetEditText ocorre tambm quando entramos no modo de edio. Neste momento podemos manipularmos o texto da clula atual (linha/coluna) e ento podemos simular algo tal como uma tabela onde opes podem ser digitadas atravs de nmeros. Exemplo: procedure TForm1.StringGrid1GetEditText(Sender: TObject; ACol, ARow: Integer; var Value: String); begin
gondraf@hotmail.com
if (ARow = 1) and (ACol = 2) then begin if StringGrid1.Cells[ACol, ARow] = 'timo' then Value := '1' else if StringGrid1.Cells[ACol, ARow] = 'Regular' then Value := '2' else if StringGrid1.Cells[ACol, ARow] = 'Ruim' then Value := '3'; end; end; O evento evento OnSetEditText ocorre quando samos do modo de edio. Neste momento podemos manipular a entrada e trocar por um texto equivalente. Normalmente usamos este evento em conjunto com o evento OnGetEditText. Exemplo: procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); begin if (ARow = 1) and (ACol = 2) then begin if Value = '1' then StringGrid1.Cells[ACol, ARow] := 'timo' else if Value = '2' then StringGrid1.Cells[ACol, ARow] := 'Regular' else if Value = '3' then StringGrid1.Cells[ACol, ARow] := 'Ruim' end; end; Observaes Para testar o exemplo anterior crie um novo projeto e coloque no Form1 um TStringGrid. Mude os trs eventos mencionados conforme os exemplos. Execute e experimente digitar nas cluas 1 e 2 da primeira linha (na parte no fixada, claro!). Mostrar um Form de LogOn antes do Form principal { * Crie um novo Projeto. Este certamente ter o Form1. * Adicione um novo Form (Form2). * Coloque no Form2 dois botes TBitBtn. * Mude a propriedade Kind do BitBtn1 para bkOK. * Mude a propriedade Kind do BitBtn2 para bkCancel. * V no menu "Project/Options" na aba "Forms" e passe o Form2 de "Auto-create Forms" para "Available Forms". * Abra o arquivo Project.dpr (menu Project/View Source). * Altere o contedo deste arquivo conforme abaixo:} program Project1; uses Forms, Controls, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}; {$R *.RES} var F: TForm2; begin F := TForm2.Create(Application); try if F.ShowModal = mrOK then begin
gondraf@hotmail.com
Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end; finally F.Free; end; end. Observaes O Form2 do exemplo o Form de LogOn. Este dever ser preparado para que se possa escolher o usurio, digitar a senha, etc. Limitar a regio de movimentao do mouse Inclua na seo uses: Windows { Coloque um boto no form e altera o evento OnClick dele conforme abaixo: } procedure TForm1.Button1Click(Sender: TObject); var R: TRect; begin { Pega o retngulo da rea cliente do form } R := GetClientRect; { Converte as coordenadas do form em coordenadas da tela } R.TopLeft := ClientToScreen(R.TopLeft); R.BottomRight := ClientToScreen(R.BottomRight); { Limita a regio de movimentao do mouse } ClipCursor(@R); ShowMessage('Tente mover o mouse para fora da rea cliente do Form'); { Libera a movimentao } ClipCursor(nil); end; Observaes Cuidado! Isto pode irritar o usurio do seu programa. Descobrir o nome de classe de uma janela do Windows Muitas vezes precisamos saber qual o nome de classe de uma determinada janela. Quando so janelas desenvolvidas por ns, voc olha no cdigo-fonte. Mas e se no for, como o caso do Delphi? Por exemplo: Para verificar se o Delphi est sendo executado, procuramos no Windows pela janela cujo nome de classe seja TAppBuilder. Mas como verificar ento se o Internet Explorer est sendo executado? Precisaremos saber o nome de classe da janela deste programa. Ento o que fazer? Use o TBWinName. Pegue-o no download de www.ulbrajp.com.br/usuario/tecnobyte Ocultar/exibir a barra de tarefas do Windows Inclua na seo uses: Windows { Coloque no Form dois Botes: BotaoOcultar e BotaoExibir. BotaoOcultar escreva: } procedure TForm1.BotaoOcultarClick(Sender: TObject); No evento OnClick do
gondraf@hotmail.com
var Janela: HWND; begin Janela := FindWindow('Shell_TrayWnd', nil); if Janela > 0 then ShowWindow(Janela, SW_HIDE); end; { No evento OnClick do BotaoExibir escreva: } procedure TForm1.BotaoExibirClick(Sender: TObject); var Janela: HWND; begin Janela := FindWindow('Shell_TrayWnd', nil); if Janela > 0 then ShowWindow(Janela, SW_SHOW); end; { Execute e teste, clicando em ambos os botes } Observaes A tarefa mais difcil descobrir o nome de classe da janela da barra de tarefa do Windows, mas isto fcil se voc usar o TBWinName. Pegue-o no link download de www.ulbrajp.com.br/usuario/tecnobyte O resto usar as APIs do Windows para manipulao de Janelas. Veja a pergunta n 18. Evitar a proteo de tela durante seu programa Inclua na seo uses: Windows { Na seo "private" do Form principal acrescente: } procedure AppMsg(var Msg: TMsg; var Handled: Boolean); { Na seo "implementation" acrescente (troque TForm1 para o nome do seu form principal): } procedure TForm1.AppMsg(var Msg: TMsg; var Handled: Boolean); begin if (Msg.Message = wm_SysCommand) and (Msg.wParam = sc_ScreenSave) then Handled := true; end; { No evento "OnCreate" do form principal, coloque: } Application.OnMessage := AppMsg; Fazer a barra de ttulo ficar intermitente (piscante) Inclua na seo uses: Windows { Coloque um TTimer no Form desejado. Define a propriedade Interval do Timer para 1000 (1segundo). Modifique o evento OnTimer do Timer conforme abaixo: } procedure TForm1.Timer1Timer(Sender: TObject); begin FlashWindow(Handle, true); FlashWindow(Application.Handle, true); end;
gondraf@hotmail.com
Posicionar o cursor do mouse em um controle Inclua na seo uses: Windows { Digite a procedure abaixo imediatamente aps a palavra implementation no cdigo do seu formulrio. } procedure MouseParaControle(Controle: TControl); var IrPara: TPoint; begin IrPara.X := Controle.Left + (Controle.Width div 2); IrPara.Y := Controle.Top + (Controle.Height div 2); if Controle.Parent <> nil then IrPara := Controle.Parent.ClientToScreen(IrPara); SetCursorPos(IrPara.X, IrPara.Y); end; { Para testar, coloque no Form um boto e troque o name dele para btnOK e modifique o evento OnShow do Form conforme abaixo: } procedure TForm1.FormShow(Sender: TObject); begin MouseParaControle(btnOk); end; Observaes A funo "MouseParaControle" recebe um parmetro do tipo TControl. Isto significa que voc poder passar para ela qualquer controle do Delphi, tais como: TEdit, TButton, TSpeedButton, TPanel, etc. Pode ser at mesmo o prprio Form. Criar cores personalizadas (sistema RGB) { Coloque um TButton no form e escreva o evento OnClick deste como abaixo: } procedure TForm1.Button1Click(Sender: TObject); var Vermelho, Verde, Azul: byte; MinhaCor: TColor; begin Vermelho := 0; Verde := 200; Azul := 150; MinhaCor := TColor(RGB(Vermelho, Verde, Azul)); Form1.Color := MinhaCor; end; Observaes A quantidade de cada cor primria um nmero de 0 a 255. Observe que a cor retornada pela funo RGB() est no formato do Windows (ColorRef); por isto que fiz a converso TColor(RGB(...)). Adicionar uma nova fonte no Windows { Coloque o cdigo abaixo no OnClick de um boto } AddFontResource(PChar('c:\MyFonts\Monospac.ttf')); Observaes Troque o nome do arquivo do exemplo anterior pelo nome desejado. Arquivos de fonte possuem uma das seguintes extenses: FON, FNT, TTF, FOT. Veja tambm a pergunta n 10.
gondraf@hotmail.com
Saber se a impressora atual possui determinada fonte Inclua na seo uses: Printers { Coloque este cdigo no OnClick de um boto } with Printer.Fonts do if IndexOf('Draft 10cpi') >= 0 then ShowMessage('A impressora possui a fonte.') else ShowMessage('A impressora NO possui a fonte.'); Observaes Isto pode ser til quando queremos usar fonte da impressora quando for uma matricial ou fonte do Windows quando for uma Jato de Tinta ou Laser. Veja tambm a pergunta n 10. Saber se determinada Font est instalada no Windows { Coloque este cdigo no OnClick de um boto } with Screen.Fonts do if IndexOf('Courier New') >= 0 then ShowMessage('A fonte est instalada.') else ShowMessage('A fonte no est instalada.'); Observaes Veja tambm a pergunta n 11. Acertar a data e hora do sistema atravs do programa { Coloque dois TEdit no form. Coloque um TButton no form e altere o evento OnClick deste boto como abaixo:} procedure TForm1.Button1Click(Sender: TObject); var DataHora: TSystemTime; Data, Hora: TDateTime; Ano, Mes, Dia, H, M, S, Mil: word; begin Data := StrToDate(Edit1.Text); Hora := StrToTime(Edit2.Text); DecodeDate(Data, Ano, Mes, Dia); DecodeTime(Hora, H, M, S, Mil); with DataHora do begin wYear := Ano; wMonth := Mes; wDay := Dia; wHour := H; wMinute := M; wSecond := S; wMilliseconds := Mil; end; SetLocalTime(DataHora); end; Observaes No Edit1 digite a nova data e no Edit2 digite a nova hora. ENTER em vez de TAB no formulrio, no DBGrid e no StringGrid { Mude a propriedade "KeyPreview" do Form para true. }
gondraf@hotmail.com
{ No evento "OnKeyPress" do Form acrescente o cdigo abaixo: } procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then begin Key := #0; Perform(WM_NEXTDLGCTL, 1, 0); end; end; { Em StringGrid, escreva o evento OnKeyPress como abaixo: } procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then StringGrid1.Perform(WM_KEYDOWN, VK_TAB, 0); end; { Em DBGrid, escreva o evento OnKeyPress como abaixo: } procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then DBGrid1.Perform(WM_KEYDOWN, VK_TAB, 0); end; Observaes bom lembrar que a tecla ENTER no Windows tem seu papel j bem definido quando se trata de caixa de dilogo: executar a ao padro, normalmente o boto OK. Se no tomar cuidado poder confundir o usurio, em vez de ajud-lo. Simular a vrgula atravs do ponto do teclado numrico { Na seo "private" do Form principal acrescente: } procedure AppMsg(var Msg: TMsg; var Handled: Boolean); { Na seo "implementation" acrescente (troque TForm1 para o nome do seu form principal): } procedure TForm1.AppMsg(var Msg: TMsg; var Handled: Boolean); begin if Msg.Message = WM_KEYDOWN then if Msg.wParam = 110 then Msg.wParam := 188; end; { No evento "OnCreate" do form principal, coloque: } Application.OnMessage := AppMsg; { Uma segunda alternativa (Jos Geraldo - ES): Coloque o cdigo abaixo no evento OnKeyPress do componente onde se quer a converso (Edit, DBEdit, etc). Neste caso a converso funcionar apenas neste componente (bvio). } if Key = '.' then Key = DecimalSeparator; Observaes Na primeira alternativa, sempre que for pressionado o ponto do teclado numrico (da direita do teclado), este ser convertido para vrgula, independentemente do controle que estiver em foco. J na segunda, o ponto pode ser de qualquer lugar do teclado. Paralizar um programa durante n segundos Inclua na seo uses: Windows
gondraf@hotmail.com
{ Pausa por 1 segundo } Sleep(1000); { Pausa por 10 segundos } Sleep(10000); Observaes Esta pausa no interrompida pelo pressionamento de alguma tecla, como acontecia com InKey() do Clipper. Criar uma tabela (DB, DBF) atravs do seu programa Inclua na seo uses: dbTables, DB procedure CriaTabelaClientes; var Tabela: TTable; begin Tabela := TTable.Create(Application); try Tabela.DatabaseName := 'C:\'; { ou Tabela.DatabaseName := 'NomeAlias'; } Tabela.TableName := 'Clientes.DB'; Tabela.TableType := ttParadox; { ou ttDBase } { Somente Delphi4 } if Tabela.Exists then { Se a tabela j existe... } Exit; {***} { Cria a tabela } Tabela.FieldDefs.Add('Codigo', ftInteger, 0, true); Tabela.FieldDefs.Add('Nome', ftString, 30, true); Tabela.FieldDefs.Add('DataNasc', ftDate, 0, false); Tabela.FieldDefs.Add('RendaMes', ftCurrency, 0, false); Tabela.FieldDefs.Add('Ativo', ftBoolean, 0, true); { etc, etc, etc } Tabela.CreateTable; { Cria os ndices } Tabela.AddIndex('ICodigo', 'Codigo', [ixPrimary, ixUnique]); Tabela.AddIndex('INome', 'Nome', [ixCaseInsensitive]); { etc, etc, etc } finally Tabela.Free; end; end; Observaes Para verificar se o arquivo j existe na verso 3 ou anterior do Delphi, voc dever usar a funo "FileExists" do Delphi. Verificar se um diretrio existe Inclua na seo uses: FileCtrl, Dialogs if DirectoryExists('C:\MEUSDOCS') then ShowMessage('O diretrio existe') else
gondraf@hotmail.com
ShowMessage('O diretrio no existe'); Verificar se um arquivo existe Inclua na seo uses: SysUtils, Dialogs if FileExists('c:\carta.doc') then ShowMessage('O arquivo existe') else ShowMessage('O arquivo no existe'); Criar um Alias temporrio atravs do seu programa Inclua na seo uses: DB { Enxergar somente configuraes da sesso atual } Session.ConfigMode := cmSession; { Adicionar o Alias } Session.AddStandardAlias('MeuAlias', 'C:\DirProg', 'PARADOX'); Criar um Alias atravs do seu programa Inclua na seo uses: DB { se o alias no existir... } if not Session.IsAlias('MeuAlias') then begin { Adiciona o alias } Session.AddStandardAlias('MeuAlias', 'C:\DirProg', 'PARADOX'); { Salva o arquivo de configurao do BDE } Session.SaveConfigFile; end; Observaes Para criar um alias do dBase troque a string 'PARADOX' por 'DBASE'. No caso acima usei como path o caminho "C:\DirProg", mas se voc quiser poder trocar este caminho por ExtractFilePath(ParamStr(0)) para que o alias seja direcionado para o local onde est seu .EXE. Neste ltimo caso ser necessrio incluir na seo uses: SysUtils, System. Icone na Barra de Tarefas unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs ,ShellAPI, Menus; const wm_IconMessage = wm_User; type TForm1 = class(TForm) PopupMenu1: TPopupMenu; Lloyd1: TMenuItem; close1: TMenuItem; procedure FormCreate(Sender: TObject); procedure close1Click(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Lloyd1Click(Sender: TObject);
gondraf@hotmail.com
private procedure IconTray (var Msg: TMessage); message wm_IconMessage; { Private declarations } public { Public declarations } nid: TNotifyIconData; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin // carrega o cone inicial Icon.Handle := LoadIcon (HInstance, 'MAINICON'); // preenche os dados da estrutura NotifyIcon nid.cbSize := sizeof (nid); nid.wnd := Handle; nid.uID := 1; // Identificador do cone nid.uCallBAckMessage := wm_IconMessage; nid.hIcon := Icon.Handle; nid.szTip := 'LloydSoft'; nid.uFlags := nif_Message or nif_Icon or nif_Tip; Shell_NotifyIcon (NIM_ADD, @nid); end; procedure TForm1.IconTray (var Msg: TMessage); var Pt: TPoint; begin if Msg.lParam = wm_rbuttondown then begin GetCursorPos (Pt); // SetForegroundWindow (Handle); PopupMenu1.Popup (Pt.x, Pt.y); end; end; procedure TForm1.close1Click(Sender: TObject); begin form1.close; end; procedure TForm1.FormDestroy(Sender: TObject); begin nid.uFlags := 0; Shell_NotifyIcon (NIM_DELETE, @nid); end; procedure TForm1.Lloyd1Click(Sender: TObject); begin Showmessage('LloydSoft D+'); {Menu Popup} end;
gondraf@hotmail.com
end. Icone na Barra de Tarefas unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs ,ShellAPI, Menus; const wm_IconMessage = wm_User; type TForm1 = class(TForm) PopupMenu1: TPopupMenu; Lloyd1: TMenuItem; close1: TMenuItem; procedure FormCreate(Sender: TObject); procedure close1Click(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Lloyd1Click(Sender: TObject); private procedure IconTray (var Msg: TMessage); message wm_IconMessage; { Private declarations } public { Public declarations } nid: TNotifyIconData; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin // carrega o cone inicial Icon.Handle := LoadIcon (HInstance, 'MAINICON'); // preenche os dados da estrutura NotifyIcon nid.cbSize := sizeof (nid); nid.wnd := Handle; nid.uID := 1; // Identificador do cone nid.uCallBAckMessage := wm_IconMessage; nid.hIcon := Icon.Handle; nid.szTip := 'LloydSoft'; nid.uFlags := nif_Message or nif_Icon or nif_Tip; Shell_NotifyIcon (NIM_ADD, @nid); end; procedure TForm1.IconTray (var Msg: TMessage); var
gondraf@hotmail.com
Pt: TPoint; begin if Msg.lParam = wm_rbuttondown then begin GetCursorPos (Pt); // SetForegroundWindow (Handle); PopupMenu1.Popup (Pt.x, Pt.y); end; end; procedure TForm1.close1Click(Sender: TObject); begin form1.close; end; procedure TForm1.FormDestroy(Sender: TObject); begin nid.uFlags := 0; Shell_NotifyIcon (NIM_DELETE, @nid); end; procedure TForm1.Lloyd1Click(Sender: TObject); begin Showmessage('LloydSoft D+'); {Menu Popup} end; end. Abrir arquivos com aplicativo associado Inclua a unit SHELLAPI na clausula uses do seu form. procedure TForm1.ExecFile(F: String); var r: String; begin case ShellExecute(Handle, nil, PChar(F), nil, nil, SW_SHOWNORMAL) of ERROR_FILE_NOT_FOUND: r := 'The specified file was not found.'; ERROR_PATH_NOT_FOUND: r := 'The specified path was not found.'; ERROR_BAD_FORMAT: r := 'The .EXE file is invalid (non-Win32 .EXE or error in .EXE image).'; SE_ERR_ACCESSDENIED: r := 'Windows 95 only: The operating system denied access to the specified file.'; SE_ERR_ASSOCINCOMPLETE: r := 'The filename association is incomplete or invalid.'; SE_ERR_DDEBUSY: r := 'The DDE transaction could not be completed because other DDE transactions were being processed.'; SE_ERR_DDEFAIL: r := 'The DDE transaction failed.'; SE_ERR_DDETIMEOUT: r := 'The DDE transaction could not be completed because the request timed out.'; SE_ERR_DLLNOTFOUND: r := 'Windows 95 only: The specified dynamic-link library was not found.'; SE_ERR_NOASSOC: r := 'There is no application associated with the given filename extension.'; SE_ERR_OOM: r := 'Windows 95 only: There was not enough memory to complete the operation.'; SE_ERR_SHARE: r := 'A sharing violation occurred.'; else Exit; end; ShowMessage(r); end;
gondraf@hotmail.com
Utilize a funo assim: procedure TForm1.Button1Click(Sender: TObject); begin ExecFile('c:\windows\ladrilhos.bmp'); end; Adiciona a barra invertida a um texto selecionado function AddBarra(S: string): string; var Temp: string; begin Temp := S; if S[Length(Temp)] <> '\' then Temp := Temp + '\'; Result := Temp; end; Apagar um subdiretrio Inclua a unit SHELLAPI na clausula uses do seu form. procedure DeleteDir( hHandle : THandle; Const sPath : String ); var OpStruc: TSHFileOpStruct; FromBuffer, ToBuffer: Array[0..128] of Char; begin fillChar( OpStruc, Sizeof(OpStruc), 0 ); FillChar( FromBuffer, Sizeof(FromBuffer), 0 ); FillChar( ToBuffer, Sizeof(ToBuffer), 0 ); StrPCopy( FromBuffer, sPath); With OpStruc Do Begin Wnd:= hHandle; wFunc:=FO_DELETE; pFrom:= @FromBuffer; pTo:= @ToBuffer; fFlags:= FOF_NOCONFIRMATION; fAnyOperationsAborted:=False; hNameMappings:=nil; //lpszProgressTitle:=nil; End; ShFileOperation(OpStruc); end; Utilize a funo assim: procedure TForm1.Button1Click(Sender: TObject); begin DeleteDir( Self.Handle,'C:\TESTE'); end; Como verificar se um arquivo existe? If not(fileexists('c:\windows\nuvens.bmp')) then Showmessage('Arquivo inexistente');
gondraf@hotmail.com
Compara dois arquivos textos procedure TForm1.Button1Click(Sender: TObject); var filename1 : string; filename2 : string; begin filename1 := Edit1.Text; filename2 := Edit2.Text; compfile(filename1, filename2); showmessage('Veja o resultado no arquivo c:Tempdiff.txt'); end; procedure tform1.compfile(filename1, filename2 : string); var f1 : system.textfile; f2 : system.textfile; diff : system.textfile; buf1 : string; buf2 : string; l : integer; begin assignfile(f1, filename1); assignfile(f2, filename2); assignfile(diff, 'c:Tempdiff.txt'); reset(f1); reset(f2); rewrite(diff); l := 1; while not eof(f1) do begin readln(f1, buf1); readln(f2, buf2); if not (compstr(buf1, buf2) )then begin writeln(diff, 'line: '+ inttostr(l) + '-' + buf1); writeln(diff, 'line: '+ inttostr(l) + '-' + buf2); writeln(diff, ' '); end; inc(l); end; closefile(f1); closefile(f2); closefile(diff); end; function tform1.compstr(s1, s2 : string) : boolean; var i : integer; btemp : boolean; begin btemp := true; if (length(s1) <> length(s2)) then begin btemp := false; end{if} else begin for i:= 1 to length(s1) do begin if (s1[i] <> s2[i]) then begin btemp := false;
gondraf@hotmail.com
exit; end;{if} end;{for} end;{else} result := btemp; end; Copiando arquivos de diretrio para diretrio procedure CopyDir(const cFrom, cTo : string); var OpStruc : TSHFileOpStruct; frombuf, tobuf : array[0..128] of Char; begin FillChar(frombuf, Sizeof(frombuf), 0); FillChar(tobuf, Sizeof(tobuf), 0); StrPCopy(frombuf, cFrom); StrPCopy(tobuf, cTo); with OpStruc do begin Wnd := Application.Handle; wFunc := FO_COPY; pFrom := @frombuf; pTo := @tobuf; fFlags := FOF_NOCONFIRMATION or FOF_RENAMEONCOLLISION; fAnyOperationsAborted := False; hNameMappings := nil; lpszProgressTitle := nil; end; // with ShFileOperation(OpStruc); end; // CopyDir Copiando Um Arquivo Com Um Gauge Muitas vezes, quando temos a necessidade de copiar um arquivo de um lugar para outro, interessante mostrar ao usurio o andamento da cpia. Para tal, coloque em sua aplicao um gauge (optei por um gauge, mas poderia muito bem ser uma progressbar) e um boto para iniciar a cpia. No cdigo onClick do boto, coloque este cdigo. Neste exemplo, o programa cria um diretrio de back-up cujo nome do mesmo a data da cpia no formato AAAAMMDD. No nosso exemplo, chamei o gauge de ga_copia. procedure Tfrm_Manut.bt_backupClick(Sender: TObject); var strArqOrigem, // Nome do arquivo de origem da cpia strArqDestino: string; // Nome do arquivo de destino da cpia wDia,wMes,wAno: Word; begin try // Aciona o indicativo de progresso da cpia ga_copia.Visible := True; ga_copia.Progress := 0; // Monta os nomes de arquivo - Primeiro recupera de um AdoConnection // o nome do arquivo a ser copiado strArqOrigem := dm_spark.ADO_Spark.Properties[7].Value; // Agora vai montar o nome do arquivo de destino. DecodeDate(Date, wAno, wMes, wDia); strArqDestino := 'C:\prodata\copia\' + FormatFloat('0000', WAno); strArqDestino := strArqDestino + FormatFloat('00', wMes);
gondraf@hotmail.com
strArqDestino := strArqDestino + FormatFloat('00', wDia); strArqDestino := strArqDestino + '\' + ExtractFileName(strArqOrigem); // Desconecta o banco de dados dm_spark.ADO_Spark.Close; Repaint; // Inicia a cpia CopyFile(strArqOrigem, strArqDestino); finally // Reconecta o banco de dados dm_spark.ADO_Spark.Open; ga_copia.Visible := False; end; end; Agora que j definimos como e quando a cpia ser disparada, vamos definir a procedure copyfile que o motor da nossa cpia de arquivo. Esta procedure que vai fazer a cpia e incrementar o Gauge. procedure Tfrm_Manut.CopyFile(Source, Destination: string); var FromF,ToF: file of byte; Buffer: array[0..4096] of char; NumRead: Integer; FileLength: LongInt; NewPath: string; begin // Antes de copiar, verifica se j existe o diretrio // Caso o diretrio no exista, o mesmo vai ser criado NewPath := ExtractFilePath(Destination); if not DirectoryExists(NewPath) then begin CreateDir(NewPath); end else begin if FileExists(Destination) then begin if Application.MessageBox('O arquivo-destino da cpia de segurana j existe ' + #13#10 + 'Deseja sobrepr o mesmo com a nova cpia ?', 'Segurana', MB_YESNO + MB_ICONQUESTION) = MRNO then Exit; end; end; // Copia o arquivo // Abre o arquivo de origem e cria o arquivo destino AssignFile(FromF, Source); Reset(FromF); AssignFile(ToF, Destination); ReWrite(ToF); FileLength := FileSize(FromF); with ga_copia do begin MinValue := 0; MaxValue := FileLength; while FileLength > 0 do begin BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead); FileLength := FileLength - NumRead; BlockWrite(ToF, Buffer[0], NumRead);
gondraf@hotmail.com
AddProgress(NumRead); end; CloseFile(FromF); CloseFile(ToF); end; end; Exibindo as propriedades do arquivo A dica abaixo apresenta o cdigo de implementao para exibir na tela uma janela padro Windows de propriedades do arquivo. Para implementar este procedimento necessrio acrescentar a unit ShellAPI.As propriedades do arquivo so armazenadas numa estrutura chamada TShellExecuteInfo, que corresponde a um registro com os campos: tamanho do arquivo (cbSize), atributos (fMask), nome (lpFile) , shell (lpVerb) e modo de apresentao da janela (nShow).O primeiro passo do procedimento zerar todas a propriedades da Shell ( FillChar(S,SizeOf(S),0) ), segundo passo atualizar estas propriedades (With S do ) em relao ao arquivo indicado (Arq :String) e o terceiro passo abrir a janela de propriedades com os valores atualizados (ShellExecuteEx(@S)). Cdigo Completo: Procedure Propriedades(Arq:String); Var s:TShellExecuteInfo; Begin FillChar(S,SizeOf(S),0); With S do Begin cbSize := SizeOf(S); fMask := SEE_MASK_FLAG_NO_UI SEE_MASK_NOCLOSEPROCESS; wnd := Handle; lpVerb := 'properties'; lpFile := Pchar(Arq); nShow := sw_ShowNormal; End; ShellExecuteEx(@S); End; Lendo e gravando arquivos de texto Existem vrios mtodos em Delphi para gravar arquivos texto a partir de informaes gravadas em bases de dados ou para ler arquivos texto e armazen-los em bases de dados. Esta dica apresenta um destes mtodos: o uso de TextFiles. TextFile um tipo de dado pr-definido no Delphi e corresponde ao tipo Text do Turbo Pascal e do Object Pascal. Inicialmente para acessar um arquivo de texto, voc precisa definir uma varivel tipo TextFile, no local que voc achar mais apropriado, da seguinte forma: var arq: TextFile; Vamos precisar tambm de uma varivel tipo string para armazenar cada linha lida do arquivo: var linha: String; Antes de se iniciar a leitura do arquivo, precisamos associar a variavel TextFile com um arquivo fisicamente armazenado no disco:
or
SEE_MASK_INVOKEIDLIST
or
gondraf@hotmail.com
AssignFile ( arq, 'C:\AUTOEXEC.BAT' ); Reset ( arq ); A rotina AssignFile faz a associao enquanto Reset abre efetivamente o arquivo para leitura. AssignFile corresponde Assign do Turbo Pascal. Em seguida necessrio fazer uma leitura ao arquivo, para isto utilizaremos a procedure ReadLn: ReadLn ( arq, linha ); O comando acima l apenas uma linha de cada vez, assim precisamos de um loop para efetuar vrias leituras at que o arquivo acabe. Para verificar o fim do arquivo, utilizaremos a funo Eof: while not Eof ( arq ) do Agora uma rotina quase completa para fazer a leitura de um arquivo texto. Esta rotina recebe como parmetro o nome do arquivo que ser lido: procedure percorreArquivoTexto ( nomeDoArquivo: String ); var arq: TextFile; linha: String; begin AssignFile ( arq, nomeDoArquivo ); Reset ( arq ); ReadLn ( arq, linha ); while not Eof ( arq ) do begin { Processe a linha lida aqui. } { Para particionar a linha lida em pedaos, use a funo Copy. } ReadLn ( arq, linha ); end; CloseFile ( arq ); end; E tambm uma rotina quase completa para gravao de um arquivo texto. Esta rotina recebe como parmetro o nome do arquivo que ser gravado e uma tabela (TTable) de onde os dados sero lidos: procedure gravaArquivoTexto ( nomeDoArquivo: String; tabela: TTable ); var arq: TextFile; linha: String; begin AssignFile ( arq, nomeDoArquivo ); Rewrite ( arq ); tabela.First; while not tabela.Eof do begin Write ( arq, AjustaStr ( tabela.FieldByName ( 'Nome' ).AsString, 30 ) ); Write ( arq, FormatFloat ( '00000000.00', tabela.FieldByName ( 'Salario' ).AsFloat ) ); WriteLn ( arq ); tabela.Next; end; CloseFile ( arq ); end; Note nesta segunda rotina, a substituio de Reset por Rewrite logo aps o AssignFile. Rewrite abre o arquivo para escrita, destruindo tudo que houver l anteriormente . Note tambm o uso de Write e WriteLn para gravar dados no arquivo texto. Finalmente note o uso de AjustaStr e FormatFloat para garantir que campos string e numericos sejam gravados com um nmero fixo de caracteres. FormatFloat uma rotina do prprio Delphi enquanto AjustaStr est definida abaixo: function AjustaStr ( str: String; tam: Integer ): String;
gondraf@hotmail.com
begin while Length ( str ) < tam do str := str + ' '; if Length ( str ) > tam then str := Copy ( str, 1, tam ); Result := str; end; O uso da funo AjustaStr fundamental quando voc estiver gravando arquivos texto com registros de tamanho fixo a partir de bases de dados Paradox que usualmente no preenchem campos string com espaos no final. Procurando um arquivo em todo o HD interface type PRecInfo=^TRecInfo; Trecinfo=record prev:PRecInfo; fpathname:string; srchrec:Tsearchrec; end; implememtation function TForm1.RecurseDirectory(fname:string):tstringlist; var f1,f2:Tsearchrec; p1,tmp:PRecInfo; fwc:string; fpath:string; fbroke1,fbroke2:boolean; begin result:=tstringlist.create; fpath:=extractfilepath(fname); fwc:=extractfilename(fname); new(p1); p1.fpathname:=fpath; p1.prev:=nil; fbroke1:=false; fbroke2:=false; while(p1<>nil) do begin if (fbroke1=false) then if (fbroke2=false) then begin if (findfirst(fpath+'*',faAnyfile,f1)<>0) then break; end else if (findnext(f1)<>0) then begin repeat findclose(f1); if (p1=nil) then break; fpath:=p1.fpathname; f1:=p1.srchrec; tmp:=p1.prev;
gondraf@hotmail.com
dispose(p1); p1:=tmp; until (findnext(f1)=0); if (p1=nil) then break; end; if((f1.Name<>'.') and (f1.name<>'..') and ((f1.Attr and fadirectory)=fadirectory)) then begin fbroke1:=false; new(tmp); with tmp^ do begin fpathname:=fpath; srchrec.Time:=f1.time; srchrec.Size:=f1.size; srchrec.Attr:=f1.attr; srchrec.Name:=f1.name; srchrec.ExcludeAttr:=f1.excludeattr; srchrec.FindHandle:=f1.findhandle; srchrec.FindData:=f1.FindData; end; tmp.prev:=p1; p1:=tmp; fpath:=p1.fpathname+f1.name+'\'; if findfirst(fpath+fwc,faAnyfile,f2)=0 then begin result.add(fpath+f2.Name); while(findnext(f2)=0) do result.add(fpath+f2.Name); findclose(f2); end; fbroke2:=false; end else begin if (findnext(f1)<>0) then begin findclose(f1); fpath:=p1.fpathname; f1:=p1.srchrec; fbroke1:=false; fbroke2:=true; tmp:=p1.prev; dispose(p1); p1:=tmp; end else begin fbroke1:=true; fbroke2:=false; end; end; end; fpath:=extractfilepath(fname); if findfirst(fname,faAnyfile,f1)=0 then begin result.add(fpath+f2.Name); while(findnext(f1)=0) do result.add(fpath+f2.Name);
gondraf@hotmail.com
findclose(f1); end; end; //Chame a funcao deste jeito: procedure TForm1.Button1Click(Sender: TObject); var l1:Tstringlist; begin l1:=tstringlist.create; listbox1.items.clear; listbox1.Items.BeginUpdate; l1:=recursedirectory1('C:\*.exe'); listbox1.items.assign(l1); freeandnil(l1); listbox1.Items.endUpdate; end; Acessando o banco de dados Oracle a partir do Delphi Em vista de muitos hoje possurem sistemas rodando com banco de dados Oracle, resolvemos publicar em detalhes todos passos necessrios para se conectar a um banco Oracle a partir do Delphi de modo nativo (usando BDE) e atravs do ODBC. Temos observado tambm que dvidas sobre este assunto esto sempre presentes nas listas de discusso sobre Delphi e sobre Oracle. Utilizamos com bons resultados as verses do Delphi 2.0 at a 4.0, BDE verses 4.5 e 5.0, e o Oracle7 Workgroup Server Release 7.3.2.1. Naturalmente tais informaes sero de grande ajuda para configurao em outras verses. Passos: 1 - Caso tenha instalado em sua mquina algum cliente do Oracle 16 bits, poder ter algum tipo de conflito com drives de 32 bits. Portanto, desinstale todos os clientes Oracle e instale somente o cliente Oracle 32 bits. Normalmente isto feito a partir do CD de instalao do Oracle executando o programa d:\win95\install\setup.exe 2 - Ao executar o instalador do cliente Oracle para Windows 95, voc dever de inicio informar o idioma (o mesmo que foi informado durante a instalao do prprio banco), tendo o English como padro. 3 - Entre com o nome da empresa e o diretrio onde sero armazenados os arquivos do cliente Oracle. 4 - Ser solicitado o tipo da instalao. Escolha a opo "Selective Products Install". 5 - Ser apresentada uma lista dos produtos ou componentes disponveis. Apesar de poder instalar todos, sero apenas necessrios para a conexo com o banco Oracle a partir do Delphi os seguintes componentes: Sql *Net Client (para criao do alias no cliente Oracle) Oracle Installer (para instalar/remover componentes) 6 - Selecione os protocolos desejados para comunicao com o banco, ou poder deixar selecionado a sugesto do instalador e prosseguir. 7 - Aps completar 100% da instalao, voc visualizar os componentes instalados: Oracle Installer Oracle Named Pipes Adapter (protocolo de acordo com sua rede)
gondraf@hotmail.com
Oracle SPX Adapter (protocolo de acordo com sua rede) Oracle TCP/IP Adapter (protocolo de acordo com sua rede) Required Support Files Sql *Net Client 8 - Saia do instalador. No ser necessrio reiniciar a mquina por enquanto. 9 - Clique no boto iniciar -> programas -> Oracle for windows 95 -> Sql Net Easy Configuration 10 - Selecione "Add Database Alias", e clique OK 11 - Informe na sequncia: Database Alias (nome na sua mquina que representar o acesso ao banco) Escolha o Protocolo (normalmente TCP/IP) TCP/IP Host Name (informe o numero IP do servidor Oracle) Database Instance (nome da instncia do banco, consulte o DBA) 12 - Clique em "yes" e saia do Sql Net Easy Configuration 13 - Chame o BDE Administrator, e clique na guia Configuration -> Drivers ->Native e selecione ORACLE. Como sugesto use as seguintes configuraes: VERSION 4.0 TYPE SERVER DLL32 SQLORA32.DLL VENDOR INIT ORA73.DLL DRIVER FLAG (DEIXAR VAZIO) TRACE MODE 0 BATCH COUNT 200 BLOB SIZE 32 BLOBS TO CACHE 64 ENABLE BCD FALSE ENABLE INTEGERS FALSE ENABLE SCHEMA CACHE FALSE LANGDRIVER (DEIXAR VAZIO) LIST SYNONYMS NONE MAX ROWS
gondraf@hotmail.com
1 NET PROTOCOL TNS OBJECT MODE TRUE OPEN MODE READ/WRITE ROWSET SIZE 20 SCHEMA CACHE DIR (DEIXAR VAZIO) SCHEMA CACHE SIZE 8 SCHEMA CACHE TIME 1 SERVER NAME (COLOQUE O NOME DA INSTANCIA DO BANCO, DEFAULT: ORCL) SQLPASSTHRU MODE SHARED AUTOCOMMIT SQLQRYMODE SERVER USER NAME (NOME DE USUARIO, OPCIONAL) 14 - Clique no item de menu Object -> Apply 15 - Agora precisamos apenas criar um Alias que ser enxergado no Delphi. Para isso, clique na guia Database, clique com o boto direito do mouse sobre o item da lista Databases e selecione a opo New. Escolha a opo ORACLE. Entre com o nome do Alias, que pode ser qualquer um que no exista. Agora altere do lado esquerdo na guia Definition, no item SERVER NAME, e coloque o nome do Database Alias que voc criou no Sql Net Easy Configuration. 16 - Clique no item de menu Object -> Apply 17 - Reinicialize seu computador. 18 - Ok, agora basta abrir o Delphi e utilizar este Alias como qualquer outro! Alterando o NetDir via programao: Muitas vezes precisamos alterar o NetDir do BDE para que nossas aplicaes funcionem corretamente. E com poucas linhas de cdigo voc poder deixar para que sua prpria aplicao faa isso. Abaixo est uma rotina para alterar o NetDir de acordo com o drive informado como parmetro: uses BDE; // no esquea de incluir esta unit // ChangeNetDir procedure ChangeNetDir(Drive: Char); var hCur: hDBICur; Config: CFGDesc; Cont: Boolean; begin if DbiInit(nil) = DBIERR_NONE then begin hCur := nil; if DbiOpenCfgInfoList(nil, dbiREADWRITE, cfgPersistent,
gondraf@hotmail.com
'\DRIVERS\PARADOX\INIT', hCur) = DBIERR_NONE then begin if DbiSetToBegin(hCur) = DBIERR_NONE then begin Cont := True; while Cont do begin if (DbiGetNextRecord(hCur, dbiWRITELOCK, @Config, nil) <> DBIERR_NONE) then Cont := False else if StrIComp(Config.szNodeName, 'NET DIR') = 0 then begin StrPCopy(Config.szValue, Drive + ':\'); DbiModifyRecord(hCur, @Config, True); Cont := False end; end; end; end; DbiExit(); end; end; O uso deste procedimento pode ser assim: procedure TForm1.Button1Click(Sender: TObject); begin ChangeNetDir('H'); end; Apagando todos os registros da tabela Para apagar os registros de uma tabela utiliza-se a funo delete. Atravs de um comando de repetio (While) possvel excluir todos os registros da tabela, usando como flag a quantidade de registros existentes na tabela (RecordCount > 0). Cdigo Completo: Procedure ApagarTodosReg(Origem:TDataSet); Begin With Origem do While RecordCount > 0 do Delete; End; Como Usar: ApagarTodosReg(Table1); ou ApagarTodosReg(Query1); Armazanando sons, vdeos em bancos de dados Um dos recursos mais interessantes nos bancos de dados atuais a possibilidade de armazenar recursos multimdia juntamente com outras informaes. Dessa forma, possvel criar registros com informaes mais ricas sobre um determinado assunto. Por exemplo, pode-se armazenar informaes sobre um funcionrio juntamente com a sua prpria foto. No Paradox, por exemplo, existe um tipo de campo destinado especialmente para esse fim. No entanto, as possibilidades vo muito alm do que o simples armazenamento de imagens. possvel armazenar sons, filmes ou qualquer tipo de arquivo, usando o "obscuro" campo BLOB
gondraf@hotmail.com
(Binary Large Object), que permite que qualquer arquivo seja "embutido" no banco de dados. Na verdade, o contedo do arquivo no armazenado no registro em si, mas num arquivo separado que manipulado internamente pelo banco de dados. Trabalhar com esse tipo de campo no Delphi muito simples, mas no to bvio primeira vista. A manipulao de campos BLOB, diferentemente dos campos comuns, no deve ser feita diretamente, mas sim por meio do objeto TBlobField, descendente do TField, que disponibiliza recursos especiais para esse fim. Para isso, voc deve sempre se referir ao campo BLOB no cdigo como sendo um TBlobField, utilizando typecasting. Vamos supor que voc tenha um arquivo de som MyWave.wav que ser armazenado no campo "SOM" da tabela "MyTable". Para carregar o contedo do arquivo no campo SOM, basta fazer assim: TBlobField(MyTable.FieldByName('SOM')).LoadFromFile('MeuWave.wav'); Neste exemplo, voc usou o recurso de typecasting para manipular o campo como sendo um objeto TBlobField, carregando o arquivo atravs do mtodo LoadFromFile que existe nesse objeto. Fcil, no ? Se voc quiser salvar o contedo do campo "SOM" no arquivo "MyWaveCopy.wav", basta fazer assim: TBlobField(MyTable.FieldByName('SOM')).SaveToFile('MyWaveCopy.60wav'); Para remover o contedo do campo "SOM" (limp-lo), voc tambm deve usar um mtodo apropriado: TBlobField(MyTable.FieldByName('SOM')).Clear; Para saber se o campo SOM possui algum contedo, use a propriedade IsNull: with MyTable do if not TBlobField(FieldByName('SOM')).IsNull then TBlobField(FieldByName('SOM')).SaveToFile('MyWaveCopy.wav'); A maneira mais simples de utilizar o contedo de um campo BLOB j armazenado primeiro grav-lo novamente em um arquivo em disco, usando o mtodo SaveToFile, e depois manipul-lo normalmente. No caso de um contedo em formato wave, por exemplo, voc deve primeiro gravlo num arquivo .wav, e ento reproduz-lo atravs do TMediaPlayer ou pela funo SndPlaySound. Usando os mesmos mtodos, voc tambm pode armazenar e manipular filmes AVI, apresentaes, documentos, enfim, o que a sua imaginao mandar. Mas tenha em mente que o armazenamento de arquivos de som ou outros tipos vai aumentar consideravelmente o tamanho do seu banco de dados, por isso esse recurso deve ser utilizado com cuidado. Uma boa medida para reduzir esse problema compactar o arquivo antes de armazen-lo. Para utiliz-lo depois, basta gerar o arquivo novamente em disco e descompact-lo. Para saber quanto um campo BLOB est ocupando num registro do seu arquivo, em bytes, use a propriedade BlobSize: TBlobField(MyTable.FieldByName('SOM')).BlobSize; Obs: Para armazenar imagens ou texto em formato RichText (RTF), use os tipos GRAPHIC e FORMATED MEMO do Paradox, que so destinados a esses tipos de dados. O Delphi tambm possui objetos para a manipulao desses campos: TGraphicField e TMemoField, ambos descendentes do TBlobField. Backup & Restaurao Para efetuar a cpia: procedure TFormCopia.BitBtn1Click(Sender: TObject); var I: Integer; begin
gondraf@hotmail.com
Database1.Connected:=True; // Database para controle Table2.DatabaseName:=DirectoryListBox1.Directory; // Seleciona local de destino da cpia with Session1 do begin Active:=True; GetTableNames('AliasName','*.*',True,True,Memo1.Lines); // Retorna o nome das tabelas end; for I:= 0 to Memo1.Lines.Count - 1 do begin Table1.TableName:=Memo1.Lines[I]; // Tabela origem Table2.TableName:=Memo1.Lines[I]; // Tabela destino BatchMove1.Execute; end; end; Para efetuar a restaurao: procedure TFormRestaura.BitBtn1Click(Sender: TObject); var I: Integer; begin Database1.Connected:=True; Table2.DatabaseName:=DirectoryListBox1.Directory; // Origem da restaurao with Session1 do begin Active:=True; GetTableNames(Table2.DatabaseName,'*.*',True,True,Memo1.Lines); // Retorna nomes das tabelas end; for I:= 0 to Memo1.Lines.Count - 1 do begin Table1.TableName:=Memo1.Lines[I]; // Tabela origem Table2.TableName:=Memo1.Lines[I]; // Tabela destino BatchMove1.Execute; end; end; Aps restaurar por este mtodo, voc deve recriar os ndices. Como acessar pelo Delphi, tabelas no Acess Primeiro crie um alias apontando para o diretorio onde est o arquivo mdb do access, este apontamento deve ser testado clicando no boto connectt. Se funcionar, pode fechar salvando o novo alias. Caso contrrio verifique se o diretrio est correto e se o arquivo mdb existe neste diretrio. Bem, aps isso, v no delphi, abra um projeto novo, coloque um componente tdatabase, uma query, um datasource e um dbgrid. Aps isso clique duas vezes no componente tdatabase, aps clicar, aparecer um formulrio, informe o nome que deseja dar ao database em name, em alias name, clique na seta e escolha o alias criado anteriormente, depois clique em defaults, se quiser uma senha para acesso ao banco, procure a palavra PASSWORD dentro da janela que foi preenchida com comandos quando voc clicou em defaults, e digite a senha desejada, se no quiser senha deixe em branco. Aps fazer isto, clique em OK. Bem, agora v em propriedades do tdatabase e clique em conectt, ele vai pedir um usurio e uma senha, se no colocou password, basta clicar em ok que ele se conectar e caso tenha uma password digite-a. Uma vez conectado, v na query, na propriedade strings, coloque a instruo SELECT acessando a tabela que est dentro do arquivo MDB. Veja bem, no para colocar o arquivo mdb mas sim uma ou mais das tabelas que esto dentro do MDB. Depois disso na propriedade database, escolha o nome que deu ao seu database, se voc fez tudo correto, o nome dele tem que estar na lista. Bom, agora active a query.
gondraf@hotmail.com
Aps isso v no datasource e conecte-o query, e depois v no dbgrid e sete o datasource para o datasource criado. Se fez tudo correto e se a tabela tiver dados, voc os ver no dbgrid. Como alterar o driver de acesso do access no bde automaticamente procedure ChangeAccessDLL32(Dll : String); BDE\Drivers\Native\MSACCESS\Dll32 var Reg : TRegistry; begin Reg := TRegistry.Create; try Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.OpenKey('\Software\Borland\DataBase Engine\Settings\Drivers\MSACCESS\INIT', True) then Reg.WriteString('DLL32',Dll); finally Reg.CloseKey; Reg.Free; end; end; // Altera a Propriedade do
-------> Use de preferncia no OnCreate do Form ou DataModule da seguinte forma: ChangeACCESSDll32('IDDA3532.DLL'); // Mudando a DLL de acesso ao ACCESS Como converter DBF para Paradox e Acess para Paradox A) ACCESS PARA PARADOX DIGAMOS QUE VOC TENHA UM BANCO DE DADOS EM ACCESS CHAMADO DISCOTECA.MDB E QUE NELE TENHA VRIAS TABELAS, VAMOS CONVERTER APENAS UMA, QUE NO NOSSO EXEMPLO SE CHAMA: AUTORES, E QUE SE QUISESSEMOS CONVERTER OUTRAS O PROCEDIMENTO SERIA EXATAMENTE O MESMO. Abra o database desktop e crie um alias chamado DISCO, informe o drive desejado como ACCESS, veja bem ACCESS e no microsoft access drive, t legal ???, depois no campo database que se abriu bem abaixo, indique o diretorio onde se encontra o banco do access exemplo: c:\discoteca\dados\discoteca.mdb, para testar e ver se est correto clique no boto conectt, se der algum erro porque no existe o caminho ou o arquivo mdb informado no campo database. Uma vez que conectou, feche o alias e v em file no menu da database desktop, clique em new e depois em sql file, na janela que se abre digite select * from autores, uma vez que digitou a instruo, clique no boto Query que est em cima h direita, ele tem um ponto de interrogao preto, bom depois de clicar se abrir uma tela, bem no meio tem table type com duas opes: PARADOX E DBASE, ESCOLHA PARADOX, depois v onde est table name bem no meio da tela, digite o diretrio e o nome do arquivo que quer que receba a tabela do access convertida, pronto, quando fizer isso ela j estar convertida, com o nome que voc deu com extenso db. Ou seja voc tem uma tabela paradox com os dados que estavam em autores dentro do banco do access. B) DBF PARA PARADOX Abrir o database desktop, abra uma nova qbe e procure o diretorio onde est o dbf.
gondraf@hotmail.com
Uma vez escolhido, clique nele, aparecer um retangulo como quadrinhos ao lado de cada campo, clique no primeiro quadrado que marcar todos automaticamente. Feito isso clique na paleta onde est escrito Query e v em propriedades, aparecer um form onde voc pode escolher entre paradox ou dbase, escolha paradox e logo embaixo digite o diretorio e o nome da tabela que voce quer criar, tecle o raizinho para rodar a query que ento ele converter para paradox. Como importar dados de um arquivo texto para uma Tabela var sArquivo: TextFile; Entrada, sArq2: string; iLinha: integer; begin tblCep.Open; tblCepLoc.Open; bCancelaImport := False; AssignFile(sArquivo, FileNameEdit1.FileName); sArq2 := After('Cep_Loc.txt',FileNameEdit1.FileName); iLinha := 0; if FileNameEdit1.FileName = 'C:\Download\Ceps\Cep_loc.txt' then begin // Arquivo de Localidades RzProgressBar1.TotalParts := 0; RzProgressBar1.TotalParts := NumLinhasArq(FileNameEdit1.FileName); Reset(sArquivo); Readln(sArquivo,Entrada); while not Eoln(sArquivo) do begin Inc(iLinha); Readln(sArquivo,Entrada); // 0 = Base Total e 2 = Inclusao if (copy(Entrada,90,1) = '0') or (copy(Entrada,90,1) = '2') then begin tblCepLoc.Append; tblCepLoc.FieldByName('cep_ChvLocal').AsString := copy(Entrada,1,6); tblCepLoc.FieldByName('cep_Cidade').AsString := copy(Entrada,7,60); tblCepLoc.FieldByName('cep_UF').AsString := copy(Entrada,75,2); try tblCepLoc.Post; except tblCepLoc.Cancel; end; end else if (copy(Entrada,90,1) = '1') then begin // Exclusao if tblCepLoc.Locate('cep_ChvLocal', copy(Entrada,1,6), [loPartialKey]) then tblCepLoc.Delete; end else if (copy(Entrada,90,1) = '3') then begin // Alteracao if tblCepLoc.Locate('cep_ChvLocal', copy(Entrada,1,6), [loPartialKey]) then begin tblCepLoc.Edit; tblCepLoc.FieldByName('cep_Cidade').AsString := copy(Entrada,7,60); tblCepLoc.FieldByName('cep_UF').AsString :=
gondraf@hotmail.com
copy(Entrada,75,2); end; try tblCepLoc.Post; except tblCepLoc.Cancel; end; end; RzProgressBar1.PartsComplete := iLinha; Application.ProcessMessages; if bCancelaImport then Break; end; CloseFile(sArquivo); end; Evitando o erro de Key Violation A dica abaixo apresenta o cdigo para evitar que o programa pare e envie uma mensagem padro de erro por Key Violation (Chave Primria). Para isto, o cdigo deve ser inserido no evento OnPostError do componente de banco de dados (Table ou Query). Toda vez que ocorrer um erro de gravao no banco de dados este evento ser executado, sendo que na varivel de parmetro "E" deste procedimento armazenado a mensagem que ser apresentada na tela. No caso de Key Violation a mensagem exatamente esta: "Key violation.". Para realizar um tratamento deste erro, testa-se se a mensagem ocorrida "Key violation.', se for verdadeiro o processo de gravao abortado (Action := daAbort). Cdigo Completo: Procedure TForm1.Table1PostError(DataSet: TDataSet; E: EDatabaseError;var TDataAction); Var ErroMens :String; begin ErroMens := E.Message; if ErroMens = 'Key violation.' then begin ShowMessage('Chave Primria Invlida !'); action := daAbort; end; end; Gravar imagem JPG em tabela Paradox Procedure Grava_Imagem_JPEG(Tabela:TTable; Campo:TBlobField; Foto:TImage; Dialog:TOpenPictureDialog); var BS:TBlobStream; MinhaImagem:TJPEGImage; Begin Dialog.InitialDir := 'c:\temp'; Dialog.Execute; if Dialog.FileName <> '' Then Begin if not (Tabela.State in [dsEdit, dsInsert]) Then Tabela.Edit; Action:
gondraf@hotmail.com
BS := TBlobStream.Create((Campo as TBlobField), BMWRITE); MinhaImagem := TJPEGImage.Create; MinhaImagem.LoadFromFile(Dialog.FileName); MinhaImagem.SaveToStream(BS); Foto.Picture.Assign(MinhaImagem); BS.Free; MinhaImagem.Free; Tabela.Post; DBISaveChanges(Tabela.Handle); End; End; procedure TForm1.Button1Click(Sender: TObject); begin Grava_Imagem_JPEG(TbClientes,TbClientesCli_Foto, Image1, OpenPictureDialog1); // TbClientes o nome de alguma Tabela // TbClientesCli_Foto um variavel da tabela do tipo Blob // Image1 um componente // OpenPictureDialog1 o componente para abrir a figura end; Ler imagem JPG da tabela Paradox Procedure Le_Imagem_JPEG(Campo:TBlobField; Foto:TImage); var BS:TBlobStream; MinhaImagem:TJPEGImage; Begin if Campo.AsString <> '' Then Begin BS := TBlobStream.Create((Campo as TBlobField), BMREAD); MinhaImagem := TJPEGImage.Create; MinhaImagem.LoadFromStream(BS); Foto.Picture.Assign(MinhaImagem); BS.Free; MinhaImagem.Free; End Else Foto.Picture.LoadFromFile('c:\temp\limpa.jpg'); End; procedure TForm1.Button1Click(Sender: TObject); begin Le_Imagem_JPEG(TbClientesCli_Foto, Image1); // TbClientesCli_Foto um variavel da tabela do tipo Blob // Image1 um componente end; Listando os campos da tabela num Memo A implementao da funo abaixo permite inserir os campos de uma tabela num componente TMemo. Para que a funo funcione necessrio que as units StdCtrls e DbTables tenham sido declaradas. Os campos que sero listados, so aqueles que foram declarados atravs da operao de duplo clique no componente Table e opo ADD Fields. Cdigo Completo:
gondraf@hotmail.com
Procedure ListaCampos(TB:Ttable;M:Tmemo); Begin M.Lines.Assign(TB.ListField); End; Exemplo: Procedure TForm1.Button1Click(Sender:TObject); Begin ListaCampos(Table1,Memo1); end; PARADOX EM REDE Arquivos Paradox podem ser compartilhados em rede. Para que isto ocorra devemos : Adicionar o DATABASE ENGINE CONFIGURATION (BDE CONFIG) Selecionar a pgina DRIVERS Selecionar o driver PARADOX e alterar o parmetro NET DIR para o local onde sero gravados os arquivos de controle para compartilhamento. Por exemplo, "G:\MEUAPLIC", onde G : corresponde ao drive de rede e MEUAPLIC, o diretrio aonde est o aplicativo (executvel) Depois selecionar a pgina SYSTEM Alterar o parmetro LOCAL SHARE para TRUE. Aps isto o BDE controlar o compartilhamento de arquivos PARADOX em rede Alterando a fonte de determinado registro em um DBGrid Para trocar a fonte de um DBGrid, utilize a rotina abaixo no evento OnDrawDataCell: if Tabela.FieldByName ('Salario').Value >= 10000 then begin DbGrid1.Canvas.Font.Color := clRed; DbGrid1.Canvas.Font.Style := [fsBold]; end; DbGrid1.DefaultDrawDataCell(Rect, Field, State); No caso, somente os registros com salrio maior que R$ 10.000,00 ficaro com cor vermelha e em negrito. Nota: No necessrio mover o ponteiro da tabela para colorir os registros. Alterando cor de linha de um DBGrid Coloque a propriedade defaultdrawdata do dbgrid em FALSE No evento onDrawColumnCell do seu grid coloque o seguinte: procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin If table1PRAZO.Value > DATE then // condio Dbgrid1.Canvas.Font.Color:= clFuchsia; // coloque aqui a cor desejada Dbgrid1.DefaultDrawDataCell(Rect, dbgrid1.columns[datacol].field, State); end;
gondraf@hotmail.com
DbGrid Zebrado O exemplo abaixo mostra como deixar cada linha do componente DBGrid de uma cor diferente, dando assim um efeito zebrado. O controle feito no evento OnDrawColumnCell. unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Db, DBTables, Grids, DBGrids, StdCtrls; type TForm1 = class(TForm) Button1: TButton; DBGrid1: TDBGrid; Table1: TTable; DataSource1: TDataSource; procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin If odd(Table1.RecNo) then begin DBGrid1.Canvas.Font.Color:= clWhite; DBGrid1.Canvas.Brush.Color:= clGreen; end else begin DBGrid1.Canvas.Font.Color:= clBlack; DBGrid1.Canvas.Brush.Color:= clWhite; end; DBGrid1.Canvas.FillRect(Rect); DBGrid1.Canvas.TextOut(Rect.Left+2,Rect.Top,Column.Field.AsString); end; Procura e substituio de string num campo memo Procedure TForm1.Button1Click (Sender: TObject); Begin FindReplace(Edit1.Text,Edit2.Text, Memo1); end; Procedure FindReplace (const Enc, subs: String; Var Texto: TMemo); Var i, Posicao: Integer; Linha: string;
gondraf@hotmail.com
Begin For i:= 0 to Texto.Lines.count - 1 do begin Linha := Texto. Lines[i]; Repeat Posicao:=Pos(Enc,Linha); If Posicao > 0 then Begin Delete(Linha,Posicao,Length(Enc)); Insert(Subs,Linha,Posicao); Texto.Lines[i]:=Linha; end; until Posicao = 0; end; end; Criando tabelas via SQL Inclua na seo uses: dbTables - Coloque um TButton no form; - Escreve no OnClick do Button como abaixo: procedure TForm1.Button1Click(Sender: TObject); var Q: TQuery; begin Q := TQuery.Create(Application); try Q.DatabaseName := 'SF'; with Q.SQL do begin Add('Create Table Funcionarios'); Add('( Codigo AutoInc,'); Add(' Nome Char(30),'); Add(' Salario Money,'); Add(' Depto SmallInt,'); Add(' Primary Key (Codigo) )'); end; Q.ExecSQL; finally Q.Free; end; end; Observaes Este exemplo foi testado com banco de dados Paradox, porm dever funcionar em vrios outros bancos de dados com pouca ou nenhuma alterao. Sql relacionada com a primeira letra query1.active := false; query1.sql.clear; query1.sql.add('select * from estrucpr where upper(portugues)like "LETRA%" '); query1.active:= true; PRIMEIRA LETRA "LETRA%" ULTIMA LETRA "%LETRA" QUE CONTENHA A LETRA "%LETRA%"
gondraf@hotmail.com
Consultar por ms de um campo data Use uma Query como abaixo: - Coloque no form os seguintes componentes: * TQuery * TDataSource * TDBGrid * TEdit * TButton - Altere as propriedades dos componentes como abaixo: * Query1.DatabaseName = (alias do BDE) * DataSource1.DataSet = Query1 * DBGrid1.DataSource = DataSource1 - Coloque o cdigo abaixo no evento OnClick de Button1: Query1.Close; Query1.SQL.Clear; Query1.SQL.Add('select * from dCli'); Query1.SQL.Add('where extract(month from DataNasc) = :Mes'); Query1.ParamByName('Mes').AsInteger := StrToInt(Edit1.Text); Query1.Open; - Execute. Digite um nmero de 1 a 12 no Edit e clique no boto. Observaes Os nmeros de 1 a 12 representam, respectivamente, os meses de Janeiro a Dezembro. Este exemplo foi testado com Delphi4, BDE5 e tabela Paradox7. Colocar o mes por extenso unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); function MesExtenso( Mes:Word ) : string; private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation
gondraf@hotmail.com
{$R *.DFM} function TForm1.MesExtenso( Ms:Word ) : string; const meses : array[0..11] of PChar = ('Janeiro', 'Fevereiro', 'Maro', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro','Outubro', 'Novembro', 'Dezembro'); begin result := meses[mes-1]; End; procedure TForm1.Button1Click(Sender: TObject); begin label1.Caption := MesExtenso(3); end; end. Como retornar quantidade de dias meses e anos entre duas datas Procedure EntreDatas(DataFinal,DataInicial : TDate ; var Anos,Meses,Dias : Integer) ; // Retorna a diferena em Dias,Meses e Anos entre 2 datas Function Calcula(Periodo : Integer) : Integer ; var intCont : Integer ; begin intCont := 0 ; Repeat Inc(intCont) ; DataFinal := IncMonth(DataFinal,Periodo * -1) ; Until DataFinal < DataInicial ; DataFinal := IncMonth(DataFinal,Periodo) ; Inc(intCont,-1) ; Result := intCont ; End ; begin if DataFinal <= DataInicial then begin Anos := 0 ; Meses := 0 ; Dias := 0 ; exit ; end; Anos := Calcula(12) ; Meses := Calcula(1) ; Dias := Round(DataFinal - DataInicial) ; end; Alinhar Panel Ao Centro do Formulrio procedure AlinharPanel(AForm: TForm; APanel: TPanel; ACentro: Boolean); begin if ACentro then begin APanel.Left := (AForm.ClientWidth div 2) - (APanel.Width div 2); APanel.Top := (AForm.ClientHeight div 2) - (APanel.Height div 2); end else
gondraf@hotmail.com
begin APanel.Left := (AForm.ClientWidth + 100); APanel.Top := (AForm.ClientHeight + 100); end; APanel.Update; AForm.Update; end; Colorao Gradiente no Form procedure TForm1.FormPaint(Sender: TObject); var altura, coluna: Word; begin altura := (ClientHeight + 255) div 256; for coluna := 0 to 255 do with Canvas do begin Brush.Color := RGB(coluna, 0, 0); { Modifique para obter cores diferentes } FillRect(Rect(0, coluna * altura, ClientWidth, (coluna + 1) * altura)) ; end; end; procedure TForm1.FormResize(Sender: TObject); begin Invalidate; end; Como Criar Forms Em Tempo de Execuo Para voc economizar memria, pode-se criar os forms de sua aplicao somente no momento da execuo. Na criao do Form voc define se ele MODAL ou NO MODAL. Para Isso observe os seguintes cdigos: MODAL - Mostra form em modo exclusivo procedure TForm1.Button1Click(Sender: TObject); begin Application.CreateForm(TForm2, Form2);{Carrega form na memria} Form2.ShowModal;{Mostra form em modo exclusivo} Form2.Free; {Libera Memria} end; NO MODAL - Mostra form em modo no exclusivo procedure TForm1.Button1Click(Sender: TObject); begin Application.CreateForm(TForm2, Form2);{Carrega form na memria} Form2.ShowModal;{Mostra form em modo exclusivo} end; No evento OnClose do Form2 coloque o seguinte cdigo. procedure TForm2.FormClose (Sender: Tobject; var Action : TCloseAction); begin Action:= caFree; end; Aliado a este cdigo, voc deve alterar no delphi, no menu Options, opo Project. Mudando os forms a serem criados dinamicamente da coluna Auto-Create Forms para Avaliable Forms. Como evitar efeito de maximizao
gondraf@hotmail.com
Se voc j desenvolveu uma aplicao MDI com um formulrio MDIChild que tem que ser exibido em estado Maximizado (WindowState=wsMaximized), provavelmente voc j se deparou com aquele deselegante problema em que o usurio acompanha a maximizao do seu formulrio. Para evitar isto, faa o seguinte: Antes de criar o seu formulrio para a exibio, utilize LockWindowUpdate(Handle); Aps a criao do formulrio, utilize LockWindowUpdate(0); Com isto, voc dar um efeito mais profissional s suas aplicaes. Exemplo: procedure MainForm.ItemArqCadFor(Sender: TObject); begin LockWindowUpdate(Handle); with TFrmCadFor.Create(self) do Show; LockWindowUpdate(0); end; Como Saber se o aplicativo ja foi aberto Como saber se o aplicativo j foi aberto Insira o cdigo abaixo dentro do arquivo .DPR de sua aplicao {$R *.RES} begin Application.Title := ''; Application.HelpFile := ''; if HPrevInst = 0 then begin F_Splash := TF_Splash.create(Application); F_Splash.Show; Application.CreateForm(TF_Menu, F_Menu); Application.CreateForm(TF_Error, F_Error); Application.CreateForm(TF_Form1, F_From1); Application.CreateForm(TF_Form2, F_Form2j); Application.Run; end else messagedlg('O sistema j foi nicializado!',mtinformation,[mbok],0); end. Criando janelas no retangulares Para criar uma janela no retangular, voce deve criar uma Regio do Windows e usar a funo da API SetWindowRgn, desta maneira: var hR : THandle; begin {cria uma Regio elptica} hR := CreateEllipticRgn(0,0,100,200); SetWindowRgn(Handle,hR,True); end; Form com um furo var
gondraf@hotmail.com
Region, Region2 : hrgn; begin Form1.FormStyle:= fsStayOnTop; Region := CreaterectRgn(0,0,width,height); Region2 := CreateEllipticRgn(30,30,100,100); CombineRgn(region, region, region2, RGN_DIFF); SetWindowRgn(handle, region, true); end; Formulrio Transparente unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormShow(Sender: TObject); begin Brush.Style := BsClear; end; end. Texto Na Diagonal e Girando procedure TForm1.Button1Click(Sender: TObject); var lf: TLogFont; tf: TFont; i: integer; begin with Form1.Canvas do begin Font.Name := 'Verdana'; Font.Size := 16; tf := TFont.Create; tf.Assign(Font); GetObject(tf.Handle, sizeof(lf), @lf); lf.lfOrientation := 1000; end; for i := 900 downto 1 do
gondraf@hotmail.com
begin lf.lfEscapement := i; tf.Handle := CreateFontIndirect(lf); Form1.Canvas.Font.Assign(tf); Form1.Canvas.TextOut(200, Height div 2, 'Retirado da Internet'); //Sleep(10); //Este pode cria um Delay na execuo end; tf.Free; end; Para testar essa dica coloque um Timer sete o interval para 5000 e um Boto e coloque o cdigo abaixo! o cdigo travar o mouse e teclado por 5 segundos! unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; procedure BlockInput(ABlockInput : boolean); stdcall; external 'USER32.DLL'; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin BlockInput(True); Timer1.Enabled:=True; end; procedure TForm1.Timer1Timer(Sender: TObject); begin BlockInput(false); Timer1.Enabled:=false; end; end. Detectando o Numero Serial do HD Function SerialNum(FDrive:String) :String;
gondraf@hotmail.com
Var Serial:DWord; DirLen,Flags: DWord; DLabel : Array[0..11] of Char; begin Try GetVolumeInformation(PChar(FDrive+':\'),dLabel,12,@Serial,DirLen,Flags,nil,0); Result := IntToHex(Serial,8); Except Result :=''; end; end; Como desenhar um Bitmap num form var Form1: TForm1; Bmp: TBitmap; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Bmp:=TBitmap.Create; Bmp.Loadfromfile('c:\windows\nuvens.bmp'); end; procedure TForm1.TForm1.FormPaint(Sender: TObject); begin Canvas.Draw(50,50,Bmp); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Bmp.Free; end; Converte um arquivo JPEG em BMP function JpgToBmp(cImage: String): Boolean; // Requer a Jpeg declarada na clausua uses da unit var MyJPEG : TJPEGImage; MyBMP : TBitmap; begin Result := False; if fileExists(cImage+'.Jpeg') then begin MyJPEG := TJPEGImage.Create; with MyJPEG do begin try LoadFromFile(cImage+'.Jpeg'); MyBMP := TBitmap.Create; with MyBMP do begin Width := MyJPEG.Width; Height := MyJPEG.Height; Canvas.Draw(0,0,MyJPEG); SaveToFile(cImage+'.Bmp'); Free;
gondraf@hotmail.com
Result := True; end; finally Free; end; end; end; end; Carregar um cursor animado (*.ani) const cnCursorID1 = 1; begin Screen.Cursors[ cnCursorID1 ] := LoadCursorFromFile('c:\win95\cursors\cavalo.ani' ); Cursor := cnCursorID1; end; Como pegar a posio do mouse na tela Para obter os valores das coordenadas do mouse de qualquer parte da tela, basta que se utiliza a funo da API do Windows GetCursorPos. Esta funo interessante pois oferece ao programador os valores (x,y) de qualquer ponto da tela e no somente da aplicao. Para implementao, esta funo pode ser utilizada da seguinte maneira: procedure TForm1.Timer1Timer(Sender: TObject); var pt: TPoint; begin GetCursorPos(pt); // Pega a posio atual do mouse; //Mostra os valores das coordenadas do mouse label1.caption := IntToStr(pt.x) + ',' + IntToStr(pt.y); end; Como Alterar o Volume do Som do Computador Com o Delphi a funo usada para alterar o som a waveOutSetVolume( hwo, dwVolume) que fica na unit MMSystem. No fcil alterar o volume com o Delphi. No s colocar uma TrackBar e associar com o MCI. Para alterar o volume no computador voc envia uma integer tipo assim: 0x5555FFFF Os quatro dgitos F seriam o lado esquerdo do som o os quatro dgitos 5 seriam o lado direito, em diferentes computadores eles se invertem, mas este s um exemplo. os valores vo de 0000 at FFFF, assim: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F considere o A como um 10, o B como 11, o C como 12 e assim em diante at o F que seria 15, o volume mximo ou seja se voc colocar 0xFFFFFFFF iria ficar os dois lados no volume mximo e se colocasse 0x00000000 iria ficar tudo mudo. Ento aqui vai um exemplo: Insira dois Edits e um Button na seo uses coloque MMSystem. faa o boto assim: procedure TForm1.Button1Click(Sender: TObject);
gondraf@hotmail.com
var s: string; begin s := '0x' + Edit1.Text + Edit2.Text; MMSystem.waveOutSetVolume(0, StrToInt(s)); end; Gravando Sons do Microfone Com o Delphi Primeiro voc deve ter uma placa de som e microfone, ambos devidamente instalados no seu PC. Se no tiver um mic, vai l na SantaIfignia que voc encontra um bom com 5 reais. Agora coloque um componente TMediaPlayer que se encontra na pasta System, depois coloque trs botes e um edit no Form. Abra o Gravador de som do Windows e sem gravar nada salve o arquivo vazio como C:\SOM.WAV, normalmente este arquivo temporrio at salvar o arquivo pricipal. (somente arquivos WAV so salvos, alias, se algum souber qual funo de uma das DLL do Windows Media Player 8.0 que converte WAV para MP3, ME MANDA UM EMAIL!!!) Agora coloque os seguintes comandos: Na propriedade Text do Edit1 coloque o arquivo wave que voc salvou - C:\SOM.WAV procedure TForm1.Button1Click(Sender: TObject); begin MediaPlayer1.Open; end; procedure TForm1.Button2Click(Sender: TObject); begin MediaPlayer1.Save; end; procedure TForm1.Button3Click(Sender: TObject); begin MediaPlayer1.FileName := Edit1.Text; end; Agora compile o programa e abra-o, clique no Button3 para associar o arquivo que voc criou ao MCI, feche todos os aplicativos de mida que estiverem abertos (eles impedem de que abra o MCI) e clique no Button1 para abrir o dispositivo MCI, se algo estiver errado ele no vai abrir, depois de abrir, 4 botes vo ser liberados no TMediaPlayer1, com o microfone ligado clique na bola vermelha para comear gravar, para pausar a gravao clique no segundo boto o amarelo, e para ouvir o som gravado clique no primeiro boto verde o Play, agora para salvar o arquivo clique no Button2, v ver o arquivo C:\SOM.WAV, antes ele estava vazio agora est com sua gravao.
Como converter decimal para romanos function DecToRoman( Decimal: LongInt ): String; {Converte um numero decimal em algarismos romanos} const Romans: Array[1..13] of String = ( 'I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M' ); Arabics: Array[1..13] of Integer =( 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000); var i: Integer; scratch: String;
gondraf@hotmail.com
begin scratch := ''; for i := 13 downto 1 do while ( Decimal >= Arabics[i] ) do begin Decimal := Decimal - Arabics[i]; scratch := scratch + Romans[i]; end; Result := scratch; end; Alinhar Texto do Edit Direita //ALINHAR TEXTO DO EDIT DIREITA procedure TForm1.Edit1Exit(Sender: TObject); var n: Integer; c: TCanvas; h: HWND; // pode se usar Form1.Canvas se for a mesma fonte do Edit begin c := TCanvas.Create; c.Handle := GetDeviceContext(h); c.Font := Edit1.Font; n := round((Edit1.Width - c.TextWidth(Edit1.Text) - 8) / c.TextWidth(\ ' \')); Edit1.Text := stringofchar(\ ' \', n) + Edit1.Text; end; procedure TForm1.Edit1Enter(Sender: TObject); begin Edit1.Text := Trim(Edit1.Text); end; Como Limpar Todos os Edit's de um Form de uma s vez? Procedure LimpaEdit; var i : Integer; begin for i := 0 to ComponentCount -1 do if Components[i] is TEdit then begin TEdit(Components[i]).Text := ''; end; end; procedure LimpaEdit (Form: TForm); var i : Integer; begin for i := 0 to Form.ComponentCount - 1 do if Form.Components[i] is TCustomEdit then (Form.Components[i] as TCustomEdit).Clear; end; Baixando arquivos da internet Esta dica serve para quem deseja criar um sistema que atualize seus softwares via internet, e tambm para quem faz jogos online, ou seja, jogos que exigem a conexo com a internet para
gondraf@hotmail.com
serem jogados, pode precisar de um meio rpido, fcil e desburocratizado para baixar arquivos de um site ou de um lugar qualquer da rede. Veja s como simples e sem contra indicaes fazer isso: function DownloadFile(Source, Dest: string): Boolean; begin try Result:= UrlDownloadToFile(nil, PChar(source),PChar(Dest), 0, nil) = 0; except Result:= False; end; end; Para usar esta function preciso declarar Urlmon na seo uses da unit. Depois basta fazer uma chamada padro: if DownloadFile ('http://www.onde.com/arq.htm','c:\arq.htm') then ShowMessage('Download Concludo.'); Chamar um e-mail pelo Delphi Uses Shellapi procedure TForm1.Button1Click(Sender: TObject); var Mail : String; begin Mail := 'mailto:lloydsoft@ieg.com.br'; ShellExecute(GetDesktopWindow,'open',pchar(Mail),nil,nil,sw_ShowNormal); end;
gondraf@hotmail.com
Principais Procedimentos e Funes Pr definidas procedure Beep; Toca um beep procedure ChDir(S: string); Troca o diretrio corrente para o diretrio especificado em S. begin {$I-} { Change to directory specified in Edit1 } ChDir(Edit1.Text); if IOResult <> 0 then MessageDlg('Cannot find directory', mtWarning, [mbOk], 0); end; function Chr(X: Byte): Char; Retorna o caracter com o cdigo ASCII X begin Canvas.TextOut(10, 10, Chr(65)); { The letter 'A'} end; function Concat(s1 [, s2,..., sn]: string): string; Concatena as strings var S: string; begin S := Concat('ABC', 'DEF'); { 'ABCDE' } end; function Copy(S: string; Index, Count: Integer): string; Retorna uma substring de S, comeando a partir de Index e tendo Count caracters The Copy function returns a substring of a string. var S: string; begin S := 'ABCDEF'; S := Copy(S, 2, 3);	{ 'BCD' } end; function CreateDir(const Dir: string): Boolean; Cria um novo diretrio e retorna o sucesso da operao function Date: TDateTime; Retorna a Data atual procedure TForm1.Button1Click(Sender: TObject); begin Label1.Caption := 'Today is ' + DateToStr(Date); end; function DateToStr(Date: TDateTime): string; Converte Data para String procedure TForm1.Button1Click(Sender: TObject); begin Label1.Caption := DateToStr(Date); end; function DayOfWeek(Date: TDateTime): Integer; Retorna o dia da semana especificado entre 1 e 7, onde domigo um e Sbado 7 procedure TForm1.Button1Click(Sender: TObject);
gondraf@hotmail.com
var ADate: TDateTime; begin ADate := StrToDate(Edit1.Text); Label1.Caption := 'Day ' + IntToStr(DayOfWeek(ADate)) + ' of the week'; end; procedure DecodeDate(Date: TDateTime; var Year, Month, Day: Word); Quebra os valores especificados no parmetro Date em Year, Month e Day. procedure TForm1.Button1Click(Sender: TObject); var Present: TDateTime; Year, Month, Day, Hour, Min, Sec, MSec: Word; begin Present:= Now; DecodeDate(Present, Year, Month, Day); Label1.Caption := 'Today is Day ' + IntToStr(Day) + ' of Month ' + IntToStr(Month) + ' of Year ' + IntToStr(Year); DecodeTime(Present, Hour, Min, Sec, MSec); Label2.Caption := 'The time is Minute ' + IntToStr(Min) + ' of Hour ' + IntToStr(Hour); end; procedure DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word); Quebra os valores especificados em Time nos par6ametros Hour, Min, Sec e MSec. procedure TForm1.Button1Click(Sender: TObject); var Present: TDateTime; Year, Month, Day, Hour, Min, Sec, MSec: Word; begin Present:= Now; DecodeDate(Present, Year, Month, Day); Label1.Caption := 'Today is Day ' + IntToStr(Day) + ' of Month ' + IntToStr(Month) + ' of Year ' + IntToStr(Year); DecodeTime(Present, Hour, Min, Sec, MSec); Label2.Caption := 'The time is Minute ' + IntToStr(Min) + ' of Hour ' + IntToStr(Hour); end; procedure Delete(var S: string; Index, Count:Integer); Remove a substring de Count caracters da string S partir da posio Index var s: string; begin s := 'Honest Abe Lincoln'; Delete(s,8,4); Canvas.TextOut(10, 10, s);	{ 'Honest Lincoln' } end; function DeleteFile(const FileName: string): Boolean; Apaga o arquivo FileName do disco. Se o arquivo no puder ser apagado a funo retorna False. DeleteFile('DELETE.ME'); function DirectoryExists(Name: string): Boolean; Verifica se Name diretorio existe function DiskFree(Drive: Byte): Integer; Retorna o nmero de bytes livre no driver especificado em Drive.
gondraf@hotmail.com
Onde : 0 = Corrente, 1 = A, 2 = B,... DiskFree retorna 1 se o driver for invlido var S: string; begin S := IntToStr(DiskFree(0) div 1024) + ' Kbytes free.'; Canvas.TextOut(10, 10, S); end; function DiskSize(Drive: Byte): Integer; Retorna o tamanho em bytes do driver especificado. Onde : 0 = Corrente, 1 = A, 2 = B,... DiskFree retorna 1 se o driver for invlido var S: string; begin S := IntToStr(DiskSize(0) div 1024) + ' Kbytes capacity.'; Canvas.TextOut(10, 10, S); end; function EncodeDate(Year, Month, Day: Word): TDateTime; Retorna uma Data formada por Year, Month e Day procedure TForm1.Button1Click(Sender: TObject); var MyDate: TDateTime; begin MyDate := EncodeDate(83, 12, 31); Label1.Caption := DateToStr(MyDate); end; function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime; Retorna a Hora formada por Hour, Min, Sec e MSec procedure TForm1.Button1Click(Sender: TObject); var MyTime: TDateTime; begin MyTime := EncodeTime(0, 45, 45, 7); Label1.Caption := TimeToStr(MyTime); end; function ExtractFileDir(const FileName: string): string; Retorna o diretrio adequado para ser passado para as funes CreateDir, GetCurrentDir, RemoveDir e SetCurrentDir. O resultado da funo uma string vazia se FileName no contiver um drive e um caminho. function ExtractFileDrive(const FileName: string): string; Retorna uma string contendo o drive do path de um arquivo. function ExtractFileExt(const FileName: string): string; Retorna a extenso do arquivo FileName function ExtractFileName(const FileName: string): string; Retorna o nome do arquivo Form1.Caption := 'Editing '+ ExtractFileName(FileName); function ExtractFilePath(const FileName: string): string; Retorna o Path de um arquivo ChDir(ExtractFilePath(FileName));
gondraf@hotmail.com
function FileAge(const FileName: string): Integer; Retorna a data e a hora de um arquivo num valor que pode ser convertido para TDateTime atravs da funo FileDateToDateTime. Retorna 1 se o arquivo no existir function FileExists(const FileName: string): Boolean; Retorna verdade se o arquivo existir if FileExists(FileName) then if MsgBox('Do you really want to delete ' + ExtractFileName(FileName) + '?'), []) = IDYes then DeleteFile(FileName); function FileSize(var F): Integer; Retorna o tamanho de um arquivo, para usar FileSize o arquivo deve esta aberto. Se o arquivo estiver vazio FileSize(F) retorna 0. F uma variavel do tipo arquivo. FileSize no pode ser usada com arquivo texto var f: file of Byte; size : Longint; S: string; y: integer; begin if Opendialog1.Execute then begin AssignFile(f, Opendialog1.FileName); Reset(f); size := FileSize(f); S := 'File size in bytes: ' + IntToStr(size); y := 10; Canvas.TextOut(5, y, S); y := y + Canvas.TextHeight(S) + 5; S := 'Seeking halfway into file...'; Canvas.TextOut(5, y, S); y := y + Canvas.TextHeight(S) + 5; Seek(f,size div 2); S := 'Position is now ' + IntToStr(FilePos(f)); Canvas.TextOut(5, y, S); CloseFile(f); end; end; procedure FillChar(var X; Count: Integer; value: Byte); Preenche um vetor com determinado caracter. Value pode ser um byte ou char var S: array[0..79] of char; begin { Set to all spaces } FillChar(S, SizeOf(S), ' '); end; function FloatToStr(Value: Extended): string; Converte um valor em ponto flutuante (real) para uma string procedure ForceDirectories(Dir: string); Cria multiplos diretrios de uma s vez procedure TForm1.Button1Click(Sender: TObject); var Dir: string; begin Dir := 'C:\APPS\SALES\LOCAL'; ForceDirectories(Dir); if DirectoryExists(Dir) then
gondraf@hotmail.com
Label1.Caption := Dir + ' was created' end; function FormatDateTime(const Format: string; DateTime: TDateTime): string; Formata o valor DateTime usando o formato de Format. Os especificadores de formato abaixo so vlidos Specifier	Displays c	Displays the date using the format given by the ShortDateFormat global variable, followed by the time using the format given by the LongTimeFormat global variable. The time is not displayed if the fractional part of the DateTime value is zero. d	Displays the day as a number without a leading zero (1-31). dd	Displays the day as a number with a leading zero (01-31). ddd	Displays the day as an abbreviation (Sun-Sat) using the strings given by the ShortDayNames global variable. dddd	Displays the day as a full name (Sunday-Saturday) using the strings given by the LongDayNames global variable. ddddd	Displays the date using the format given by the ShortDateFormat global variable. dddddd	Displays the date using the format given by the LongDateFormat global variable. m	Displays the month as a number without a leading zero (1-12). If the m specifier immediately follows an h or hh specifier, the minute rather than the month is displayed. mm	Displays the month as a number with a leading zero (01-12). If the mm specifier immediately follows an h or hh specifier, the minute rather than the month is displayed. mmm	Displays the month as an abbreviation (Jan-Dec) using the strings given by the ShortMonthNames global variable. mmmm	Displays the month as a full name (January-December) using the strings given by the LongMonthNames global variable. yy	Displays the year as a two-digit number (00-99). yyyy	Displays the year as a four-digit number (0000-9999). h	Displays the hour without a leading zero (0-23). hh	Displays the hour with a leading zero (00-23). n	Displays the minute without a leading zero (0-59). nn	Displays the minute with a leading zero (00-59). s	Displays the second without a leading zero (0-59). ss	Displays the second with a leading zero (00-59). t	Displays the time using the format given by the ShortTimeFormat global variable. tt	Displays the time using the format given by the LongTimeFormat global variable. am/pm	Uses the 12-hour clock for the preceding h or hh specifier, and displays 'am' for any hour before noon, and 'pm' for any hour after noon. The am/pm specifier can use lower, upper, or mixed case, and the result is displayed accordingly. a/p	Uses the 12-hour clock for the preceding h or hh specifier, and displays 'a' for any hour before noon, and 'p' for any hour after noon. The a/p specifier can use lower, upper, or mixed case, and the result is displayed accordingly. ampm	Uses the 12-hour clock for the preceding h or hh specifier, and displays the contents of the TimeAMString global variable for any hour before noon, and the contents of the TimePMString global variable for any hour after noon. /	Displays the date separator character given by the DateSeparator global variable. :	Displays the time separator character given by the TimeSeparator global variable. 'xx'/"xx"	Characters enclosed in single or double quotes are displayed as-is, and do not affect formatting. Format specifiers may be written in upper case as well as in lower case letters--both produce the same result. If the string given by the Format parameter is empty, the date and time value is formatted as if a 'c' format specifier had been given. S := FormatDateTime('"The meeting is on" dddd, mmmm d, yyyy, ' + '"at" hh:mm AM/PM', StrToDateTime('2/15/95 10:30am')); function FormatFloat(const Format: string; Value: Extended): string; Transforma um Float numa string usando a formatao contida em Format. Os especificadores de formato abaixo so vlidos
gondraf@hotmail.com
Specifier	Represents 0	Digit place holder. If the value being formatted has a digit in the position where the '0' appears in the format string, then that digit is copied to the output string. Otherwise, a '0' is stored in that position in the output string. #	Digit placeholder. If the value being formatted has a digit in the position where the '#' appears in the format string, then that digit is copied to the output string. Otherwise, nothing is stored in that position in the output string. .	Decimal point. The first '.' character in the format string determines the location of the decimal separator in the formatted value; any additional '.' characters are ignored. The actual character used as a the decimal separator in the output string is determined by the DecimalSeparator global variable. The default value of DecimalSeparator is specified in the Number Format of the International section in the Windows Control Panel. ,	Thousand separator. If the format string contains one or more ',' characters, the output will have thousand separators inserted between each group of three digits to the left of the decimal point. The placement and number of ',' characters in the format string does not affect the output, except to indicate that thousand separators are wanted. The actual character used as a the thousand separator in the output is determined by the ThousandSeparator global variable. The default value of ThousandSeparator is specified in the Number Format of the International section in the Windows Control Panel. E+	Scientific notation. If any of the strings 'E+', 'E-', 'e+', or 'e-' are contained in the format string, the number is formatted using scientific notation. A group of up to four '0' characters can immediately follow the 'E+', 'E-', 'e+', or 'e-' to determine the minimum number of digits in the exponent. The 'E+' and 'e+' formats cause a plus sign to be output for positive exponents and a minus sign to be output for negative exponents. The 'E-' and 'e-' formats output a sign character only for negative exponents. 'xx'/"xx"	Characters enclosed in single or double quotes are output as-is, and do not affect formatting. ;	Separates sections for positive, negative, and zero numbers in the format string. The locations of the leftmost '0' before the decimal point in the format string and the rightmost '0' after the decimal point in the format string determine the range of digits that are always present in the output string. The number being formatted is always rounded to as many decimal places as there are digit placeholders ('0' or '#') to the right of the decimal point. If the format string contains no decimal point, the value being formatted is rounded to the nearest whole number. If the number being formatted has more digits to the left of the decimal separator than there are digit placeholders to the left of the '.' character in the format string, the extra digits are output before the first digit placeholder. To allow different formats for positive, negative, and zero values, the format string can contain between one and three sections separated by semicolons. One section: The format string applies to all values. 	Two sections: The first section applies to positive values and zeros, and the second section applies to negative values. 	Three sections: The first section applies to positive values, the second applies to negative values, and the third applies to zeros. If the section for negative values or the section for zero values is empty, that is if there is nothing between the semicolons that delimit the section, the section for positive values is used instead. If the section for positive values is empty, or if the entire format string is empty, the value is formatted using general floating-point formatting with 15 significant digits, corresponding to a call to FloatToStrF with the ffGeneral format. General floating-point formatting is also used if the value has more than 18 digits to the left of the decimal point and the format string does not specify scientific notation. 0			1234		-1234		1		0 0.00 			1234.00		-1234.00		0.50		0.00 #.## 			1234		-1234		.5	 #,##0.00			1,234.00		-1,234.00	0.50		0.00 #,##0.00;(#,##0.00)	1,234.00		(1,234.00)	0.50		0.00 #,##0.00;;Zero 		1,234.00		-1,234.00	0.50		Zero 0.000E+00 		1.234E+03	-1.234E+03	5.000E-01	0.000E+00 #.###E-0 		1.234E3		-1.234E3	5E-1		0E0
gondraf@hotmail.com
function Frac(X: Real): Real; Retorna a parte fracional do parmetro X var R: Real; begin R := Frac(123.456); { 0.456 } R := Frac(-123.456); { -0.456 } end; function GetCurrentDir: string; Retorna uma string contendo o diretrio corrente procedure GetDir(D: Byte; var S: string); Rerorna o diretrio corrente do driver especificado. O onde D pode ser : Value	Drive 0	Corrente 1	A 2	B 3	C var s : string; begin GetDir(0,s); { 0 = Current drive } MessageDlg('Current drive and directory: ' + s, mtInformation, [mbOk] , 0); end; procedure Inc(var X [ ; N: Longint ] ); Incrementa de uma ou N unidades o parmetro X var IntVar: Integer; LongintVar: Longint; begin Inc(IntVar);		{ IntVar := IntVar + 1 } Inc(LongintVar, 5);	{ LongintVar := LongintVar + 5 } end; function IncMonth(const Date: TDateTime; NumberOfMonths: Integer): TDateTime; Retorna Date acrescido ou decrescido de NumberOfMonths meses. function InputBox(const ACaption, APrompt, ADefault: string): string; Exibe uma Caixa de Entrada onde o usurio pode digitar uma string. ACaption representa o ttulo do Input Box e APrompt o ttulo do edit e ADefault representa o valor inicial do Edit. uses Dialogs; procedure TForm1.Button1Click(Sender: TObject); var InputString: string; begin InputString:= InputBox('Input Box', 'Prompt', 'Default string'); end; function InputQuery(const ACaption, APrompt: string; var Value: string): Boolean; Semelhante ao InputBox, sendo que retorna True se o usurio fechou a O InputBox com OK e False se fechou com Cancel ou ESC. E Value armazena a string digitada. procedure TForm1.Button1Click(Sender: TObject); var NewString: string;
gondraf@hotmail.com
ClickedOK: Boolean; begin NewString := 'Default String'; Label1.Caption := NewString; ClickedOK := InputQuery('Input Box', 'Prompt', NewString); if ClickedOK then { NewString contains new input string } Label1.Caption := 'The new string is ''' + NewString + ''''; end; procedure Insert(Source: string; var S: string; Index: Integer); Insere uma string em outra a partir da posio Index var S: string; begin S := 'Honest Lincoln'; Insert('Abe ', S, 8); { 'Honest Abe Lincoln' } end; function IntToHex(Value: Integer; Digits: Integer): string; Converte o inteiro Value num Hexadecimal (Base 16). Digits indica o nmero mnimo de dgitos Hexa a serem retornados procedure TForm1.Button1Click(Sender: TObject); begin Edit2.Text := IntToHex(StrToInt(Edit1.Text), 6); end; function IntToStr(Value: Integer): string; Trasnforma um Inteiro numa String procedure TForm1.Button1Click(Sender: TObject); var Value: Integer; begin Value := 1234; Edit1.Text := IntToStr(Value); end; function IsValidIdent(const Ident: string): Boolean; Indica se um identificador vlido para o Pascal function Length(S: string): Integer; retorna o nmero de caracters usados na string S var S: string; begin S := 'The Black Knight'; Canvas.TextOut(10, 10, 'String Length = ' + IntToStr(Length(S))); end; function MaxIntValue(const Data: array of Integer): Integer; Retorna o maior inteiro de um vetor function MaxValue(const Data: array of Double): Double; Retorna o maior valor de um vetor function Mean(const Data: array of Double): Extended; Retorna a mdia aritmtica de um vetor function MessageDlg(const Msg: string; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: Longint): Word;
gondraf@hotmail.com
Exibe uma Caixa de Mensagem e obtem uma resposta do usurio. Onde Msg : Mensagem AType : Tipo da caixa de mensagem Value	Meaning mtWarning	A message box containing a yellow exclamation point symbol. mtError		A message box containing a red stop sign. mtInformation	A message box containing a blue "i". mtConfirmation	A message box containing a green question mark. mtCustom	A message box with no bitmap. The caption of the message box is the name of the application's executable file. AButtons : Quais botes aparecero na caixa de mensagem Value				Meaning mbYes			A button with the text 'Yes' on its face mbNo			A button with the text 'No' on its face mbOK			A button with the text 'OK' on its face mbCancel		A button with the text 'Cancel' on its face mbHelp			A button with the text 'Help' on its face mbAbort		A button with the text 'Abort' on its face mbRetry			A button with the text 'Retry' on its face mbIgnore		A button with the text 'Ignore' on its face mbAll			A button with the text 'All' on its face mbYesNoCancel		Puts Yes, No, and Cancel buttons in the message box mbOkCancel		Puts t OK and Cancel buttons in the message box mbAbortRetryIgnore	Puts Abort, Retry, and Ignore buttons in the message box MessageDlg returns the value of the button the user selected. These are the possible return values: Return 	values mrNone		mrAbort		mrYes mrOk		mrRetry		mrNo mrCancel	mrIgnore	mrAll procedure TForm1.Button1Click(Sender: TObject); begin if MessageDlg('Welcome to my Object Pascal application. Exit now?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin MessageDlg('Exiting the Object Pascal application.', mtInformation, [mbOk], 0); Close; end; end; function MessageDlgPos(const Msg: string; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer): Word; Semelhante a MessageDlg exceto por permitir indicar a posio na qual a janela ser exibida procedure TForm1.Button1Click(Sender: TObject); begin MessageDlgPos('Are you there?',mtConfirmation, mbYesNoCancel, 0, 200, 200); end; function MinIntValue(const Data: array of Integer): Integer; Retorna o menor inteiro do vetor function MinValue(const Data: array of Double): Double; Retorna o menor valor de um vetor procedure MkDir(S: string); Cria um novo diretrio uses Dialogs; begin
gondraf@hotmail.com
{$I-} { Get directory name from TEdit control } MkDir(Edit1.Text); if IOResult <> 0 then MessageDlg('Cannot create directory', mtWarning, [mbOk], 0) else MessageDlg('New directory created', mtInformation, [mbOk], 0); end; function Now: TDateTime; Retorna a data e a hora corrente procedure TForm1.Button1Click(Sender: TObject); begin Label1.Caption := 'The date and time is ' + Str(Now); end; function Ord(X): Longint; Retorna a ordem de um valor ordinal uses Dialogs; type Colors = (RED,BLUE,GREEN); var S: string; begin S := 'BLUE has an ordinal value of ' + IntToStr(Ord(BLUE)) + #13#10; S := 'The ASCII code for "c" is ' + IntToStr(Ord('c')) + ' decimal'; MessageDlg(S, mtInformation, [mbOk], 0); end; function Pi: Extended; Retorna o valor de PI 3.1415926535897932385. function Pos(Substr: string; S: string): Integer; Procura por uma sub-string numa string e retorna a posio da primeira ocorrncia ou zero se no encontrou var S: string; begin S := ' 123.5'; { Convert spaces to zeroes } while Pos(' ', S) > 0 do S[Pos(' ', S)] := '0'; end; function Power(Base, Exponent: Extended): Extended; Potncia function Pred(X); Retorna o predecessor de um ordinal uses Dialogs; type Colors = (RED,BLUE,GREEN); var S: string; begin S := 'The predecessor of 5 is ' + IntToStr(Pred(5)) + #13#10; S := S + 'The successor of 10 is ' + IntToStr(Succ(10)) + #13#10; if Succ(RED) = BLUE then S := S + 'In the type Colors, RED is the predecessor of BLUE.';
gondraf@hotmail.com
MessageDlg(S, mtInformation, [mbOk], 0); end; function Random [ ( Range: Integer) ]; Retorna um valor Randmico 0 <= X < Range. var I: Integer; begin Randomize; for I := 1 to 50 do begin { Write to window at random locations } Canvas.TextOut(Random(Width), Random(Height), 'Boo!'); end; end; procedure Randomize; Inicializa o modo Randomico var I: Integer; begin Randomize; for I := 1 to 50 do begin { Write to window at random locations } Canvas.TextOut(Random(Width), Random(Height), 'Boo!'); end; end; function RemoveDir(const Dir: string): Boolean; Remove um diretrio retornando True caso tenha conseguido e False caso contrrio procedure Rename(var F; Newname); F is a variable of any file type. Newname is a string-type expression or an expression of type PChar uses Dialogs; var f : file; begin Opendialog1.Title := 'Choose a file... '; if Opendialog1.Execute then begin SaveDialog1.Title := 'Rename to...'; if SaveDialog1.Execute then begin AssignFile(f, Opendialog1.FileName); Canvas.TextOut(5, 10, 'Renaming ' + Opendialog1.FileName + ' to ' + SaveDialog1.FileName); Rename(f, SaveDialog1.FileName); end; end; end; function RenameFile(const OldName, NewName: string): Boolean; Renomeia arquivos e retorna o sucesso ou insucesso The following code renames a file: if not RenameFile('OLDNAME.TXT','NEWNAME.TXT') then ErrorMsg('Error renaming file!'); procedure RmDir(S: string); Remove um diretrio uses Dialogs;
gondraf@hotmail.com
begin {$I-} { Get directory name from TEdit control } RmDir(Edit1.Text); if IOResult <> 0 then MessageDlg('Cannot remove directory', mtWarning, [mbOk], 0) else MessageDlg('Directory removed', mtInformation, [mbOk], 0); end; function Round(X: Extended): Longint; Arredonda um nmero real function SelectDirectory(var Directory: string; Options: TSelectDirOpts; HelpCtx: Longint):Boolean; Exibe um Caixa de Dialogo para seleo de Diretrio. O Diretrio passado para a funo aparece como diretrio corrente e o diretrio escolhido retonado no mesmo Diretrio (Directory). O valor do diretrio corrente no alterado These are the possible values that can be added to the Options set: Value		Meaning sdAllowCreate	An edit box appears to allow the user to type in the name of a directory that does not exist. This option does not create a directory, but the application can access the Directory parameter to create the directory selected if desired. sdPerformCreate	Used only when Options contains sdAllowCreate. If the user enters a directory name that does not exist, SelectDirectory creates it. sdPrompt	Used when Options contains sdAllowCreate. Displays a message box that informs the user when the entered directory does not exist and asks if the directory should be created. If the user chooses OK, the directory is created if Options contains sdPerformCreate. If Options does not contain sdPerformCreate, the directory is not created: the application should create it when SelectDirectory returns. The function returns True if the user selected a directory and chose OK, and False if the user chose Cancel or closed the dialog box without selecting a directory. This example uses a button on a form. When the user clicks the button, a Select Directory dialog box appears. The current directory displayed in the dialog box is C:\MYDIR. The user can select a directory from the directory list, or enter a new directory in the edit box. If the user enters a new directory, a message box asks the user if the directory should be created. If the user chooses Yes, the directory is created. If the user chooses No, the message box goes away without creatubg the directory. The name of the directory the user selects appears as the caption of the label: uses FileCtrl; procedure TForm1.Button1Click(Sender: TObject); var Dir: string; begin Dir := 'C:\MYDIR'; if SelectDirectory(Dir, [sdAllowCreate, sdPerformCreate, sdPrompt]) then Label1.Caption := Dir; end; function SetCurrentDir(const Dir: string): Boolean; Torna o Dir o diretrio corrente e retorna o sucesso da operao procedure SetLength(var S: string; NewLength: Integer); Coloca um novo tamanho para uma string S[0] := NewLength. procedure ShowMessage(const Msg: string); Exibe uma mensagem ao usurio procedure TForm1.Button1Click(Sender: TObject); begin
gondraf@hotmail.com
ShowMessage('Push this button'); end; function Sqr(X: Extended): Extended; Retorna o quadrado de X function Sqrt(X: Extended): Extended; Retorna a raiz quadrada de X function StrComp(Str1, Str2 : PChar): Integer; Compara duas strings em case sensitivity Return value	Condition <0	if Str1< Str2 =0	if Str1= Str2 >0	if Str1 > Str2 function StringOfChar(Ch: Char; Count: Integer): string; Retorna uma string contendo Count caracters Ch S := StringOfChar('A', 10); {sets S to the string 'AAAAAAAAAA'} function StrToDate(const S: string): TDateTime; Converte uma string em data procedure TForm1.Button1Click(Sender: TObject); var ADate: TDateTime; begin ADate := StrToDate(Edit1.Text); Label1.Caption := DateToStr(ADate); end; function StrToDateTime(const S: string): TDateTime; Converte uma string para o formato DateTime procedure TForm1.Button1Click(Sender: TObject); var ADateAndTime: TDateTime; begin ADateAndTime := StrToDateTime(Edit1.Text); Label1.Caption := DateTimeToStr(ADateAndTime); end; function StrToFloat(const S: string): Extended; Converte uma string num Float function StrToInt(const S: string): Integer; Converte uma string num inteiro procedure TForm1.Button1Click(Sender: TObject); var S: string; I: Integer; begin S := '22467'; I := StrToInt(S); Inc(I); Edit1.Text := IntToStr(I); end; function StrToTime(const S: string): TDateTime; Converte uma string em hora
gondraf@hotmail.com
procedure TForm1.Button1Click(Sender: TObject); var ATime: TDateTime; begin ATime := StrToTime(Edit1.Text); Label1.Caption := TimeToStr(ATime); end; function Succ(X); Retorna o sucessor de um ordinal uses Dialogs; type Colors = (RED,BLUE,GREEN); var S: string; begin S := 'The predecessor of 5 is ' + IntToStr(Pred(5)) + #13#10; S := S + 'The successor of 10 is ' + IntToStr(Succ(10)) + #13#10; if Succ(RED) = BLUE then S := S + 'In the type Colors, RED is the predecessor of BLUE.'; MessageDlg(S, mtInformation, [mbOk], 0); end; function Sum(const Data: array of Double): Extended register; Calcula a soma de dos elementos de um vetor function SumInt(const Data: array of Integer): Integer register; Calcula a soma dos elementos de um vetor de inteiros function Time: TDateTime; Retorna a hora corrente procedure TForm1.Button1Click(Sender: TObject); begin Label1.Caption := 'The time is ' + TimeToStr(Time); end; function TimeToStr(Time: TDateTime): string; Converte hora para string procedure TForm1.Button1Click(Sender: TObject); begin Label1.Caption := TimeToStr(Time); end; function Trim(const S: string): string; Retira os espaos em brancos a esquerda e a direita da string S function TrimLeft(const S: string): string; Retira os espaos em brancos a esquerda da string S function TrimRight(const S: string): string; Retira os espaos em brancos a direita da string S function Trunc(X: Extended): Longint; Retorna a parte inteira de um nmero function UpCase(Ch: Char): Char; Converte o caracter Ch em maiscula uses Dialogs; var
gondraf@hotmail.com
s : string; i : Integer; begin { Get string from TEdit control } s := Edit1.Text; for i := 1 to Length(s) do s[i] := UpCase(s[i]); MessageDlg('Here it is in all uppercase: ' + s, mtInformation, [mbOk], 0); end; function UpperCase(const S: string): string; Converte a string S em maisculas procedure TForm1.Button1Click(Sender: TObject); var I: Integer; begin for I := 0 to ListBox1.Items.Count -1 do ListBox1.Items[I] := UpperCase(ListBox1.Items[I]); end; Consulte outras dicas no CD ou pesquise na internet.
gondraf@hotmail.com
NDICE
Assunto Capitulo I Definies Sistema Operacional Linguagem Linguagem estruturada Linguagem orientada a objeto Constantes Variveis Operadores Dados Banco de Dados Rotina Procedimento Comandos Estruturas Capitulo II Componentes bsicos da orientao a objetos Classe Objeto Instncia Propriedade Mtodo Mensagem Interface Evento Procedimento Tempo de Projeto Tempo de Execuo Capitulo III Apresentao do Delphi 2005 Tela de Abertura VCL Form Application for WIN 32 Object Inspector Caixa de estruturas (Structure) A Paleta de Componentes Gerente do projeto (Project Manager) O Formulrio A Unit Estrutura de uma Unit Capitulo IV Os primeiros contatos Prtica 01: O primeiro projeto Prtica 02: Alterando algumas propriedades do formulrio Prtica 03 - Exerccio 01 Capitulo V Estruturas Estrutura de bloco Prtica 04 Pratica 05 Exerccio 02 Estruturas de deciso Pratica 06: Acendendo uma lmpada Prtica 07 Pratica 08 Exerccio 03 Pratica 09: Controlando o trnsito Projeto 10: Promovendo descontos Pratica 11 Exerccio 04 Estruturas de loop ou lao Pratica 12: Demonstrao do Repeat ... Until Pratica 13 Exerccio 05 Estruturas consecutivas Pg. 1 1 1 1 1 1 1 2 3 3 4 4 4 4 5 5 5 5 5 5 6 6 6 6 6 6 6 6 7 8 8 8 9 10 10 11 12 12 13 13 14 14 15 16 17 18 19 20 21 22 24 24 25 26 27
gondraf@hotmail.com
Pratica 14: Demonstrao do With...do Estruturas de exceo Capitulo VI Bancos de dados O BDEAdministrator O MSSQL Server Capitulo VII O DataBase Desktop (DBD) Capitulo VIII Trabalhando com o DataBase Desktop Exerccio 06 Incrementando registros de uma tabela Navegando pelos registros de uma tabela Excluindo registros de uma tabela Organizando os registros de uma tabela Criando ndices secundrios Exerccio 07 Capitulo IX Incluindo tabelas em um formulrio O Data-Module Pratica 15: Incluindo uma senha Criando um alias paradox Criando o data module Capitulo X Incluindo menus em um formulrio Prtica 16 Montando um formulrio de controle Capitulo XI Trabalhando com mais de um formulrio Prtica 17 Anexando formulrios Capitulo XII Estruturando um projeto Capitulo XIII Incluindo, localizando e excluindo dados de uma tabela em tempo de execuo Prtica 18 Cadastro de clientes Exerccio 08 Crie um cadastro de produtos e um cadastro de fornecedores Capitulo XIV Respondendo a mensagens Prtica 19 Utilizando o comando messagedlg Prtica 20 Utilizando o comando messagedlg Prtica 21 Utilizando o comando messagedlgpos Exerccio 09 Capitulo XV Rotinas especiais (Procedures e Funes) Capitulo XVI Localizando dados em uma tabela Prtica 22 Localizando registros (mtodos GotoKey, GotoNearest, FindKey, FindNearest) Prtica 23 Localizando registros (mtodos Recn) Prtica 24 Localizando registros (mtodos Locate) Prtica 25 Localizando registros (mtodos Filter) Exerccio 10 Crie consultas para o seu projeto Capitulo XVII Relacionando tabelas Prtica 26 Relacionamento I Prtica 27 Relacionamento II Capitulo XVIII O SQL Criando uma query pelo DataBase Desktop Criando uma relao entre duas tabelas atravs do query de modo interativo Criando uma relao entre trs tabelas atravs do query de modo interativo Prtica 28 Criando o relacionamento entre as tabelas clientes, vendas, itens e materias em tempo de execuo Prtica 29 Selecionando todas as compras de um cliente Operadores WHERE Exemplos de consultas Capitulo XIX Trabalhando com mdias Prtica 30 Lendo mdias com uso de objetos Prtica 31 Tocando sons wave via funo Capitulo XX Trabalhando com dilogos
27 28 28 29 32 32 34 37 37 37 38 38 38 39 39 39 40 40 41 44 45 46 46 48 50 52 62 62 63 64 65 65 65 69 70 73 75 78 79 80 82 84 86 86 87 89 90 91 92 93 95 95 97 98
gondraf@hotmail.com
Prtica 32 Trabalhando com dilogos Capitulo XXI Trabalhando unidades, pastas e arquivos Prtica 33 Localizando e executando arquivos via objetos Prtica 34 Um gerenciador de arquivos Prtica 35 Outro gerenciador de arquivos Capitulo XXII Trabalhando com grficos Prtica 36 Criando grficos Prtica 37 Criando grficos com tabelas Capitulo XXIII Literatura complementar Literatura 01 Criando o arquivo de ajuda Literatura 02 O Rave Report Capitulo XXIV Dicas da internet
98 101 101 104 105 112 115 121 124 124 130 140