Dicas InfoInt

 

Assunto: Delphi

Dica 01

No Microsoft® Windows®, existe uma tabela do sistema chamada 'atom table'. Esta tabela armezena strings com seus correspondentes identificadores. Existem várias funções da API do windows, chamadas de 'atom functions', que permitem que uma aplicação insira, apague, procure por uma determinada 'atom string', etc. O código abaixo garante que somente uma instância do executável de sua aplicação estará carregado em memória. O form1 seria o formulário principal da aplicação:

------ Inicio --------
procedure TForm1.FormCreate(Sender: TObject);
begin
   {Procura na tabela para verificar se o programa já está rodando}

   {Substitua a string 'MINHA STRING' por uma de sua conveniência}
   if GlobalFindAtom('MINHA STRING') = 0 then {zero significa não encontrar}
      atom := GlobalAddAtom('MINHA STRING')
   else
   begin
      {Se o programa já estiver rodando, então mostrar a mensagem e parar}
      MessageDlg('A aplicação já encontra-se em execução!!', mtWarning, 
                 [mbOK], 0);
      Halt;
   end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
   {Remove o item da tabela, de modo que a aplicação possa ser executada
    novamente}
   GlobalDeleteAtom(atom);
end;

------ Fim da Dica 01 --------

Dica 02

Enviando Caracteres Diretamente ao Buffer da Impressora:
Ao trabalharmos com impressão, em certos casos desejamos alterar o comportamento da impressora.
Algumas opções, principalmente em impressoras matriciais, são obtidas através do envio dos chamados "códigos de escape" para a impressora (por exemplo, alterar espaçamento entre as linhas (#45), tipo de fonte (#18, #23), etc). Em versões 16-bit do Windows, isso não era complicado, mas agora, nas versões 32-bit, o acesso direto ao hardware não é mais possível.
Portanto, para enviarmos caracteres diretamente a impressora, devemos utilizar o "escape" chamado "PASSTHROUGH" do Windows e enviarmos a informação desejada diretamente. Na documentação do Win32 SDK este escape é dado como obsoleto, mas enquanto utilizarmos impressoras matriciais que necessitem de "códigos escape" para certas funcionalidades, ele será necessário.
Ao utilizar impressoras Postscript tenha cuidado, pois nem sempre esta técnica irá funcionar. Em impressoras matriciais, você pode enviar qualquer tipo de caracteres que achar necessário.
Abaixo segue um código exemplificando o envio de uma string qualquer diretamente ao buffer da impressora.

------ Inicio --------
uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   StdCtrls;

type
   TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
end;

var
   Form1: TForm1;

implementation

{$R *.DFM}

   uses Printers;

type
{ Tipo requerido pelo PASSTHROUGH }
TBufferImpressora = record
TamanhoBuffer: Word;
Buffer: array [0..255] of Char;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   Buff: TBufferImpressora;
   TestePasstrough: Integer;
   strFoo: string;
begin
   { Primeiro devemos checar se o "escape" PASSTHROUGH é suportado. 
     Para isso, executamos a função "Escape" passando o QUERYESCSUPPORT.
     Caso o driver suporte, ela irá retornar um valor maior que 0 }
   TestePasstrough := PASSTHROUGH;
   if Escape(Printer.Handle, QUERYESCSUPPORT, SizeOf(PASSTHROUGH), 
             @TestePasstrough, nil) > 0 then
   begin
      { Inicializamos o driver }
      Printer.BeginDoc;
      { Informaçao qualquer a enviar diretamente para a impressora }
      strFoo := 'Passthrough string';
      { Copia da string para a estrutura }
      StrPCopy(Buff.Buffer, strFoo);
      { Indicamos o tamanho da informação }
      Buff.TamanhoBuffer := StrLen(Buff.Buffer);
      { Enviamos o "escape" }
      Escape(Printer.Canvas.Handle, PASSTHROUGH, 0, @Buff,nil);
      { Descarregamos... }
      Printer.EndDoc;
   end;
end;

end.

------ Fim da Dica 02 --------

Dica 03

Obtendo o número serial do HD.

------ Inicio --------
Function SerialNum(FDrive:String) :String;
var
   Serial, DirLen, Flags: DWord;
   DLabel : Array[0..11] of Char;
begin

   try
      GetVolumeInformation(PChar(FDrive+':\'),dLabel,12,@Serial,DirLen,Flags,
        nil,0);
      Result := IntToHex(Serial,8);
   except
      Result := '';
   end;

end;

------ Fim da Dica 03 --------

 

 

Home Soluções Dicas InfoInt Linux Fale Conosco