Código
Índice das Dicas
Como colocar a tecla Enter para realizar a mesma função da tecla TAB
Como mover um componente em Run-time ...
Hint com quebra de linhas...
Imprimir diretamente para a impressora sem passar pelo gerenciador de impressão
Fechar um aplicativo Delphi a partir de outro aplicativo Delphi ...
Mostrar o HINT num Panel ...?
Descobrindo o Diretório do Windows
Imprimindo o conteúdo de um TMemo ou TListbox
Deleção em cascata com Paradox
Criando e Excluindo TFields em tempo de execução
Como sobressair ao erro "Index not found" em tabelas Dbase
Inserindo um Combobox num DBGrid
Removendo a barra de rolagem vertical do DBGrid
Movendo um formulário sem clicar na barra de título
Desabilitando o Auto Play do CD-ROM
Acessando arquivos Paradox em Rede
Teste se há disco no drive "A"
Checando disco no drive ?
Pegando o nome do usuário e a empresa do Windows
Como validar a entrada em uma caixa de texto
Configurando a tecla "ENTER" para funcionar como "TAB"
Como traduzir mensagens do Delphi ?
Escondendo o botão iniciar do Windows ?
Escondendo a barra de tarefas do Windows ?
Pegar o primeiro nome de uma pessoa ?
Bug do ano 2000 ?
Número Serial do HD ?
Habilitando / Desabilitando o Ctrl+Alt+Del e o Alt+Tab ?
Executando programas externos ?
Enviando arquivos para a Lixeira ?
Apagando pastas com tudo dentro ?
Alterando a data do sistema ?
Monitor em modo de baixa energia ?
Abrindo e fechando o drive do CD-ROM ?
Como criar um Form de Apresentação (Splash Form) como o do WORD ?
Como interceptar as teclas de funções no seu programa ?
Traduzindo mensagem: "Delete Record ?" ?
Utilizando a tecla ENTER para saltar de Campo ?
Como fazer para reindexar a tabela novamente ?
Como converter um campo com valor Currency para String e o mesmo perde os zeros à direita após a virgula?
Como saber se um form está aberto ou não ?
Como obter o diretório onde o seu programa está instalado ?
Como fazer com que quando clicar em um botão , inicialize o computador ?
Como traduzir as mensagens que o Delphi exibe?
Criando um Alias dinamicamente na memória?
Veja como carregar um cursor animado em sua aplicação
Bloquear a tecla Ctrl+Del do DBGrid
Veja como retornar a coluna ativa do DBGrid
A função abaixo mostra como adquirir a data e hora de um arquivo
Alterar as cores do título de um DBGrid em tempo execução
Como definir seu próprio hotkey (Tecla Quente)
Lendo o volume do HD
Escondendo janelas filhas minimizadas
Conectando uma unidade de rede
Copiando Arquivos Via Programação
Interceptando as teclas de função no seu programa
Função que retorna o nome do usuário logado na rede
Função que retorna o nome do Computador
Rolar um form usando pgUP and pgDn
Preenche com quantidade determinada de zeros o lado esquerdo de uma string
--------------------------------------------------------------------------------
Como colocar a tecla Enter para realizar a mesma função da tecla TAB ?
O pessoal tem a mania de falar mal do Clipper, a única coisa que tenho contra a linguagem foi o vício que ela deixou ao usuário, a utilização da tecla Enter para a troca de campos, o Windows veio acabar com isso, trocando a tecla Enter pela tecla TAB (que é o correto) infelizmente tarde demais pois os usuários já tinham ficado viciados com a tecla Enter então coube a nós, programadores, satizfazer o usuário e fazer com que o Delphi aceite a tecla Enter para a troca dos campos. Para fazer isso crie um formulário em seu sistema, por exemplo fPadrao, altere as propriedades KeyPreview para "True" e Name para "F_Padrao", e para o evento onKeyPress coloque o seguinte código:
// Atribui ao Enter as Mesmas funções do Tab
procedure TF_Padrao.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then
if not (ActiveControl is TDBGrid) then
begin
Key := #0;
Perform(WM_NEXTDLGCTL, 0, 0);
end
else
if (ActiveControl is TDBGrid) then
with TDBGrid(ActiveControl) do
if selectedindex < (fieldcount -1) then
selectedindex := selectedindex +1
else
selectedindex := 0;
end;
A partir de agora crie todos os outros formulários do seu projeto baseado na fPadrao ao invés da TForm, no Delphi 2.0 ou 3.0 isso é automático, para o usuário do Delphi 1.0 basta apenas trocar na definição da classe:
de:
type TForm1 = class(TForm)
para:
type TForm1 = class(TF_Padrao)
Não se esqueça de no formulário fPadrao adicionar a biblioteca DBGrids antes da definição do objeto principal, ou seja, na cláusula uses logo após a seção interface. Aproveite o formulário F_Padrao e coloque os comandos aos eventos que sejam comuns a todos os formulários, utilizando a característica de herança.
Voltar
--------------------------------------------------------------------------------
Veja abaixo como mover um componente em Run-time ...
No exemplo abaixo deve ser incluído um componente Button. Para testar este exemplo mantenha a tecla CTRL pressionada clique com o mouse no componente Button. Feito isto, basta arrastar o componente Button para qualquer lado.
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
procedure Button1MouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
MouseDownSpot : TPoint;
Capturing : bool;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
// Evento OnMouseDown do Form
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin
if ssCtrl in Shift then begin
SetCapture(Button1.Handle);
Capturing := true;
MouseDownSpot.X := x;
MouseDownSpot.Y := Y;
end;
end;
// Evento OnMouseMove do Form
procedure TForm1.Button1MouseMove(Sender:TObject; Shift: TShiftState; X, Y: Integer);
begin
if Capturing then begin
Button1.Left:= Button1.Left-(MouseDownSpot.x-x);
Button1.Top:= Button1.Top - (MouseDownSpot.-y);
end;
end;
// Evento OnMouseUp do Form
procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin
if Capturing then begin
ReleaseCapture;
Capturing := false;
Button1.Left := Button1.Left - (MouseDownSpot.x -x);
Button1.Top := Button1.Top - (MouseDownSpot.y - y);
end;
end;
Voltar
--------------------------------------------------------------------------------
Hint com quebra de linhas... ?
Para incluir mais de uma linha no Hint você deve utilizar o evento OnMouseMove de cada componente. Veja abaixo como ficará o código em um Edit por exemplo.
procedure TForm1.Edit1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Edit1.hint := ‘Primeira Linha’+#13+’Segunda Linha’+#13+‘Terceira Linha’+#13+’Quarta Linha’;
end;
Obs. Não esquecer de mudar para TRUE o evento ShowHint.
Voltar
--------------------------------------------------------------------------------
Imprimir diretamente para a impressora sem passar pelo gerenciador de impressão ... ?
procedure TForm1.Button1Click(Sender: TObject);
var
F : TextFile;
i : integer;
begin
AssignFile(F,’LPT1');
Rewrite(F);
i := 0;
Writeln(F,’Teste de impressao - Linha 0');
Writeln(F,’Teste de impressao - Linha 1');
Writeln(F,#27#15+’Teste de Impressão - Linha 2');
Writeln(F,’Teste de impressao - Linha 3');
Writeln(F,#27#18+’Teste de Impressão - Linha 4');
Writeln(F,’Teste de impressao - Linha 5');
Writeln(F,#12); // Ejeta a página
CloseFile(F);
end;
Voltar
--------------------------------------------------------------------------------
Fechar um aplicativo Delphi a partir de outro aplicativo Delphi ... ?
procedure TForm1.Button1Click(Sender: TObject);
var
Win : THandle;
begin
Win := FindWindow(nil,’Form1');
if Win <> 0 then
PostMessage(Win,WM_CLOSE,0,0)
else
ShowMessage(‘Programa não encontrado’);
end;
Obs. No exemplo acima foi utilizado o POSTMESSAGE para enviar uma mensagem WM_CLOSE para a janela principal.
Voltar
--------------------------------------------------------------------------------
Mostrar o HINT num Panel ... ?
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnHint := DisplayHint;
end;
procedure TForm1.DisplayHint(Sender: TObject);
begin
Panel1.Caption := Application.Hint;
end;
Obs. Não é necessário Atribuir True para o ShowHint
Voltar
--------------------------------------------------------------------------------
Descobrindo o Diretório do Windows
Nem todo mundo instala o Windows no diretório C:Windows. Portanto, use esta função para descobrir em qual diretório o Windows foi instalado:
function WindowsDir : string;
var WinDir : array [0..144] of char;
begin
GetWindowsDirectory (WinDir, 144); Result := StrPas (WinDir);
end;
Voltar
--------------------------------------------------------------------------------
Imprimindo o conteúdo de um TMemo ou TListbox
A função abaixo aciona a impressão de um objeto TStrings. Usamos o tipo TStrings porque desta forma forma poderemos trabalhar tanto com TMemo como TListbox, inclusive outros componentes que possuam propriedades como o tipo TStrings como o TCombobox ou TOutline. O exemplo mostra a impressão em modo DOS, ou seja, sem o uso de um driver genérico do Windows, assim a mesma será até mais rápida.
uses Printers;
procedure PrintStrings(Strings: TStrings);
var
Prn: TextFile;
i: word;
begin
AssignPrn(Prn);
try
Rewrite(Prn);
try
for i := 0 to Strings.Count - 1 do
writeln(Prn, Strings.Strings[i]);
finally
CloseFile(Prn);
end;
except
on EInOutError do
MessageDlg('Erro durante a impressão', mtError, [mbOk], 0);
end;
end;
Para imprimir o conteúdo do TMemo ou TListbox, basta chamar a função como o exemplo abaixo:
PrintStrings(Memo1.Lines);
PrintStrings(Listbox1.Items);
Voltar
--------------------------------------------------------------------------------
Deleção em cascata com Paradox
O Paradox é um Banco de dados que pode ser acessado normalmente em uma rede Novell ou Windows, é de fáçil utlização e suporta grande quantidade de dados, mas ainda não possui recursos de um ambiente Cliente/Servidor, como a deleção em cascata. Este exemplo destina-se a ensinar a fazer, via código, uma deleção e cascata em tabelas Paradox com Integridade Referencial. O exemplo a seguir, ensina como excluir os registros da tabela Table2, de acordo com o campo chave da tabela Table1. Ao Usar este exemplo siga suas instruções com bastante atenção pois a qualquer momento estamos sujeitos a errar e apagar impropositadamente um dado na tabela.
1) Crie uma variável que via armazenar o valor da chave antes de deletarmos o registro;
var
Form1: TForm1;
Chave: Integer;
implementation
{$R *.DFM}
2) No evento OnBeforeDelete da tabala pai(Table1), digite:
procedure TForm1.Table1BeforeDelete(DataSet: TDataSet);
begin
Chave := table1.fields[0].value;
end;
3) Agora, no evento OnAfterDelete digite:
procedure TForm1.Table1AfterDelete(DataSet: TDataset);
begin
with Table2 do begin
DisableControls;
FindKey([Chave])
while (Fields[0].AsString = Table1.Fields[0].AsString) and (not Eof) do
Delete;
EnableControls;
end;
end;
Este exemplo só funcionará se você NÃO utilizar as propriedades MasterSource e MasterFields do componente Table1, porque após deletarmos o registro a tabela Table2 já apontaria seus registros para a chave da tabela Table1.
Usei o evento AfterDelete para excluir os registros da tabela filho pelo simples motivo: se acontecesse algum erro durante a exclusão do registro pai e se o código para excluir os registros da tabela filho estivessem escritos na mesma procedure, poderíamos excluir dados na tabela filho e não excluir da tabela pai.
Voltar
--------------------------------------------------------------------------------
Criando e Excluindo TFields em tempo de execução
Objetos TField (e seus descendentes) podem ser criados em tempo de desenvolvimento através do Fields Editor. O Fileds Editor é acionado quando damos um clique duplo no componente de acesso a dados, ou seja, TTable ou TQuery. Mas nós podemos fazer isto em tempo de execusão também.
Descendentes do TField componente (como TStringField, TIntegerField, etc.) são criados para que possamos chamar o métodos Create para o tipo de campo desejado. Após criar o componente, precisamos especificar algumas propriedades para que a conexão com os dados funcione e assim poderemos alterar dados das tabelas. São eles:
FieldName: nome do campo na tabela.
Name: nome do componente, usado pelo Delphi.
Index: É um número de identificação para o campo. Este número nunca é repetido,automaticamente é controlado pelo Delphi.
DataSet: O componente TTable ou TQuery ao qual queremos associar o campo.
O Código abaixo mostra a criação de um campo String. Usaremos o Objeto Query1 para nos referenciarmos ao DataSet.
procedure TForm1.Button2Click(Sender: TObject);
var
T: TStringField;
begin
Query1.Close;
T := TStringField.Create(Self);
T.FieldName := 'CO_NAME';
T.Name := Query1.Name + T.FieldName;
T.Index := Query1.FieldCount;
T.DataSet := Query1;
Query1.FieldDefs.UpDate;
Query1.Open;
end;
Note que é necessário fechar o DataSet(Query1) antes de adicionarmos o novo campo.
Usamos a propriedade "Fieldcount" para definir o número da chave do campo criado, usando esta propriedade obteremos o número de TFileds que o DataSet(Query1) possui no momento, assim sempre estaremos criando um campo novo, pois se o primeiro começa com 0 o último é FieldCount -1 e FieldCount seria o número do novo campo.
Excluir um campo é bem mais simples, para isto basta criar um instância do tipo TComponent, e usar a função FindComponent para referenciá-lo ao objeto, para isto basta sabermos o nome do Objeto. A exclusão é feita através do método Free.
procedure TForm1.Button1Click(Sender: TObject);
var
TC: TComponent;
begin
TC := FindComponent('Query1CO_NAME');
if not (TC = nil) then begin
Query1.Close;
TC.Free;
Query1.Open;
end;
end;
Voltar
--------------------------------------------------------------------------------
Como sobressair ao erro "Index not found" em tabelas DBase
Quando tentamos abrir uma tabela dBASE sem o arquivo de índice (.mdx) o delphi gera a seguinte exceção: "Index does not exist...". O mesmo ocorre quando usamos tabelas Paradox. Para abrir a tabela sem o arquivo .mdx é muito simples, você só precisa rescrever o byte 28 para 0 dentro do arquivo .dbf, assim mostra a unit abaixo:
unit Fixit;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DB, DBTables, Grids, DBGrids;
type
TForm1 = class(TForm)
Table1: TTable;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure RemoveMDXByte(dbFile: String);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
const`
TheTableDir = 'c:temp'; //Não esqueça da contra-barra no final
TheTableName = 'animals.dbf';
procedure TForm1.RemoveMDXByte(dbFile: String);
const
Value: Byte = 0;
var
F: File of byte;
begin
AssignFile(F, dbFile);
Reset(F);
Seek(F, 28);
Write(F, Value);
CloseFile(F);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
try
Table1.DatabaseName := TheTableDir;
Table1.TableName := TheTableName;
Table1.Open;
except on E:EDBEngineError do
if Pos('Index does not exist', E.Message)>0 then begin
MessageDlg('O índice da tabela não existe. Deseja continuar ?',mtWarning, [mbOk], 0);
RemoveMDXByte(TheTableDir + TheTableName);
PostMessage(Button1.Handle, cn_Command, bn_Clicked, 0);
end;
end;
end;
end.
Voltar
--------------------------------------------------------------------------------
Inserindo um Combobox num DBGrid
Para inserirmos um Combobox num Dbgid não é necessário escrever nenhum código, basta seguir os passos abaixo:
1. insira um Datasource, um DBGrid e dois Table's no form
2. link o Table1 com Datasource1 e DBGrid1
3. defina um banco de dados, uma tabela e ative o Table1
4. defina também para o Table2, mas use uma tabela diferente
5. adicione todos os campos do Table1 através do Fields Editor
6. mude a propriedade Visble para False do campo do Combobox
7. dê um clique com o botão direito do mouse sobre o Fields Editor e escolha New Field...
8. especifique os parametros para o novo campo
a) Name: <algum nome>
b) Type: <tipo do campo>
c) Size: <tamanho>
d) Field type: Lookup
e) Key Field: <campo que receberá o valor escolhido no combobox&
f) DataSet: Table2
g) LookUpKeys: <campo listado no combo>
h) Result Field: <campo que será mostrado para o usuário no Combobox>
9. Clique em Ok
i) Insira todos os campos no DBGrid, clicando com o botão direito sobre o DBGrid.
Rode a aplicação....
Voltar
--------------------------------------------------------------------------------
Removendo a barra de rolagem vertical do DBGrid
Para remover a barra de rolagem vertical de componente TDBGrid, você precisa apenas criar um novo componente herdado da classe TDBGrid e reescrever o método paint. No método Paint você usará a API do Windows SetScrollRange definindo o tamanho máximo e mínimo do scroll para zero (isto desabilitará a exibição da barra de scroll). E então acione o inherited paint para que o objeto novo possa ser desenhado. O código abaixo mostra uma Unit criada de uma instância do componente TDBGrid e que não possui a barra de rolagem vertical.
unit Newgrid;
Interface
uses
WinTypes, WinProcs, Classes, DBGrids;
type
TNoVertScrollDBGrid = class(TDBGrid)
protected
procedure Paint; override;
end;
procedure Register;
implementation
procedure TNoVertScrollDBGrid.Paint;
begin
SetScrollRange(Self.Handle, SB_VERT, 0, 0, False);
inherited Paint;
end;
procedure Register;
begin
RegisterComponents('Data Controls', [TNoVertScrollDBGrid]);
end;
end.
Voltar
--------------------------------------------------------------------------------
Movendo um formulário sem clicar na barra de título
É mais simples do que parece. Basta fazermos uma pequena alteração na procedure WMChitTest, que não é nada mais do que uma mensagem do Windows. Veja o exemplo abaixo:
unit MoveForm;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
private
procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest;
public
{public declarations}
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
inherited;
if M.Result = htClient then
M.Result := htCaption;
end;
end.
Voltar
--------------------------------------------------------------------------------
Desabilitando o Auto Play do CD-ROM
Você pode evitar a auto-execução de qualquer CD-ROM mantendo a tecla Shift pressionada ao fechar a gaveta do drive. Ou fazer as seguintes mudanças: Abra qualquer folder e selecione view, options, file types. Selecione AudioCD e click em Edit. Selecione Play da caixa de listagem, escolha SetDefault. Se Play estiver em negrito, o CD será executado quando for inserido, caso contrário, será será executado.
Voltar
--------------------------------------------------------------------------------
Acessando arquivos Paradox em Rede
Arquivos Paradox podem ser compartilhados em rede. Para que isto ocorra devemos :
1) Adicionar o DATABASE ENGINE CONFIGURATION (BDE CONFIG)
2) Selecionar a página DRIVERS
3) Selecionar o driver PARADOX e alterar o parâmetro NET DIR para o local onde serão gravados os arquivos de controle para compartilhamento. Por exemplo, "G:MEUAPLIC", onde G : corresponde ao drive de rede e MEUAPLIC, o diretório aonde está o aplicativo (executável)
4) Depois selecionar a página SYSTEM
5) Alterar o parâmetro LOCAL SHARE para TRUE. Após isto o BDE controlará o compartilhamento de arquivos PARADOX em rede.
Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009