Mostrando todas as letras
Monte seu próprio letreiro, para aquele placar especial

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.

O display, construído também como uma TImage, possui uma área de impressão de 608 x 48 pixels. Cada letra é definida dentro de uma matriz de 32 x 48 pixels, o que equivale a dizer que na área do display poderão ser vistos 19 caracteres por vez, da mensagem.

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.


Download...
Clique no link para fazer o download dos arquivos. Se sua assinatura do club TILT está para vencer, clique aqui e saiba como renová-la.

Fontes completos do exemplo da matéria
 
online