Hei,
que tal fazer um display digital só para dar "aquele"
recado? Moleza? Bem, ralamos pedra britada para conseguir,
mas o resultado até que ficou interessante.
Nosso objetivo
era criar um daqueles displays de fila de banco e que é
muito usado em lojas, para fazer propagandas, anunciar promoções,
descontos, etc. Será o nosso display digital.
A solução
que adotamos é bem simples: cria-se uma matriz de
letras, que pode ser uma TImage monocromática,
com todas as letras que serão usadas. Para o arquivo
não ficar muito grande, usamos somente as letras
maiúsculas e eliminamos os caracteres anteriores
ao código ASCII 32 e os caracteres
entre as letras acentuadas.
Criamos mais
uma TImage de 32 x 48 apenas para servir
como matriz de apagamento do display. Ela simula as "lâmpadas"
apagadas e serve para "zerar" um caracter nulo ou o caracter
espaço.
O processo
de animação propriamente dito é o mais
simples possível: sobreposição total
de elementos. A cada movimento da mensagem um caracter (à
esquerda) é descartado e um apontador reinicia a
impressão. A velocidade de impressão é
determinada pelo intervalo de ocorrência do evento
OnTimer.
Gastamos um
pouco mais de processamento para a correta identificação
dos caracteres acentuados, afinal a língua mãe
precisa ser respeitada e como não fomos nós
os inventores do computador....
A seguir mostro
apenas a procedure principal, do evento OnTimer, que é
a responsável pela animação do display.
procedure TForm1.Timer1Timer(Sender: TObject);
var
HTelao, HLetras,HGaba: HBitmap;
Loc: byte;
Carac: byte;
begin
if Status > 0 then begin
HTelao:= Telao.Canvas.Handle;
HLetras:= Letras.Canvas.Handle;
HGaba:= Gaba.Canvas.Handle;
//Define os Handles das imagens
for Loc:= 0 to 18 do begin
//São 19 caracteres na área de display
BitBlt(HTelao,(Loc*32)+2,2,32,48,HGaba,0,0,SRCCOPY);
//Primeiro apaga a área de um caracter
Carac:= 0;
if Msg[Pos+Loc] = '!' then Carac:= 1;
if Msg[Pos+Loc] = '(' then Carac:= 2;
if Msg[Pos+Loc] = ')' then Carac:= 3;
if Msg[Pos+Loc] = '&' then Carac:= 4;
if Msg[Pos+Loc] = '#' then Carac:= 5;
if Msg[Pos+Loc] = '$' then Carac:= 6;
if Msg[Pos+Loc] = '+' then Carac:= 7;
if Msg[Pos+Loc] = '-' then Carac:= 8;
if Msg[Pos+Loc] = '.' then Carac:= 9;
if Msg[Pos+Loc] = ',' then Carac:= 10;
if Msg[Pos+Loc] = '<' then Carac:= 11;
if Msg[Pos+Loc] = '>' then Carac:= 12;
if Msg[Pos+Loc] = '"' then Carac:= 23;
if Msg[Pos+Loc] = '@' then Carac:= 24;
if Msg[Pos+Loc] = '?' then Carac:= 25;
if (Msg[Pos+Loc] >= 'A') and (Msg[Pos+Loc] <= 'Z')
then Carac:= ord(Msg[Pos+Loc])-39;
if (Msg[Pos+Loc] >= '0') and (Msg[Pos+Loc] <= '9')
then Carac:= ord(Msg[Pos+Loc])-35;
if Msg[Pos+Loc] = 'Ç' then Carac:= 52;
if Msg[Pos+Loc] = 'Ü' then Carac:= 53;
if Msg[Pos+Loc] = 'À' then Carac:= 54;
if Msg[Pos+Loc] = 'Á' then Carac:= 55;
if Msg[Pos+Loc] = 'É' then Carac:= 56;
if Msg[Pos+Loc] = 'Í' then Carac:= 57;
if Msg[Pos+Loc] = 'Ó' then Carac:= 58;
if Msg[Pos+Loc] = 'Ú' then Carac:= 59;
if Msg[Pos+Loc] = 'Â' then Carac:= 60;
if Msg[Pos+Loc] = 'Ê' then Carac:= 61;
if Msg[Pos+Loc] = 'Ô' then Carac:= 62;
if Msg[Pos+Loc] = 'Ã' then Carac:= 63;
if Msg[Pos+Loc] = 'Õ' then Carac:= 64;
//Define a coordenada x do caracter na matriz
BitBlt(HTelao,(Loc*32)+2,2,32,48,HLetras,
(Carac*32),0,SRCPAINT);
//Coloca o caracter na posição
end;
dec(Status);
//Diminui até terminar os caracteres
inc(Pos);
//Avança uma posição - à esquerda
Telao.Repaint;
end;
end;
Clique
no link abaixo e você poderá baixar o fonte
completo e mais as imagens usadas para montar o display.
Incremente à vontade, mudando a matriz de caracteres,
as velocidades da animação, etc.