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