4941493 Dicas Para Delphi

download 4941493 Dicas Para Delphi

of 138

Transcript of 4941493 Dicas Para Delphi

Como?161- Change the StringGrid's CELL color ?160 159 158 157 156 155 154 153 152 151 150 149 148 147 146 145 144 143 142 141 140 139 138 137 136 135 134 133 132 131 130 129 128 127 126 125 124 123 122 121 120 119 118 117 116 115 114 113 112 111 A listbox in a cell of a stringgrid 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 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 us-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)

110 - Simular o pressionamento de uma tecla 109 - Ligar/desligar a tecla Caps Lock 108 - Verificar se uma determinada tecla est pressionada 107 - Verificar o estado de NumLock e CapsLock 106 - Configurar linhas de diferentes alturas em StringGrid 105 - Adicionar o evento OnClick do DBGrid 104 - Criar caixas de dilogo em tempo de execuo 103 - Converter a primeira letra de um Edit para maisculo 102 - Verificar se uma string contm uma hora vlida 101 - Verificar se uma string contm um valor numrico vlido 100 - Mostrar uma mensagem durante um processamento 99 - Mostrar um cursor de ampulheta durante um processamento 98 - Ler e escrever dados binrios no Registro do Windows 97 - Mudar a resoluo do vdeo via programao 96 - Ler e escrever dados no Registro do Windows 95 - Adicionar barra de rolagem horizontal no ListBox 94 - Simular um CharCase no DBGrid 93 - Verificar se uma string uma data vlida 92 - Fazer pesquisa incremental com DBGrid e Edit 91 - Adicionar zeros esquerda de um nmero 90 - Limpar um campo tipo data via programao 89 - Implementar um campo auto-incremental via programao 88 - Obter o endereo IP do Dial-Up 87 - Exibir a caixa de dilogo padro de solicitao de senha do banco de dados 86 - Obter a verso da biblioteca ComCtl32.DLL (usada na unit ComCtrls do Delphi) 85 - Implementar rotinas assembly em Pascal 84 - Exibir o dilogo About do Windows 83 - Obter a linha e coluna atual em um TMemo 82 - Exibir um arquivo de ajuda do Windows 81 - Obter o valor de uma varivel de ambiente 80 - Determinar se uma janela (form) est maximizada 79 - Determinar se o cursor do mouse est em determinado controle 78 - Determinar se o aplicativo est minimizado 77 - Fechar um aplicativo com uma mensagem de erro fatal 76 - Usar o evento OnGetText de um TField 75 - Maximizar um form de forma que cubra toda a tela, inclusive a barra de tarefas 74 - Verificar, via programao, se Local Share do BDE est TRUE 73 - Criar um EXE que seja executado apenas atravs de outro EXE criado por mim 72 - Resolver "Internal error near: IBCheck" do Interbase 5.1.1 Server no NT 71 - Inverter os botes do mouse 70 - Obter/definir o tempo mximo do duplo-click do mouse 69 - Obter os atributos de um arquivo/diretrio 68 - Obter o espao total e livre de um disco 67 - Obter o tipo de um drive (removvel, fixo, CD-ROM, unidade de rede, etc) 66 - Obter informaes de um volume/disco (label, serial, sistema de arquivos, etc) 65 - Alterar o nome de volume (Label) de um disco 64 - Saber quais as unidades de disco (drives) esto presentes 63 - "truncar" valores reais para apenas n casas decimais 62 - Excluir todos os registros de uma tabela (como DELETE ALL do Clipper) 61 - Saber se o sistema est usando 4 dgitos para o ano 60 - Imprimir caracteres acentuados diretamente para a impressora 59 - Imprimir texto justificado com formatao na impressora Epson LX-300 58 - Formatar um disquete atravs de um programa Delphi 57 - Alterar (e restaurar) o tamanho da pgina na impressora 56 - Reproduzir um arquivo de som WAV sem o TMediaPlayer

55 - Obter o nome do usurio e da empresa informado durante a instalao do Windows 54 - Mostrar uma barra de progresso enquanto copia arquivos 53 - Copiar arquivos usando o Shell do Windows 52 - Descobrir o cdigo ASCII de uma tecla 51 - Evitar que seu programa aparea na barra de tarefas 50 - Usar eventos de som do Windows 49 - Mudar a coluna ativa em um DBGrid via programao 48 - Fechar o Windows a partir do seu programa 47 - Carregar um cursor animado (.ani) 46 - Enviar um arquivo para a lixeira 45 - Obter o nmero do registro atual 44 - Trabalhar com Filter de forma mais prtica 43 - Reproduzir um arquivo WAV 42 - Executar um programa DOS e fech-lo em seguida 41 - Fechar um programa a partir de um programa Delphi 40 - Colocar Hint's de vrias linhas 39 - Reproduzir um vdeo AVI em um Form 38 - Separar (filtrar) caracteres de uma string 37 - Colocar zeros esquerda de nmeros 36 - Copiar arquivos usando curingas (*.*) 35 - Copiar arquivos 34 - Trabalhar com cores no formato string 33 - Verificar se determinado programa est em execuo (Word, Delphi, etc) 32 - Excluir arquivos usando curingas (*.*) 31 - Gerar uma tabela no Word atravs do Delphi 30 - Obter a quantidade de registros total e visvel de uma tabela 29 - Evitar que um programa seja executado mais de uma vez 28 - Executar um "COMMIT" no Delphi 27 - Posicionar Form's em relao ao Desktop do Windows 26 - Saber a resoluo de tela atual 25 - Verificar se uma unidade de disco (disk-drive) est preparada 24 - Salvar/restaurar o tamanho e posio de Form's 23 - Definir a quantidade de registros a ser impressa em uma pgina do QuickReport 22 - Onde encontrar tutoriais sobre construo de componentes em Delphi 21 - Para que servem OnGetEditMask, OnGetEditText e OnSetEditText do TStringGrid 20 - Mostrar um Form de LogOn antes do Form principal 19 - Limitar a regio de movimentao do mouse 18 - Descobrir o nome de classe de uma janela do Windows 17 - Ocultar/exibir a barra de tarefas do Windows 16 - Evitar a proteo de tela durante seu programa 15 - Fazer a barra de ttulo ficar intermitente (piscante) 14 - Posicionar o cursor do mouse em um controle 13 - Criar cores personalizadas (sistema RGB) 12 - Adicionar uma nova fonte no Windows 11 - Saber se a impressora atual possui determinada fonte 10 - Saber se determinada Font est instalada no Windows 9 - Acertar a data e hora do sistema atravs do programa 8 - ENTER em vez de TAB no formulrio, no DBGrid e no StringGrid 7 - Simular a vrgula atravs do ponto do teclado numrico 6 - Paralizar um programa durante n segundos 5 - Criar uma tabela (DB, DBF) atravs do seu programa 4 - Verificar se um diretrio existe 3 - Verificar se um arquivo existe 2 - Criar um Alias temporrio atravs do seu programa 1 - Criar um Alias atravs do seu programa

159 - 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; end; Pronto! Ir aparecer a imagem no Canvas. til para fazer animaes. Dica enviada por: Alisson Viana Jardim Revisada por: Daniel Pereira Guimares

158 - Verificar se a impressora est ligadaProblema: Fao impresso direta para a porta da impressora e gostaria testar se a impressora est pronta antes de enviar o relatrio. Isto possvel em Delphi? Soluo: Usando instrues Assembly podemos fazer isto. A funo abaixo retorna true se a porta informada est pronta. Os 1234possveis parmetros para esta funo so: para LPT1 para LPT2 para LPT3 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;

ObservaesProvavelmente esta funo no funcionar em Windows NT devido ao acesso em baixo nvel.

157 - Obter a letra do drive onde est o WindowsInclua na seo uses: Windows Problema: Como saber em qual unidade de disco (drive) o Windows est instalado? Soluo: Esta funo retorna a letra do drive onde est instalado o 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;

156 - 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 } 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; - Dica enviada por: Luiz Eduardo.

155 - Fazer pesquisa incremental apenas com DBGridProblema: Gostaria de fazer um formulrio de pesquisa que, ao digitar algo sobre o DBGrid, o registro correspondendo fosse localizado. Soluo: - Coloque no form: TTable, TDataSource, TDBGrid e TLabel. - Ajuste as propriedades do Table1: DatabaseName = TableName = 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]); { Mostra o texto procurado } Label1.Caption := FTexto; end; end;

ObservaesNo nosso exemplo estamos pesquisando atravs do campo "Nome". Para esta pesquisa precisamos de um ndice com este campo.

154 - Obter tipo de uma propriedadeInclua 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;

ObservaesVerdadeiramente no sei exatamente onde poderamos aplicar esta dica, mas divulguei-a porque achei interessante. Acredito que o Object Inspector use algo parecido.

153 - Consulta SQL que usa a data do sistemaProblema: Preciso fazer uma consulta com SQL que me retorne todos os registros em que o valor de um campo do tipo data seja igual ou anterior dada do sistema. Como fazer? Soluo: Query.Close; Query.SQL.Text := 'select * from Tabela where CampoData 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);

94 - Simular um CharCase no DBGridPara 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];

93 - Verificar se uma string uma data vlidaEscreva a funo abaixo: function tbStrIsDate(const S: string): boolean; begin try StrToDate(S); Result := true; 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.');

92 - Fazer pesquisa incremental com DBGrid e EditProblema: Gostaria de montar um formulrio de pesquisa com um DBGrid e um Edit de modo que, enquanto o usurio digita um nome do Edit, o registro vai sendo localizado no DBGrid. Como fazer? - Crie um ndice na tabela com campo a ser usado na pesquisa. Coloque no Form: Um Um Um Um DataSource Table DBGrid 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]);

ObservaesEste exemplo considera que o campo seja tipo string. Para outros tipos de campos pode ocorrer erro dependendo dos valores digitados no Edit1.

91 - Adicionar zeros esquerda de um nmeroExistem 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; { Exemplo de como us-la: } var S: string; Numero: integer; {...} begin {...} S := tbStrZero(Numero, 6); {...} end;

ObservaesSe o comprimento desejado (Casas) no for suficiente para conter o nmero, sero colocados asteriscos.

90 - Limpar um campo tipo data via programaoTable1.FieldByName('Data').Clear; { ou } Table1.FieldByName('Data').AsString := '';

ObservaesPodemos usar este recurso para limpar tambm campos numricos, string, etc.

89 - Implementar um campo auto-incremental via programaoInclua 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;

ObservaesA 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.

88 - Obter o endereo IP do Dial-UpInclua 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;

ObservaesSe 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.

87 - Exibir a caixa de dilogo padro de solicitao de senha do banco de dadosInclua 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'; pw.ShowModal; finally pw.Free; end; end;

ObservaesAs 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.

86 - 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;

ObservaesNormalmente, a verso 4.72 est presente quando o Internet Explorer 4 est instalado.

85 - 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 add eax, &Y end; { A chamada 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;

84 - Exibir o dilogo About do WindowsInclua 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);

83 - 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; - A segunda soluo foi apresentada por: Vanderley Pereira Rocha

82 - Exibir um arquivo de ajuda do WindowsInclua na seo uses: Windows { 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;

ObservaesPara 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.

81 - Obter o valor de uma varivel de ambienteInclua 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');

80 - Determinar se uma janela (form) est maximizadaInclua na seo uses: Windows if IsZoomed(Form1.Handle) then { Form1 est maximizado } else { Form2 NO est maximizado }

ObservaesVeja a pergunta n. 78.

79 - Determinar se o cursor do mouse est em determinado controleInclua na seo uses: Windows { Os exemplos abaixo verificam se o cursor do mouse est em Button1: } { Soluo 1: } var Pt: TPoint; Rct: TRect; 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;

ObservaesA 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.

78 - Determinar se o aplicativo est minimizadoInclua na seo uses: Windows if IsIconic(Application.Handle) then { Minimizado } else { No minimizado }

ObservaesPode-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.

77 - Fechar um aplicativo com uma mensagem de erro fatalInclua na seo uses: Windows procedure TForm1.Button1Click(Sender: TObject); begin FatalAppExit(0, 'Erro fatal na aplicao.'); end;

ObservaesA 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.

76 - Usar o evento OnGetText de um TField{ Problema: Tenho um sistema de contas a receber, onde um campo chamado "Tipo" contm um nmero inteiro que indica o tipo do documento conforme abaixo: 1 - Promissria 2 - Duplicata 3 - Boleto Gostaria que, ao exibir os dados (num DBGrid por exemplo), fosse exibido o nome e no o nmero, ou seja, "Promissria" em vez de "1". Soluo: Isto pode ser feito de vrias formas, mas aqui vou mostrar como resolver usando o evento OnGetText do TField. Vejamos: - Adicione todos os campos no Field Editor; - Clique no campo "Tipo"; - V ao Object Inspector e d um duplo-click 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;

ObservaesAo 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.

75 - 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;

ObservaesNos testes que fiz, mesmo com a barra de tarefas marcada como "Sempre Visvel", funcionou perfeitamente. Fiz os testes usando o Win95. Talvez em novas verses, possa apresentar problemas.

74 - Verificar, via programao, se Local Share do BDE est TRUEInclua 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 { Local Share est FALSE }

ObservaesA 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.

73 - Criar um EXE que seja executado apenas atravs de outro EXE criado por mimInclua na seo uses: Windows { Problema: Gostaria que um determinado programa (Prog1.EXE) fosse executado apenas atravs de outro programa (Prog2.EXE). Soluo: 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 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'); if (Attr and FILE_ATTRIBUTE_TEMPORARY) > 0 then Add('Temporary'); end; end;

68 - Obter o espao total e livre de um discoInclua 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, ... }

ObservaesPara usar as funes DiskSize e DiskFree coloque SysUtils em uses.

67 - 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 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);

ObservaesPara 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.

66 - 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;

65 - Alterar o nome de volume (Label) de um discoInclua na seo uses: Windows { Da unidade C: } SetVolumeLabel('c:\', 'NovoLabel'); { Da unidade atual: } SetVolumeLabel(nil, 'NovoLabel');

ObservaesVeja a pergunta n 66.

64 - Saber quais as unidades de disco (drives) esto presentesInclua 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.');

ObservaesA string retornada pela funo tbGetDrives est sempre em letras maisculas.

63 - "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

ObservaesIsto 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.

62 - 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; end; { Chame-a como nos exemplos abaixo: } tbDBDeleteAll(Table1); ou tbDBDeleteAll(Query1);

ObservaesSe 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).

61 - 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;

60 - 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;

ObservaesUsando este recurso, a acentuao no fica excelente, mas melhora bastante.

59 - Imprimir texto justificado com formatao na impressora Epson LX-300{ 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;

ObservaesEste recurso de justificao da Epson LX-300 pode ser usado em qualquer linguagem de programao.

58 - 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 } { 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;

ObservaesPara 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.

57 - Alterar (e restaurar) o tamanho da pgina na impressoraInclua na seo uses: tbPrn { - Peque em nosso Download o arquivo tbPrn.zip. Ele contm a unit tbPrn.pas, onde est a 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 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) }

ObservaesS ser necessrio informar Papel.Height e Papel.Width quando Papel.Size for 256.

56 - Reproduzir um arquivo de som WAV sem o TMediaPlayerInclua 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);

ObservaesA 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.

55 - Obter o nome do usurio e da empresa informado durante a instalao do WindowsInclua 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;

54 - Mostrar uma barra de progresso enquanto copia arquivosVeja a pergunta n 53.

53 - Copiar arquivos usando o Shell do WindowsInclua 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;

ObservaesEsta 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.

52 - 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;

ObservaesPara testar execute e observe o Label enquanto pressiona as teclas desejadas.

51 - Evitar que seu programa aparea na barra de tarefasInclua 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, 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.

ObservaesAo executar observe a barra de tarefas e teste o Alt+Tab (seu programa no estar l!).

50 - 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);

49 - 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);

ObservaesAconselho 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.

48 - 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);

47 - 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;

ObservaesPara 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.

46 - Enviar um arquivo para a lixeiraInclua 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;

45 - Obter o nmero do registro atualTable1.RecNo()

44 - Trabalhar com Filter de forma mais prticaSe 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));

ObservaesA 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.

43 - Reproduzir um arquivo WAVInclua na seo uses: MMSystem PlaySound('C:\ArqSom.wav', 1, SND_ASYNC);

ObservaesTroque o nome do arquivo (C:\ArqSom.wav) pelo arquivo desejado.

42 - 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);

ObservaesSe quizer que a janela do programa no aparea, troque sw_ShowNormal por sw_Hide.

41 - 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;

ObservaesEste 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.

40 - Colocar Hint's de vrias linhas{ - Coloque um TButton no Form; - Altere o evento OnCreate do Form como abaixo: } 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;

39 - 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;

ObservaesEm 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;

38 - 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); begin { Pega s letras } ShowMessage(FilterChars('D63an*%i+/e68l13', ['A'..'Z', 'a'..'z'])); { Pega s nmeros } ShowMessage(FilterChars('D63an*%i+/e68l13', ['0'..'9'])); end;

ObservaesSe 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.

37 - 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.

36 - 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;

ObservaesNo 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! Veja as perguntas n 35 e 53.

35 - 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

ShowMessage('Erro ao copiar ' + Origem + ' para ' + Destino); end;

ObservaesNo 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! Veja as perguntas n 36 e 53.

34 - Trabalhar com cores no formato stringprocedure 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;

33 - 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;

ObservaesH 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.

32 - 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 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;

ObservaesNo exemplo acima todos os arquivos do diretrio c:\Teste sero excludos. CUIDADO! Arquivos excludos desta forma no vo para a lixeira. Veja a pergunta n 46.

31 - Gerar uma tabela no Word atravs do DelphiInclua 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); end; finally { Fecha o Word } Word.Quit; end; end;

ObservaesForam usados neste exemplo o Delphi4 e MS-Word97.

30 - Obter a quantidade de registros total e visvel de uma tabelaInclua 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 = 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;

ObservaesPara 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.

24 - 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; 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); }

ObservaesO 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.

23 - Definir a quantidade de registros a ser impressa em uma pgina do QuickReportOu 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.

22 - Onde encontrar tutoriais sobre construo de componentes em DelphiPegue apostila no download.

21 - Para que servem OnGetEditMask, OnGetEditText e OnSetEditText do TStringGridO 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 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;

ObservaesPara 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!).

20 - 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 Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end; finally F.Free; end; end.

ObservaesO Form2 do exemplo o Form de LogOn. Este dever ser preparado para que se possa escolher o usurio, digitar a senha, etc.

19 - Limitar a regio de movimentao do mouseInclua 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;

ObservaesCuidado! Isto pode irritar o usurio do seu programa.

18 - Descobrir o nome de classe de uma janela do WindowsMuitas 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

17 - Ocultar/exibir a barra de tarefas do WindowsInclua na seo uses: Windows { Coloque no Form dois Botes: BotaoOcultar e BotaoExibir. No evento OnClick do BotaoOcultar escreva: } procedure TForm1.BotaoOcultarClick(Sender: TObject); 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 }

ObservaesA 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.

16 - Evitar a proteo de tela durante seu programaInclua 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;

15 - 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 (1 segundo). Modifique o evento OnTimer do Timer conforme abaixo: } procedure TForm1.Timer1Timer(Sender: TObject); begin FlashWindow(Handle, true); FlashWindow(Application.Handle, true); end;

14 - Posicionar o cursor do mouse em um controleInclua 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;

ObservaesA 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.

13 - 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;

ObservaesA 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(...)).

12 - Adicionar uma nova fonte no Windows{ Coloque o cdigo abaixo no OnClick de um boto } AddFontResource(PChar('c:\MyFonts\Monospac.ttf'));

ObservaesTroque 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.

11 - Saber se a impressora atual possui determinada fonteInclua 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.');

ObservaesIsto 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.

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.');

ObservaesVeja tambm a pergunta n 11.

9 - 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;

ObservaesNo Edit1 digite a nova data e no Edit2 digite a nova hora.

8 - ENTER em vez de TAB no formulrio, no DBGrid e no StringGrid{ Mude a propriedade "KeyPreview" do Form para true. } { 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.

7 - 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;

ObservaesNa 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.

6 - Paralizar um programa durante n segundosInclua na seo uses: Windows { Pausa por 1 segundo } Sleep(1000); { Pausa por 10 segundos } Sleep(10000);

ObservaesEsta pausa no interrompida pelo pressionamento de alguma tecla, como acontecia com InKey() do Clipper.

5 - Criar uma tabela (DB, DBF) atravs do seu programaInclua 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;

ObservaesPara verificar se o arquivo j existe na verso 3 ou anterior do Delphi, voc dever usar a funo "FileExists" do Delphi.

4 - Verificar se um diretrio existeInclua na seo uses: FileCtrl, Dialogs if DirectoryExists('C:\MEUSDOCS') then ShowMessage('O diretrio existe') else ShowMessage('O diretrio no existe');

3 - Verificar se um arquivo existeInclua na seo uses: SysUtils, Dialogs if FileExists('c:\carta.doc') then ShowMessage('O arquivo existe') else ShowMessage('O arquivo no existe');

2 - Criar um Alias temporrio atravs do seu programaInclua na seo uses: DB { Enxergar somente configuraes da sesso atual } Session.ConfigMode := cmSession; { Adicionar o Alias } Session.AddStandardAlias('MeuAlias', 'C:\DirProg', 'PARADOX');

ObservaesVeja a pergunta n 1.

1 - Criar um Alias atravs do seu programaInclua 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;

ObservaesPara 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.

A listbox in a cell of a stringgridHere's another great trick by programmer illusionists. What appears as embedded comboboxes within a stringgrid is actually just a combobox floating above the stringgrid, and it just so happens to be the exact same size as the stringgrid cell underneath it. Here's the basics: procedure TfrmMain.FormCreate(Sender: TObject); begin StringGrid1.DefaultRowHeight := ComboBox1.Height; end; procedure TfrmMain.StringGrid1DrawCell(Sender: TObject; Col, Row: Integer; Rect: TRect; State: TGridDrawState); var R: TRect; begin if (Col >= StringGrid1.FixedCols) and (Row >= StringGrid1.FixedRows) and (gdFocused in State) then with ComboBox1 do begin BringToFront; CopyRect(R, Rect); R.TopLeft := frmMain.ScreenToClient( StringGrid1.ClientToScreen(R.TopLeft)); R.BottomRight := frmMain.ScreenToClient( StringGrid1.ClientToScreen(R.BottomRight)); SetBounds(R.Left, R.Top, R.Right-R.Left, R.Bottom-R.Top); end; end; procedure TfrmMain.StringGrid1TopLeftChanged(Sender: TObject); var R: TRect; begin with StringGrid1 do

CopyRect(R, CellRect(Col, Row)); with ComboBox1 do begin Visible := False; R.TopLeft := frmMain.ScreenToClient( StringGrid1.ClientToScreen(R.TopLeft)); R.BottomRight := frmMain.ScreenToClient( StringGrid1.ClientToScreen(R.BottomRight)); SetBounds(R.Left, R.Top, R.Right - R.Left, R.Bottom - R.Top); end; with StringGrid1 do if (TopRow Row) then ComboBox1.Show; end; procedure TfrmMain.ComboBox1Change(Sender: TObject); begin with StringGrid1 do Cells[Col, Row] := ComboBox1.Text; end; In essence, the main routine here is the stringgrid's OnDrawCell event handler. Of course, I also set the stringgrid's DefaultRowHeight property to be the same height as the combobox. In addition, the stringgrid's OnTopLeftChanged event handler is used to hide the combobox when the user scrolls out of view. Also, when the user selects an item from the combobox, simply place the text in the current Col/Row. You can also do a couple other little tricks such as setting the stringgrid's Objects[] property to point to the combobox, as well as possibly setting the combobox's Parent property to point to the stringgrid. However, I've had problems with the Parent approach -- namely, that of dropping down the listbox associated with the combobox.

"Change the StringGrid's CELL color ?" by EDDIE SHIPMANHere's how: procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Integer; Rect: TRect; State: TGridDrawState); var TempPString:Array [0..255] of char; begin If (gdFixed in State){or (gdSelected in State)} then exit; StringGrid1.Canvas.Brush.Style:=bsSolid; {You could add some color here, if desired:} Case Col of 1: StringGrid1.Canvas.Brush.Color:=clRed; 2: StringGrid1.Canvas.Brush.Color:=clWhite; 3: StringGrid1.Canvas.Brush.Color:=clBlue; end; {Erase data} StringGrid1.Canvas.FillRect(Rect); {Get text in a PChar string}

StrPCopy(TempPString,StringGrid1.Cells[Col,Row]); {DrawText--see other options in Windows API help; Change the DT_LEFT to DT_RIGHT for right justified txt!} DrawText(StringGrid1.Canvas.Handle,TempPString,-1,Rect,DT_LEFT); end;

Sort a TStringGrid by Columns?type TMoveSG = class(TCustomGrid); // reveals protected MoveRow procedure {...} procedure SortGridByCols(Grid: TStringGrid; ColOrder: array of Integer); var i, j: Integer; Sorted: Boolean; function Sort(Row1, Row2: Integer): Integer; var C: Integer; begin C := 0; Result := AnsiCompareStr(Grid.Cols[ColOrder[C]][Row1], Grid.Cols[ColOrder[C ]][Row2]); if Result = 0 then begin Inc(C); while (C = Grid.ColCount) then Exit; j := 0; Sorted := False; repeat Inc(j); with Grid do for i := 0 to RowCount - 2 do if Sort(i, i + 1) > 0 then begin TMoveSG(Grid).MoveRow(i + 1, i); Sorted := False; end; until Sorted or (j = 1000); Grid.Repaint;

end; procedure TForm1.Button1Click(Sender: TObject); begin { Sort rows based on the contents of two or more columns. Sorts first by column 1. If there are duplicate values in column 1, the next sort column is column 2 and so on...} SortGridByCols(StringGrid1, [1, 2, 0, 3, 4]); end;

...export a TStringGrid to a MS Word table?uses ComObj; procedure TForm1.Button1Click(Sender: TObject); var WordApp, NewDoc, WordTable: OLEVariant; iRows, iCols, iGridRows, jGridCols: Integer; begin try // Create a Word Instance // Word Instanz erzeugen WordApp := CreateOleObject('Word.Application'); except // Error... // Fehler.... Exit; end; // Show Word // Word anzeigen WordApp.Visible := True; // Add a new Doc // Neues Dok einfgen NewDoc := WordApp.Documents.Add; // Get number of columns, rows // Spalten, Reihen ermitteln iCols := StringGrid1.ColCount; iRows := StringGrid1.RowCount; // Add a Table // Tabelle einfgen WordTable := NewDoc.Tables.Add(WordApp.Selection.Range, iCols, iRows); // Fill up the word table with the Stringgrid contents // Tabelle ausfllen mit Stringgrid Daten for iGridRows := 1 to iRows do for jGridCols := 1 to iCols do WordTable.Cell(iGridRows, jGridCols).Range.Text := StringGrid1.Cells[jGridCols - 1, iGridRows - 1]; // Here you might want to Save the Doc, quit Word...

// Hier evtl Word Doc speichern, beenden... // ... // Cleanup... WordApp := Unassigned; NewDoc := Unassigned; WordTable := Unassigned; end;

...convert a TStringGrid to HTML?{ The SGridToHtml() function converts a Stringgrid to a HTML Code. Parameters: SG: TStringGrid to convert Dest: TMemo to show the HTML Code BorderSize: Size of border (0 = show no border) { Mit der Funktion SGridToHtml() knnen StringGrids in HTML Code umgewandelt werden. SG bezieht sich auf das TStringGrid, welches codiert werden soll. in Dest (vom Typ TMemo) wird der HTML Code erzeugt. BorderSize bestimmt, wie dick der Tabellenrahmen sein soll. 0 = kein Rahmen } procedure SGridToHtml(SG: TStringgrid; Dest: TMemo; BorderSize: Integer); var i, p: integer; SStyle1, SStyle2, Text: string; begin Dest.Clear; Dest.Lines.Add(''); Dest.Lines.Add(''); Dest.Lines.Add(' '); for i := 0 to SG.RowCount - 1 do begin Dest.Lines.Add(' '); for p := 0 to SG.ColCount - 1 do begin SStyle1 := ''; SStyle2 := ''; if fsbold in SG.Font.Style then begin SStyle1 := SStyle1 + ''; SStyle2 := SStyle2 + ''; end; if fsitalic in SG.Font.Style then begin SStyle1 := SStyle1 + ''; SStyle2 := SStyle2 + ''; end; if fsunderline in SG.Font.Style then begin

SStyle1 := SStyle1 + ''; SStyle2 := SStyle2 + ''; end; Text := sg.Cells[p, i]; if Text = '' then Text := ' '; Dest.Lines.Add(' ' + SStyle1 + Text + SStyle2 + ''); end; Dest.Lines.Add(' '); end; Dest.Lines.Add(' '); Dest.Lines.Add('');; Dest.Lines.Add(''); end; // Example, Beispiel procedure TFormCSVInport.Button6Click(Sender: TObject); begin SGridToHtml(StringGrid1, Memo1, 1); Memo1.Lines.SaveToFile('c:\test.html'); end;

...export a StringGrid to an Excel-File?{1. With OLE Automation } uses ComObj; function RefToCell(ARow, ACol: Integer): string; begin Result := Chr(Ord('A') + ACol - 1) + IntToStr(ARow); end; function SaveAsExcelFile(AGrid: TStringGrid; ASheetName, AFileName: string): Boolean; const xlWBATWorksheet = -4167; var Row, Col: Integer; GridPrevFile: string; XLApp, Sheet, Data: OLEVariant; i, j: Integer; begin // Prepare Data Data := VarArrayCreate([1, AGrid.RowCount, 1, AGrid.ColCount], varVariant); for i := 0 to AGrid.ColCount - 1 do for j := 0 to AGrid.RowCount - 1 do Data[j + 1, i + 1] := AGrid.Cells[i, j]; // Create Excel-OLE Object Result := False; XLApp := CreateOleObject('Excel.Application'); try

// Hide Excel XLApp.Visible := False; // Add new Workbook XLApp.Workbooks.Add(xlWBatWorkSheet); Sheet := XLApp.Workbooks[1].WorkSheets[1]; Sheet.Name := ASheetName; // Fill up the sheet Sheet.Range[RefToCell(1, 1), RefToCell(AGrid.RowCount, AGrid.ColCount)].Value := Data; // Save Excel Worksheet try XLApp.Workbooks[1].SaveAs(AFileName); Result := True; except // Error ? end; finally // Quit Excel if not VarIsEmpty(XLApp) then begin XLApp.DisplayAlerts := False; XLApp.Quit; XLAPP := Unassigned; Sheet := Unassigned; end; end; end; // Example: procedure TForm1.Button1Click(Sender: TObject); begin if SaveAsExcelFile(stringGrid1, 'My Stringgrid Data', 'c:\MyExcelFile.xls') then ShowMessage('StringGrid saved!'); end; {**************************************************************} {2. Without OLE } procedure XlsWriteCellLabel(XlsStream: TStream; const ACol, ARow: Word; const AValue: string); var L: Word; const {$J+} CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0); {$J-} begin L := Length(AValue); CXlsLabel[1] := 8 + L; CXlsLabel[2] := ARow; CXlsLabel[3] := ACol; CXlsLabel[5] := L; XlsStream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel)); XlsStream.WriteBuffer(Pointer(AValue)^, L);

end; function SaveAsExcelFile(AGrid: TStringGrid; AFileName: string): Boolean; const {$J+} CXlsBof: array[0..5] of Word = ($809, 8, 00, $10, 0, 0); {$J-} CXlsEof: array[0..1] of Word = ($0A, 00); var FStream: TFileStream; I, J: Integer; begin Result := False; FStream := TFileStream.Create(PChar(AFileName), fmCreate or fmOpenWrite); try CXlsBof[4] := 0; FStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof)); for i := 0 to AGrid.ColCount - 1 do for j := 0 to AGrid.RowCount - 1 do XlsWriteCellLabel(FStream, I, J, AGrid.cells[i, j]); FStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof)); Result := True; finally FStream.Free; end; end; // Example: procedure TForm1.Button2Click(Sender: TObject); begin if SaveAsExcelFile(StringGrid1, 'c:\MyExcelFile.xls') then ShowMessage('StringGrid saved!'); end; {**************************************************************} {3. Code by Reinhard Schatzl } uses ComObj; // Hilfsfunktion fr StringGridToExcelSheet // Helper function for StringGridToExcelSheet function RefToCell(RowID, ColID: Integer): string; var ACount, APos: Integer; begin ACount := ColID div 26; APos := ColID mod 26; if APos = 0 then begin ACount := ACount - 1; APos := 26; end; if ACount = 0 then Result := Chr(Ord('A') + ColID - 1) + IntToStr(RowID);

if ACount = 1 then Result := 'A' + Chr(Ord('A') + APos - 1) + IntToStr(RowID); if ACount > 1 then Result := Chr(Ord('A') + ACount - 1) + Chr(Ord('A') + APos - 1) + IntToSt r(RowID); end; // StringGrid Inhalt in Excel exportieren // Export StringGrid contents to Excel function StringGridToExcelSheet(Grid: TStringGrid; SheetName, FileName: string ; ShowExcel: Boolean): Boolean; const xlWBATWorksheet = -4167; var SheetCount, SheetColCount, SheetRowCount, BookCount: Integer; XLApp, Sheet, Data: OLEVariant; I, J, N, M: Integer; SaveFileName: string; begin //notwendige Sheetanzahl feststellen SheetCount := (Grid.ColCount div 256) + 1; if Grid.ColCount mod 256 = 0 then SheetCount := SheetCount - 1; //notwendige Bookanzahl feststellen BookCount := (Grid.RowCount div 65536) + 1; if Grid.RowCount mod 65536 = 0 then BookCount := BookCount - 1; //Create Excel-OLE Object Result := False; XLApp := CreateOleObject('Excel.Application'); try //Excelsheet anzeigen if ShowExcel = False then XLApp.Visible := False else XLApp.Visible := True; //Workbook hinzufgen for M := 1 to BookCount do begin XLApp.Workbooks.Add(xlWBATWorksheet); //Sheets anlegen for N := 1 to SheetCount - 1 do begin XLApp.Worksheets.Add; end; end; //Sheet ColAnzahl feststellen if Grid.ColCount 01 and ncliente < 04 //Exibir seus dados em ordem ascendente (A a Z, 0 a 9). SELECT Sobrenome, Nome FROM Funcionrios ORDER BY Sobrenome; SELECT Sobrenome, Nome FROM Funcionrios ORDER BY Sobrenome ASC; //Selecione todos os campos da tabela cliente organizadopor nome Select * form cliente order by nome //Selecione os campos nprodutos e descrio da tabela produto organizado por descrio Select nProdutos, descrio from produto order by descrio //Selecione todos os campos da tabela produto organizado por nproduto em ordem descendente Select * from produto order by nproduto desc //Classificar em ordem descendente (Z a A, 9 a 0), adicione a palavra reservada DESC ao final de cada campo SELECT Sobrenome, Salrio FROM Funcionrios ORDER BY Salrio DESC, Sobrenome; //Esse exemplo ordena os registros pelo sobrenome, em ordem descendente (Z-A). SELECT Sobrenome, Nome FROM Funcionrios ORDER BY Sobrenome DESC; //Esse exemplo ordena, primeiro, por categoria ID e depois por nome do produto. SELECT CategoriaID, ProdutoNome, PreoUnit FROM Produtos ORDER BY CategoriaID, NomeProduto; //Selecione os campos descrio, preo e o valor de preo + 20 de tabela produto onde nproduto = 004 Select descrio, preo, preo + 20 from produto where nproduto = 004 //Selecione todos os campos da tabela Leitores onde o campo nome seja iguas a 'Joo' Select * from Leitores where Nome = 'Joo Cabral' //Selecione todos os campos da tabela cliente onde o campo nome inicie com Vis* desprezando os outros caracteres Select * from cliente where nome LIKE 'Vis%' //Selecione todos os campo da tabela leitor onde o campo CPF nulo Select * from Leitor where CPF is Null Select nproduto + '', '' + descrio AS Itens, preo from produto Selecione nproduto + '', '' + descrio AS Itens, preo (junte os campos como Itens) da tabela produto

//Qual seria o salrio se cada funcionrio recebesse um aumento de 10 porcento. No altera o valor original dos salrios. SELECT Sobrenome, Salrio AS Atual, Salrio * 1.1 AS Proposto FROM Funcionrios; //Coloca o ttulo Nome no topo da coluna "Sobrenome". O ttulo Salrio, no topo da coluna "Salrio". SELECT Sobrenome AS Nome, Salrio FROM Funcionrios; Select nproduto from pedido/ produto where nPedido = 1 Select nproduto from pedido / produto where nProduto = 2 Select nproduto from pedido / produto where npedido = 1 UNION ALL Select nproduto From pedido/ produto where nProduto = 2 Select * from pedido where nproduto beteeen 2 and 5 Selecione todos os campos da tabela pedido onde o campo nproduto esteja entre 2 e 5 Selecione todos os campos da tabela pedido onde o campo npedido esteja entre 2 e 5 Select * from pedido where nproduto IN ( 2,5 ) Select DISTINCT * from pedido/produto Selecione retirando as duplicatas do campo nproduto da tabela pedido/produto Select TOP 3 from produto Selecione os primeiros 3 registros da tabela produto Select Ucase ( descrio) from produto Selecione ( descrio ) o campo descrio em maisculo da tabela produto Select COUNT ( * ) as quantidade from produto where preo > 50,00 //Conta o nmero de registros que tm uma entrada no campo "CdigoPostal" e nomeia o campo retornado como "Tcp". SELECT Count(CdigoPostal) AS Tcp FROM Clientes; Selecione o campo descrio em maiusculo da tabela produto Select SUM ( quantidade) from pedido/produto where nproduto = 1 Selecione a soma do campo soma da tabela pedido/produto onde nproduto= 1 Select min ( quantidade ) from pedido/ produto Selecione a menor quantidade do campo quantidade da tabela pedido / produto: pedido/produto Select MAX ( quantidade ) from pedido / produto //Seleciona Departamento da tabela Funcionrios e NomeSupv da tabela Supervisores: SELECT Funcionrios.Departamento, Supervisores.NomeSupv FROM Funcionrios INNER JOIN Supervisores WHERE Funcionrios.Departamento = Supervisores.Departamento; //O exemplo abaixo usa o ttulo Nasc para nomear o objeto Field retornado no objeto Recordset resultante: SELECT DataNasc AS Nasc FROM Funcionrios; //O exemplo abaixo usa o ttulo Contagem para nomear o objeto Field retornado no objeto Recordset resultante: SELECT COUNT(FuncionrioID) AS Contagem FROM Funcionrios; SELECT CategoriaID, Sum(UnidadesNoEstoque) FROM Produtos GROUP BY CategoriaID HAVING Sum(UnidadesNoEstoque) > 100 AND LIKE "BOS*"; // O exemplo abaixo habilita o usurio a ver as informaes de salrio (mesmo que no tenha outra permisso para ver a tabela Folha de Pagamentos) desde que o proprietrio da consulta tenha tal permisso: SELECT Sobrenome, Nome, Salrio FROM Funcionrios ORDER BY Sobrenome WITH OWNERACCESS OPTION;

//O nmero de funcionrios e os salrios mdio e mximo. SELECT Count(*) AS [Total de Funcionrios], Avg(Salrio) AS [Salrio Mdio], Max(Salrio) AS [Salrio Mximo] FROM Funcionrios; //Para cada registro, mostra Sobrenome e Salrio no primeiro e ltimo campos. A seqncia de caracteres "tem um salrio de" retornada como o campo do meio de cada registro. SELECT Sobrenome, 'tem um salrio de', Salrio FROM Funcionrios; //Cria uma lista de nomes de departamentos nicos e o nmero de funcionrios em cada um destes departamentos. SELECT Departamento, Count([Departamento]) AS Tbc FROM Funcionrios GROUP BY Departamento; //Para cada ttulo de funo nico, calcula o nmero de funcionrios do departamento de Vendas que tm este ttulo. SELECT Ttulo, Count(Ttulo) AS Tbc FROM Funcionrios WHERE Departamento = 'Vendas' GROUP BY Ttulo; //Calcula o nmero de itens em estoque para cada combinao de nmero e cor do item. SELECT Item, Sum(Unidades) AS Tbc FROM ItensEmEstoque GROUP BY Item, Cor; //Seleciona os ttulos de cargos do departamento de Produo atribudos a mais de 50 funcionrios. SELECT Ttulo, Count(Ttulo) FROM Funcionrios WHERE Departamento = 'Produo' GROUP BY Ttulo HAVING Count(Ttulo) > 50; //Esse exemplo seleciona os departamentos que tenham mais de 100 funcionrios. SELECT Departamento, Count([Departamento]) FROM Funcionrios GROUP BY Departamento HAVING Count(Departamento) > 100; //Seleciona todos os registros de "Novos Clientes" e os adiciona tabela "Clientes" (quando no so designadas colunas individuais, os nomes das colunas das tabelas SELECT devem corresponder exatamente aos da tabela INSERT INTO). INSERT INTO Clientes SELECT [Novos Clientes].* FROM [Novos Clientes]; //Esse exemplo cria um novo registro na tabela "Funcionrios" INSERT INTO Funcionrios (Nome,Sobrenome, Ttulo) VALUES ("Andr", "Pereira", "Estagirio"); Seleciona todos os estagirios de "Estagirios" que foram contratados h mais de 30 dias e adiciona seus registros tabela "Funcionrios". INSERT INTO Funcionrios SELECT Estagirios.* FROM Estagirios WHERE DataContrato < Now() - 30; //Aumenta o Valor do Pedido em 10 % e o valor do Frete em 3 % para embarques do Reino Unido: UPDATE Pedidos SET ValorPedido = ValorPedido * 1.1, Frete = Frete * 1.03 WHERE PasEmbarque = 'RU'; //Muda os valores no campo "RelatrioPara" para 5 para todos os registros de funcionrios que atualmente tm valores de RelatrioPara de 2. UPDATE Funcionrios SET RelatrioPara = 5 WHERE RelatrioPara = 2; //Aumenta o "PreoUnit" de todos os produtos no suspensos do fornecedor 8 em 10 porcento. UPDATE Produtos SET PreoUnit = PreoUnit * 1.1 WHERE FornecedorID = 8 AND Suspenso = No; //Reduz o PreoUnit de todos os produtos no suspensos fornecidos pela Tokyo Traders em 5 porcento. As tabelas "Produtos" e "Fornecedo