segunda-feira, 11 de abril de 2011

Conectado banco firebird pelo arquivo ini

Dica de como se conectar no banco interbase ou firebird, através de configurações de um arquivo ini.

var
vArqIni:TIniFile;
Caminho:string;
begin
   Caminho:='C:Automacao ComercialBancoAUTOMACAO.FDB';
   DataModulo.conexao.Close;
   if not( fileexists(extractfilepath(ParamStr(0))+'Automacao.ini') ) then begin
      ShowMessage('Arquivo de Configurações do Banco de Dados Não Encontrado!');
      vArqIni := TIniFile.Create(extractfilepath(ParamStr(0))+'Automacao.ini');
      try
        conexao.ConnectionName:='BANCO';
        vArqIni.WriteString('BANCO','database',Caminho);
        conexao.Params.Values['DataBase'] :=Caminho;
      finally
        vArqIni.Free;
      end;
   end;

   try
     vArqIni := TIniFile.Create(extractfilepath(ParamStr(0))+'Automacao.ini');
     conexao.ConnectionName:='BANCO';
     Caminho :=vArqIni.ReadString('BANCO','database',Caminho);
     conexao.Params.Values['DataBase'] :=Caminho;
   finally
     vArqIni.Free;
   end;

   try
     DataModulo.conexao.Connected:=True;
     DataModulo.VChamada:=0;
     DataModulo.spsusuarios.Close;
     DataModulo.spsusuarios.Open;
     DataModulo.UserControl.Execute;
   except
     Application.MessageBox( 'Não foi possivel se conectar com o banco de dados.' + #13 +
     'verifique se o arquivo de configuração está configurado, ' + #13 +
     'ou se o servidor firebird está instalado em seu sistema.' + #13 +
     'Verifique tambem se o Usuario secundario esta cadastrado.' + #13 +
     'Entre em contato com suporte para esclarecer qualquer dúvida.',
     'Error Interno', mb_ok + mb_IconError );

   Application.Terminate;
end;

Testa conectividade com internet

Essa Rotina verifica se o computador está conectado a internet usando a API do Windows. Para usar essa funcionalidade, é preciso declarar a uses WinInet.

var
flags : DWORD;
begin

   if not InternetGetConnectedState(@flags, 0) then
      MessageBox(handle, 'Você não está conectado a internet! ', mb_Ok + mb_IconWarning);
   
end;

Adicionar SQL em rotina Delphi

Atenção pessoal que está iniciando na programação Delphi com Interbase ou Outro banco. Para adicionar consulta tipo:

DataModule.Tabela.SQL.add('Texto '+variavel+'Texto'+variavel)
Onde a variável é alfa tem que ser feito conforme a seguir:
DataModule.Tabela.SQL.add('Select * from Table '''+variavel+'''Texto'''+variavel)
Perceberam as tres aspas? Muita gente já arrancou os cabelos antes de descobrir isso.

sábado, 9 de abril de 2011

Nomes dos arquivos que estão sendo executados:

É comum e até relativamente fácil encontrarmos rotinas para listar todas as janelas abertas. Mas muitas vezes não é apenas o caption das janelas que queremos listar e sim o nome do arquivo executável.

Veja então uma rotina que cria uma lista de strings com esses nomes:

uses TLHelp32; // não esqueça de incluir esta unit
procedure ListProcess(List: TStrings);
var
  ProcEntry: TProcessEntry32;
  Hnd: THandle;
  Fnd: Boolean;
begin
  List.Clear;
  Hnd := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
  if Hnd <> -1 then
  begin
  ProcEntry.dwSize := SizeOf(TProcessEntry32);
  Fnd := Process32First(Hnd, ProcEntry);
  while Fnd do
  begin
  List.Add(ProcEntry.szExeFile);
  Fnd := Process32Next(Hnd, ProcEntry);
  end;
  CloseHandle(Hnd);
  end;
end;
E para utilizar esta rotina é muito simples, veja:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ListProcess(ListBox1.Items);
end;

Programar meu aplicativo para abrir arquivos a partir do Windows Explorer

Inclua na seção uses: Registry

Problema:
Criei um editor de textos no Delphi. Agora gostaria que o Windows Explorer usasse este editor para abrir arquivos com a extensão .dpg e .dan. Como fazer?

Solução:
Para fazer isto será necessária a criação de algumas chaves no Registro do Windows. O exemplo abaixo cria todas as chaves necessárias.

- Coloque um TButton e no evento OnClick dele coloque o código abaixo:

procedure TForm1.Button1Click(Sender: TObject);
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
  Reg.RootKey := HKEY_CLASSES_ROOT;
  Reg.LazyWrite := false;
  { Define o nome interno (ArquivoDaniel) e uma legenda que aparecerá no Windows Explorer (Arquivo do Daniel) }
  Reg.OpenKey('ArquivoDaniel', true);
  Reg.WriteString('', 'Arquivo do Daniel');
  Reg.CloseKey;
{ Define o comando a ser executado quando abrir um arquivo pelo Windows Explorer (NomeDoExe %1). O símbolo %1 indica que o arquivo a ser aberto será passado como primeiro parâmetro para o aplicativo - ParamStr(1). }
  Reg.OpenKey('ArquivoDaniel\shell\open\command', true);
  Reg.WriteString('', ParamStr(0) + ' %1'); { NomeDoExe %1 }
  Reg.CloseKey;
  { Define o ícone a ser usado no Windows Explorer:
  0 - primeiro ícone do EXE
  1 - segundo ícone do EXE, etc }
  Reg.OpenKey('ArquivoDaniel\DefaultIcon', true);
  Reg.WriteString('', ParamStr(0) + ',0'); { 0 = primeiro ícone }
  Reg.CloseKey;
  { Define as extensões de arquivos que serão abertos pelo meu aplicativo }
  { *.dpg }
  Reg.OpenKey('.dpg', true);
  Reg.WriteString('', 'ArquivoDaniel');
  Reg.CloseKey;
  { *.dan }
  Reg.OpenKey('.dan', true);
  Reg.WriteString('', 'ArquivoDaniel');
  Reg.CloseKey;
  finally
  Reg.Free;
  end;
end;
- Coloque um TMemo;

- No evento OnShow do Form coloque o código abaixo:

procedure TForm1.FormShow(Sender: TObject);
begin
  { Se o primeiro parâmetro for um nome de arquivo existente... }
  if FileExists(ParamStr(1)) then
  { Carrega o conteúdo do arquivo no memo }
  Memo1.Lines.LoadFromFile(ParamStr(1));
end;
*** Para testar ***

- Execute este programa;

- Clique no botão para criar as chaves no Registro do Windows;

- Feche o programa;

- Crie alguns arquivos com as extensões .dpg e .dan;

- Vá ao Windows Explorer e procure pelos arquivos criados;

- Experimente dar um duplo-clique sobre qualquer dos arquivos com uma das extensões acima.

Observações

Existem outros recursos que poderão ser configurados. Porém, para começar, este já é um bom exemplo.  

terça-feira, 5 de abril de 2011

Formatando a visualização do tamanho de um arquivo

Fonte: www.activedelphi.com.br

Quando se trabalha com arquivos no Delphi pode ser necessário exibir o tamanho de um arquivo, como é feito no Explorer, onde o valor não é mostrado em bytes, mas sim de acordo com o seu tamanho atual. Para a maioria, "45.678.123 Bytes" é confuso, mas "43,56 MB" não!
A seguir, temos uma função chamada FormatByteSize, que converte um valor em bytes para uma String que representa o número expressado em Bytes, Kilobytes Megabytes ou Gigabytes, dependendo do seu tamanho:

//Formata o tamanho de um arquivo
function FormatByteSize(const bytes: Longint): string;
const
  B = 1; //byte
  KB = 1024 * B; //kilobyte
  MB = 1024 * KB; //megabyte
  GB = 1024 * MB; //gigabyte
begin
  if bytes > GB then
    result := FormatFloat('#.## GB', bytes / GB)
  else
    if bytes > MB then
      result := FormatFloat('#.## MB', bytes / MB)
    else
      if bytes > KB then
        result := FormatFloat('#.## KB', bytes / KB)
      else
        result := FormatFloat('#.## bytes', bytes) ;
end;
Para usá-la, basta fazer no evento onClick de um button, por exemplo:

procedure TForm1.Button1Click(Sender: TObject);
var
  TamanhoEmBytes: Longint;
begin
  with TFileStream.Create(
    'C:\Windows\System32\calc.exe',
    fmOpenRead or fmShareExclusive)
  do try
    TamanhoEmBytes := Size;
  finally
    Free;
  end;

  ShowMessage( FormatByteSize(TamanhoEmBytes) );
end;

domingo, 3 de abril de 2011

Verificando as impressoras pela rede e sabendo se elas estão online


Como verificar quais são as impressoras da rede e se elas estão On-line Com essa dica eu ajudei no fórum esta semana o Ronaldo, mas creio que como artigo, devo conseguir ajudar mais. Em vários projetos, saber se a impressão será efetuada com sucesso, e se a impressora estiver em rede e o computador que ela estiver ligada estiver sendo reiniciado, por exemplo, ou houver algum problema com a rede, talvez seja melhor dar um aviso ao usuário e esperar que ele regularize a situação antes de efetuar a impressão...
Com esta rotina abaixo, você consegue efetivamente tanto em Windows 98 quanto em Xp, obter uma resposta confiável da impressora. 

function VerImpressoraONLINE: Cardinal;
var
  hPrinter  : THandle;
  pInfo:  PPrinterInfo2;
  bytesNeeded: DWORD;
begin
  hprinter := GetCurrentPrinterHandle;
  try
    Winspool.GetPrinter( hPrinter, 2, Nil, 0, @bytesNeeded );
    pInfo := AllocMem( bytesNeeded );
    try
      Winspool.GetPrinter( hPrinter, 2, pInfo, bytesNeeded, @bytesNeeded );
       Result := pInfo^.Status;
    finally
      FreeMem( pInfo );
    end;
  finally
    ClosePrinter( hPrinter );
  end;
end;


se o resultado for > 0 então a impressora tem algum tipo de problema.
If VerImpressoraONLINE > 0
   then ShowMessage('A Impressora está OFFLINE, impressão ficará no aguardo' + #13 +  'Chame o Suporte Técnico para verificar a Impressora' );
 Para verificar quais são as impressoras da sua rede, teste da seguinte forma:
 var  ts : TStrings;
      J, K, I : Integer;
begin
    TS := Printer.Printers;
    K := Printer.PrinterIndex;
           J := -1;
           For I := 0 to TS.Count -1
               do If uppercase(copy(TS.Strings[I],1,7)) = 'EPSON'
                     then J := I;
           If J = -1
              then begin
                     ShowMessage('Impressora do estoque não configurada');
                     Exit;
              end
              else begin
                     Printer.PrinterIndex := J;
                     If VerImpressoraONLINE > 0
                        then ShowMessage('A Impressora EPSON está OFFLINE, impressão ficará no aguardo' + #13 +  'Chame o Suporte Técnico para verificar a Impressora' );
           end;

Curso de Delphi: 7.Consultas SQL