Buscar

Acessando paradox em rede

Código

DICAS DE DELPHI

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

Publicidade

Vote na dica




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes da dica

Categoria: Banco de dados
Adicionada dia: 26/04/05
Por: Miguel Machado
Visualizada: 8364 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009