Alterando o visual
Como alterar os componentes standard do Delphi
e criar um TRichEdit com fundo transparente

O Delphi é uma ótima ferramenta de desenvolvimento, seja você um programador de jogos ou não. Com uma interface limpa, linguagem simples e uma lista de componentes de dar inveja, não fica atrás de nenhuma solução de programação.

Mas tudo que é bom pode ficar ainda melhor, portanto esse artigo vai expôr como um programador experiente pode melhorar os componentes nativos do Delphi alterando seu código fonte e, de quebra, vamos criar um novo RichEdit que mostra seu texto sobre qualquer figura de fundo.


O código fonte da VCL

Em suas versões mais recentes o Delphi permite a instalação do código fonte da VCL (sua lista de componentes) para que os programadores em geral possam otimizá-la em seus trabalhos. Portanto, o primeiro passo para alterá-la é verificar se esses arquivos estão ou não presentes.

Por padrão, as instalações completa (full) e personalizada (custom) copiam os arquivos fonte necessários. Eles são copiados para o subdiretório "source", dentro da pasta principal do Delphi. O arquivo que será alterado durante este artigo tem o nome "comctrls.pas" localizado na pasta "source\vcl", portanto, caso ele não exista altere a instalação do Delphi para conter os arquivos necessários.

Com todas as ferramentas à mão, podemos começar o trabalho.

Alterando o código fonte

Alterar a VCL não poderia ser mais fácil. O único setup necessário antes de fazê-lo é adicionar o diretório "$(DELPHI)\Source\Vcl" no caminho de busca do(s) projeto(s) que usaram as modificações feitas. Dessa maneira é possível selecionar quais projetos usarão os componentes modificados e quais permanecerão com os componentes normais.

A inclusão desse diretório é feita na caixa de opções do projeto (menu "Project"->"Options"), dentro da aba "Directories/Conditionals". Na opção "Search Path" simplesmente adicione o diretório especificado. A partir deste ponto, todas as alterações em qualquer um dos arquivos do subdiretório "Source\VCL" do Delphi terão efeito sobre os componentes usados no projeto.

As novas versões do RichEdit

A borland literalmente parou no tempo com os RichEdits. Desde sua primeira versão (1.0) para o windows 95, a Microsoft lançou três atualizações desse controle para as novos lançamentos de seu sistema operacional, no entanto o Delphi continua atrasado com sua implementação original. Mas isso vai mudar em um momento.

A versão do controle utilizada é determinada pela DLL carregada no momento de sua criação. Para ativar as funções mais novas é preciso, portanto, alterar o código do RichEdit nativo do Delphi para utilizar uma biblioteca mais nova. A seguinte tabela indica a versão do controle e a respectiva DLL que precisa ser carregada para utilizá-lo:

Versão DLL
1.0 Riched32.dll
2.0 Riched20.dll
3.0 Riched20.dll
4.1 Msftedit.dll

A função que desejamos implementar (transparência) está presente na versão 2.0 do controle, portanto será usada a biblioteca "riched20.dll".

Alterando o código

Tendo descoberto o que é preciso para implementar a transparência tudo o que falta é alterar o código da VCL. Apenas uma função precisa ser alterada em um arquivo, corrigindo três linhas de código. O arquivo é o já citado "comctrls32.pas" localizado no subdiretório do Delphi "source\vcl". A função que será alterada é a TRichEdit.CreateParams e as únicas modificações que precisam ser feitas são: alterar a constante que identifica o nome da DLL carregada (de "RICHED32.DLL" para "RICHED20.DLL"); alterar a chamada ao método CreateSubClass para "CreateSubClass(Params, RICHEDIT_CLASS);" e finalmente, adicionar o estilo "WS_EX_TRANSPARENT" ao controle. A função final fica a seguinte:

procedure TCustomRichEdit.CreateParams(var Params:
                                          TCreateParams);
const
  RichEditModuleName = 'RICHED20.DLL';
  HideScrollBars: array[Boolean] of DWORD = 
                                   (ES_DISABLENOSCROLL, 0);
  HideSelections: array[Boolean] of DWORD = 
                                   (ES_NOHIDESEL, 0);
begin
  if FRichEditModule = 0 then begin
    FRichEditModule := LoadLibrary(RichEditModuleName);
    if FRichEditModule <= HINSTANCE_ERROR then
                                    FRichEditModule := 0;
  end;
  inherited CreateParams(Params);
  CreateSubClass(Params, RICHEDIT_CLASS);
  with Params do begin
    Style := Style or HideScrollBars[FHideScrollBars] or
             HideSelections[HideSelection];
    WindowClass.style := WindowClass.style and not
                               (CS_HREDRAW or CS_VREDRAW);
    ExStyle:= ExStyle or WS_EX_TRANSPARENT;
  end;
end;

Demonstrando

E agora, ao teste. Em um novo projeto, adicione o diretório de procura como já foi explicado. Adicione um componente TImage e um TRichEdit (colocando-o sobre a imagem). Carregue na TImage uma imagem qualquer (o logo da TILT funciona muito bem) e no evento OnCreate do formulário principal coloque:

  RichEdit1.brush.style:= bsClear;

Pronto! Memo transparente gastando apenas uns cinco minutos de sua atenção. Para o melhor efeito possível desligue as bordas do memo (propriedade BorderStyle com o valor bsNone) e ajuste a cor da fonte para ter um bom contraste com a figura.

Divirta-se com esse novo componente e não esqueça de nos mostrar seus resultados.


 
online