Si eres, o has sido, programador Delphi, seguramente te has encontrado muchas aplicaciones donde se utiliza la función Showmessage, MessageBox o Messagedlg o incluso todas a la vez de manera desorganizada y no unificada.
En este truco/post os voy a mostrar como organizar vuestros mensajes de aplicación en una única unidad y como personalizarlos con vuestros propios iconos sin necesidad de crear formularios específicos para ellos.
Mi recomendación es que utilicéis siempre MessageBox, por dos motivos:
- MessageBox es una función de la Api de Windows, por tanto, los textos de los botones estarán localizados al idioma del sistema.
- Permite una mayor personalización y control de los mensajes mostrados.
En toda aplicación suelen utilizarse, al menos, tres tipos de mensajes de diálogo con el usuario; Mensajes de error, mensajes de aviso y mensajes de pregunta.
Mi recomendación es que os creéis una unidad donde agrupéis todos esos mensajes de manera que podáis utilizarlos en toda la aplicación, por ejemplo algo así:
unit UDialogos;
interface
uses Windows;
procedure MensajeError(owner: HWND; p_texto :string);
procedure MensajeAviso(owner: HWND; p_texto :string);
function Pregunta(owner: HWND; p_texto, p_titulo: string) : boolean;
implementation
procedure MensajeError(owner: HWND; p_texto :string);
begin
MessageBox(owner, pchar(p_texto), 'Error',
MB_ICONERROR or MB_OK or MB_TASKMODAL)
end;
procedure MensajeAviso(owner: HWND; p_texto :string);
begin
MessageBox(owner, pchar(p_texto),'Aviso',
MB_ICONINFORMATION or MB_OK or MB_TASKMODAL )
end;
function Pregunta(owner: HWND; p_texto, p_titulo: string) : boolean;
begin
result := MessageBox(owner, pchar(p_texto), pchar(p_titulo),
MB_ICONQUESTION or MB_YESNO or MB_TASKMODAL) = IDYES
end;
end.
De esta manera tendremos todos los mensajes localizados en una unidad de nuestra aplicación y a nuestra disposición para cuando los necesitemos.
Es importante utilizar correctamente el parámetro "owner" de esas funciones y pasárles siempre el "Handle" del formulario que llama a la función ("Self.Handle") para que los diálogos sepan delante de quién deben mostrarse.
Si no os gustan los iconos por defecto que muestra Windows, siempre podéis utilizar los vuestros utilizando "MB_USERICON", pero en este caso deberéis utilizar la función MessageBoxIndirect.
Supongamos que tenemos un icono en los recursos de nuestra aplicación llamado 'ICONICO' y que queremos mostrarlo en un mensaje de dialogo concreto, escribiríamos lo siguiente:
procedure MensajePersonalizado(owner: HWND; p_texto, p_titulo :string);
var
flags : uint;
MsgPars: TMsgBoxParams;
begin
flags := MB_USERICON or MB_OK or MB_DEFBUTTON1 or MB_TASKMODAL;
//Establecemos los parámetros
with MsgPars do
begin
cbSize := SizeOf(MsgPars);
hwndOwner := owner;
hInstance := Sysinit.hInstance;
lpszText := PChar(p_texto);
lpszCaption := pchar(p_titulo );
dwStyle := flags;
lpszIcon := 'ICONICO'; //Nuestro icono en los recursos
dwContextHelpId := 0;
lpfnMsgBoxCallback := nil;
dwLanguageId := LANG_NEUTRAL;
end;
MessageBoxIndirect(MsgPars);
end;
Si tienes cualquier duda o comentario recuerda que puedes exponerlo aquí o bien mediante nuestro twitter y facebook.
0 comentarios:
Publicar un comentario