Quarta-feira, Fevereiro 23, 2005

Obtendo as portas conectadas às impressoras do sistema

Um leitor perguntou uma maneira de se obter as portas conectadas às impressoras do computador. Uma maneira de fazer isso é usar a função EnumPrinters, que enumera as impressoras e preenche estruturas com informações das impressoras.
Esta função lista as portas disponíveis no sistema:


procedure TForm4.FormCreate(Sender: TObject);
var
i : Integer;
Flags, Count, NumInfo: DWORD;
Buffer : String;
PrinterInfo : PChar;
begin
Flags := PRINTER_ENUM_CONNECTIONS or PRINTER_ENUM_LOCAL;
EnumPrinters(Flags, nil, 5, nil, 0, Count, NumInfo);
if Count = 0 then
Exit;
SetLength(Buffer, Count);
if not EnumPrinters(Flags, nil, 5, PByte(Buffer), Count, Count, NumInfo) then
Exit;
PrinterInfo := PChar(Buffer);
for i := 0 to NumInfo - 1 do begin
with PPrinterInfo5(PrinterInfo)^ do
Listbox1.Items.Add(String(pPortName));
Inc(PrinterInfo,Sizeof(TPrinterInfo5));
end;
end;

Terça-feira, Fevereiro 22, 2005

Novo utilitário meu na PCMagazine

Foi lançado meu mais novo utilitário na PCMagazine: RegistryMaster (http://www.pcmag.com/article2/0,1759,1768130,00.asp). Este é um utilitário para edição do registro do Windows, com algumas vantagens sobre o Regedit:


  • Permite desfazer edições no registro - ele guarda todo o histórico de alterações feitas

  • Permite pesquisas muito rápidas e completas, inclusive usando expressões regulares. Estas pesquisas podem ser salvas para HTML, Excel ou CSV

  • Permite copiar chaves do registro de um lugar a outro

O utilitário foi todo escrito em Delphi 2005, vale a pena conferir. O download é feito por assinatura, que custa US$ 20 por ano, permitindo baixar todos os utilitários que estão lá e os que serão lançados no período de 1 ano (neste caso, confiram meus outros utilitários - ZipHunter - pesquisa texto dentro de arquivos contidos em arquivos zip, WMatch - compara diretórios lado a lado, WinPointer - congela a tela atual e permite desenhar nela, além de permitir gravar um AVI com toda a operação, FileSnoop - um super visualizador de arquivos e QuickAssociation - muda as associações entre as extensões de arquivos e os executáveis no Windows. Todos eles são 100% escritos em Delphi).

Segunda-feira, Fevereiro 14, 2005

Help de contexto no Delphi 2005

Até o Delphi 7, para criar um help de contexto (ajuda para um componente ao teclar F1), bastava preencher a propriedade HelpContext com um número diferente de 0 e, no arquivo de ajuda, colocar o mesmo número no tópico de ajuda.
Isto funcionava sem probelmas até o Delphi 7. Porém, ao fazer isso no Delphi 2005, encontrei um problema: ao teclar F1, o Delphi gerava uma exceção do tipo EHelpSystemException.
O que acontece neste caso é que o Delphi não tem mais um sistema de help padrão, e podem ser criados sistemas de help alternativos, para outros tipos de help, como help em CHM. Para voltar ao comportamento anterior, devemos incluir a unit que faz o tratamento para WinHelp do novo Delphi, WinHelpViewer na cláusula Uses. Com isto, tudo volta ao normal.

Sexta-feira, Fevereiro 11, 2005

Copiando uma pasta com subdiretórios no Delphi

Um leitor do blog perguntou como copiar uma pasta com subdiretórios no Delphi. Temos diversas maneiras de fazer isso:


  • Usando a Api do Windows

  • Usando funções do Delphi


Nesta postagem, iremos ver a maneira fácil de fazer isso: com a Api do Windows. A outra maneira fica para uma outra postagem.
Para copiar um diretório e suas subpastas usando a Api do Windows, usamos a função ShFileOperation, definida em ShellApi.pas. Ela recebe apenas um parâmetro, do tipo TShFileOpStruct, uma estrutura contendo as informações de cópia (na realidade, esta função permite também outras operações de arquivos, como exclusão ou movimentação). Basta preencher a estrutura e chamar a função. Assim, poderíamos criar uma função CopiaDirs assim:

function CopiaDirs(DirFonte,DirDest : String) : Boolean;
var
ShFileOpStruct : TShFileOpStruct;
begin
Result := False;
if DirFonte = '' then
raise Exception.Create(
'Diretório fonte não pode ficar em branco');
if DirDest = '' then
raise Exception.Create(
'Diretório destino não pode ficar em branco');
if not DirectoryExists(DirFonte) then
raise Exception.Create('Diretório fonte inexistente');
DirFonte := DirFonte+#0;
DirDest := DirDest+#0;
FillChar(ShFileOpStruct,Sizeof(TShFileOpStruct),0);
with ShFileOpStruct do begin
Wnd := Application.Handle;
wFunc := FO_COPY;
pFrom := PChar(DirFonte);
pTo := PChar(DirDest);
fFlags := FOF_ALLOWUNDO or FOF_SIMPLEPROGRESS or
FOF_NOCONFIRMATION;
end;
ShFileOperation(ShFileOpStruct);
end;

Esta função copia um diretório e seus subdiretórios para o diretório de destino