Você está na página 1de 10

Delphi XE6 - Como criar uma caixa de dilogo

personalizada
Ol amigos do The Club, neste artigo irei apresentar uma maneira fcil de criar e customizar as
caixas de dilogos no Delphi XE6. No Delphi j temos pronto diversos tipos de caixas de dilogo, como por
exemplo: a ShowMessage, Application.MessageBox ou a MessageDLG. Todas elas nos proporcionam
alguns recursos interessantes, mas como todo programador, sempre sentimos a necessidade de
implementao de novos recursos. Todo o funcionamento ir se basear na criao de um formulrio padro
junto com uma classe, a qual ir montar toda a estrutura necessria.
Criando a Caixa de Mensagem
Clique em File/New/VCL Form Delphi para criarmos um formulrio desde o incio. Sugiro alterar
algumas propriedades deste formulrio, de acordo com a tabela 01 abaixo.

Propriedades

Valores

BorderStyle

bsDialog

BorderIcons

[]

Caption

Mensagem

ClientHeight

222

color

clBtnFace

Font

Calibri

Position

poScreenCenter

Tabela 01: Propriedades do FrmMensagem.

Dentro deste mesmo formulrio iremos adicionar 3 Panels, sendo: pnlIcones (Para agrupar os cones
utilizados), pnlMensagem (Para adicionar a mensagem informativa) e pnlBotoes (Para adicionar os botes
OK, Sim e No). Ver Imagem 01.

Imagem 01: Configuraes do Formulrio FrmMensagem.

Ver
abaixo
Item (1) - pnlIcones:

as

tabelas

com

Propriedades

todas

as

configuraes

detalhadas.

Valores

Align

alLeft

Alignment

taLeftJustify

BevelOuter

bvNone

Height

178

Width

70

Tabela 02: Propriedade do pnlIcones.

Dentro do pnlIcones devemos inserir 5 componentes do Tipo Timage e na sequencia adicionar os


principais cones. Deveremos alterar a propriedade Name de todos para: imgDeletar, imgCuidado,
imgQuestao, imgErro e ImgInformacao. As propriedades de tamanho e largura devero ser respeitadas de
acordo com a tabela 03.

Propriedades

Height

Valores

35

Width

50

Tabela 03: propriedades dos Timages.

Item (2): pnlMensagem.

Propriedades

Valores

Align

alClient

Alignment

taCenter

BevelOuter

bvNone

BorderWidth

10

Height

178

Width

280

Tabela 03: Propriedade do pnlMensagem.

J no pnlMensagem adicionaremos apenas um Label (lblMensagem) para a Mensagem Informativa.


Item (3): pnlBotoes
No ltimo painel iremos inserir trs BitBtn, sendo: Ok, Sim e No. Ver Tabela 04.

Propriedades

Valores

Align

alBottom

Alignment

taCenter

BevelOuter

bvLowered

Height

44

Width

350

Tabela 04: Propriedade do pnlBotoes.

Segue tambm algumas configuraes necessrias para realizar nos BitBtns.

Propriedades

Valores

Default

True

Height

38

ModalResult

mrNo

Visible

False

Width

75

Tabela 05: Boto OK.

Propriedades

Valores

Caption

&Sim

Height

38

ModalResult

mrYes

Visible

False

Width

75

Tabela 06: Boto Sim.

Propriedades

Valores

Caption

&No

Height

38

ModalResult

mrNo

Visible

False

Width

75

Tabela 06: Boto Sim.

O Formulrio FrmMensagem dever ficar idntico ao da Figura 02.

Figura 02: Formulrio Finalizado.


Codificando o formulrio FrmMensagem
importante salientar que iremos utilizar uma Class Funcion para referenciar o mtodo
Mensagem (O qual ir criar nossa caixa de dilogo). Este tipo de classe no se faz necessrio a criao de

uma instncia, ou seja, podemos apenas fazer a utilizao direta do mtodo em questo. Detalharei melhor
a seguir.
O primeiro passo seria criar um Tipo (type) para armazenar os botes (Sim, No, e Ok). Esta
codificao normalmente se localiza logo acima do Tipo (TfrMensagem), a classe do formulrio.
Type
TMeusBotoes

Type

(mbSim,

mbNao,

TFrmMensagem

mbOk);

class(TForm)

......
Criaremos tambm uma class function Mensagem como pblica. Classes deste tipo no
necessitam de instncia, que encaixam perfeitamente no nosso tipo de utilizao. Temos trs parmetros,
sendo respectivamente: O texto informativo que ir aparecer na caixa de mensagem, uma varivel char que
identifica o tipo da Mensagem e o Array do type TMeusBotoes (tem como tarefa criar as rotinas conforme os
botes escolhidos.
Private
{ Private declarations }
Public
{ Public declarations }
class function Mensagem(Texto:
Boolean;

String;

Tipo:

Char;

Botoes:

array

of

TMeusBotoes):

end;
A constante LEFTBUTTONS ir permitir uma realocao dos botes (Sim, No e Ok) no formulrio
pela propriedade Left. J a constante TITULO ir entitular a caixa de dilogo.
const
LEFTBUTTONS:
array[0..2]
of
TITULO: String = 'The Club';
Var
FrmMensagem: TFrmMensagem;
Implementation
{$R *.dfm}
class function TFrmMensagem.Mensagem(Texto:
TMeusBotoes):
var
i:
frm
begin

frm

integer

String;

Tipo:

(258,

Char;

178,

Botoes:

97);

array of
Boolean;

Integer;
:TFrmMensagem;

:=

TFrmMensagem.Create(nil);

try
frm.lblMensagem.Caption
frm.Caption
for i:=0
begin

to

:=

:=

Texto;
TITULO;

Length(Botoes)-1
case (Botoes[i])

end;

end;

frm.BtnOK.Visible
frm.BtnOK.Left
frm.btnSim.Visible
frm.btnSim.Left

:=
:=
:=
:=

do
of
mbOk: begin
True;
LEFTBUTTONS[i];
mbSim: begin
True;
LEFTBUTTONS[i];

end;
else begin
end;

frm.BtnNao.Visible
frm.BtnNao.Left
frm.BtnOK.Visible
frm.BtnOK.Left

mbNao: begin
True;
LEFTBUTTONS[i];

:=
:=
:=

True;
LEFTBUTTONS[i];

:=

end;

end;
frm.imgInformacao.top
frm.imgDeletar.top
frm.imgQuestao.top
frm.imgCuidado.top
frm.imgErro.top
case (Tipo)
frm.imgInformacao.Visible
frm.imgDeletar.Visible
frm.imgQuestao.Visible
frm.imgCuidado.Visible
frm.imgErro.Visible

'I':
'D':
'Q':
'C':
'E':
else

end;

mrYes
result

4;
4;
4;
4;
4;
of
True;
True;
True;
True;
True;

:=
:=
:=
:=
:=

frm.imgInformacao.Visible

frm.ShowModal;
case (frm.ModalResult)
mrOk,
else
end;
finally
if (frm<>nil)

:=
:=
:=
:=
:=

:=

result
:=

True;
end;
:=

of
True;
False;

then
FreeAndNil(frm);
end;

Iremos instanciar a classe TfrmMensagem, passando como parmetro o nil. Logo em seguida
faremos um try/catch para atribuir o ttulo na propriedade Caption e a Mensagem Informativa passada por
parmetro no componente lblMensagem. Faremos um Case para receber o retorno do array botes
para ir setando como Visvel ou no e os realocando na tela conforme a propriedade Left (utilizada pela
constante LEFTBUTTONS). Na prxima etapa do cdigo, atravs da propriedade TOP dos componentes
TImage, deixaremos as mesmas alinhadas logo no incio do formulrio. O parmetro tipo ir nos orientar
e habilitar qual imagem dever ficar visvel conforme a necessidade (I= Informativa, D= Deletar, Q=
Questionamento, C=Cuidado, E=Erro). O mtodo frm.ModalResult ir nos retornar como true ou false
para tratarmos na funo mais adiante. Para finalizar liberaremos o frm da memria atravs do mtodo
FreeAndNil.
Testando a Caixa de Dilogo
Para isto crie um projeto do incie e insira alguns botes, tais como: Information, Question, Warning,
Delete, Error e Sign Out. Ver Lay-Out na Imagem 03.

Figura 03: Testando a caixa de dilogo.

Devemos declarar a unit Umensagens. O uso da classe TfrmMensagem muito simples pelo fato
de no precisarmos instanciar nenhum objeto. Devemos apenas passar como parmetros os seguintes itens:
O
Texto,
o
Tipo
e
os
botes.
uses Umensagens;
Exemplo de Mensagem do tipo Informativa.
procedure TForm2.Button1Click(Sender:
begin
TFrmMensagem.Mensagem('Esta

uma
end;

TObject);
Mensagem

de

Information!','I',[mbOk]);

Exemplo de Mensagem do tipo Conclusiva.


procedure TForm2.Button3Click(Sender:
begin
TFrmMensagem.Mensagem('Esta

end;

TObject);
uma

Mensagem

de

Warning!','C',[mbOk]);

Exemplo de Mensagem de Erro.


procedure TForm2.Button5Click(Sender:
begin
TFrmMensagem.Mensagem('Esta

end;

TObject);
uma

Todas as telas sero idnticas ao da Imagem 04.

Mensagem

de

Error!','E',[mbOk]);

Figura 04: Mensagem Informativa.


seguir.

Quando necessitamos receber o retorno de nossa class Funcion, podemos seguir os exemplos a
Exemplo de Mensagem para Excluso.

procedure TForm2.Button4Click(Sender:
TObject);
begin
if (TFrmMensagem.Mensagem('Deseja
excluir
o
registro?','D',[mbSim,
mbNao])) then
TFrmMensagem.Mensagem('Voc
clicou
em
SIM!','I',[mbOk])
else
TFrmMensagem.Mensagem('Voc
clicou
em
NO!','I',[mbOk]);
end;
Exemplo de Mensagem do tipo Questionativa.
procedure TForm2.Button2Click(Sender:
TObject);
begin
if (TFrmMensagem.Mensagem('Esta uma Mensagem de Question!','Q',[mbSim, mbNao])) then
TFrmMensagem.Mensagem('Voc
clicou
em
SIM!','I',[mbOk])
else
TFrmMensagem.Mensagem('Voc
clicou
em
NO!','I',[mbOk]);
end;
Outro Exemplo de Mensagem Questionativa, para encerramento da aplicao.
procedure TForm2.Button6Click(Sender:
begin
if (TFrmMensagem.Mensagem('Deseja encerrar
end;

TObject);
a

aplicao?','Q',[mbOK, mbNao])) then


Application.Terminate;

Ressaltando que todas as telas sero idnticas ao da Imagem 05.

Figura 05: Mensagem Questionativa.

Concluses
Neste ms procurei abordar um assunto solicitado em nosso suporte tcnico. Todo projeto que
desenvolvemos, sempre temos a necessidade de fazer o uso de caixas de dilogos. Procurei neste artigo
criar uma classe bsica para personalizao deste recurso. Impostante lembrar que apesar de ser
desenvolvido no Delphi XE6, foram testados nas verses anteriores com sucesso. Fica a a dica, um forte
abrao e at o ms que vem!

Você também pode gostar