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