Ir al contenido


Foto

[Delphi] Creando tu propio MessageDLG


  • Por favor identifícate para responder
1 respuesta en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 18 octubre 2016 - 11:18

Aquí vamos a aprender cómo podemos crear nuestro propio MessageDLG con sus botones traducidos, empecemos:
 
Debemos agregar en el uses las unidades System.TypInfo y System.UITypes.
 
Creamos una constante con los captions de los botones traducidos:


delphi
  1. const
  2. BotonesCaption: array[TMsgDlgBtn] of String = (
  3. 'Sí', 'No', 'OK', 'Cancelar', 'Abortar', 'Reintentar', 'Ignorar', 'Todos', 'No a Todo',
  4. 'Sí a Todo', 'Ayuda', 'Cerrar');

Declaramos las siguientes funciones:


delphi
  1. function StrToMsgBtn(aStr:String):TMsgDlgBtn;
  2. function MensajeDLG(const Msg: string; DLGCaption: string; DlgType: TMsgDlgType;
  3. Buttons: TMsgDlgButtons): Integer;

La función StrToMsgBtn de encarga de convertir un string en un valor enumerado:


delphi
  1. function StrToMsgBtn(aStr:String):TMsgDlgBtn;
  2. begin
  3. result := TMsgDlgBtn(GetEnumValue(TypeInfo(TMsgDlgBtn),aStr));
  4. end;

Y la función MensajeDLG es donde hacemos la magia, mostrar la ventana modal con su mensaje:


delphi
  1. function MensajeDLG(const Msg: string; DLGCaption: string; DlgType: TMsgDlgType;
  2. Buttons: TMsgDlgButtons): Integer;
  3. var
  4. i: Integer;
  5. dlgButton: TButton;
  6. CaptionIndex: TMsgDlgBtn;
  7. begin
  8. with CreateMessageDialog(Msg, DlgType, Buttons) do begin
  9. Caption := DLGCaption;
  10. for i := 0 to ControlCount - 1 do
  11. begin
  12. if (Components[i] is TButton) then
  13. begin
  14. dlgButton := TButton(Components[i]);
  15. CaptionIndex := StrToMsgBtn('mb'+dlgButton.Name);
  16. dlgButton.Caption := BotonesCaption[CaptionIndex];
  17. end;
  18. end;
  19. Result := ShowModal;
  20. end;
  21. end;

Su modo de uso sería:


delphi
  1. if MensajeDLG('¿Seguro deseas cerrar esta aplicación?','Aviso',[mbYes,mbNo]) = 6 then
  2. Close;

Espero lo disfruten.

 

Saludos.


  • 1

#2 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 18 octubre 2016 - 11:47

Hola, gran aporte
 
Solo un pequeño comentario, que es una recomendacion
 
Si bien es correcto tener una funcion MessageDlg "generica", lo mas aprpoiado es armarse un set de funciones mas especificas
 
Fijense la sentencia


delphi
  1. if MensajeDLG('¿Seguro deseas cerrar esta aplicación?','Aviso',[mbYes,mbNo]) = 6 then
  2. Close;

Tiene "cosas de mas". Por ejemplo, tengo que acordarme el = 6 que equivale a que el usuario eligio "Yes", tengo que pasar el conjunto de botones, incluir en el uses unidades donde estan las costantes definidas etc

 

Lo cierto es que si le estamos haciendo una pregunta al usuario, obtengamos tambien nosotros una respuesta Si/No --> un boolean

 

Entonces, lo logico seria tener una funcion por ej asi:


delphi
  1. // muestra un cuadro de dialogo con un Titulo "Title", y mensaje "Prompt"
  2. function PromptMsg(const Title, Prompt: string): Boolean;
  3.  
  4. // muestra un cuadro de dialogo con un Titulo "Title", y mensaje "Prompt". A Prompt se le aplica un Format(Prompt, Args)
  5. function PromptMsg(const Title: string; const Prompt: string; const PromptArgs: array of const): Boolean;

De este modo simplificamos el codigo anterior a:


delphi
  1. if PromptMsg('Aviso', 'Desea cerrar este programa?') then
  2. Close;

Luego es cuestion de seguir creando las distintas funciones que necesitamos, por ej: ErrorMsg, WarningMsg, InfoMsg, etc

 

Todas ellas estan implementadas usando la funcion que expone enecumene, pero nos sacamos de encima parametros aburridos y comparaciones "extrañas"


  • 2




IP.Board spam blocked by CleanTalk.