Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Cuadros de diálogo con botones personalizados

  • 1 Respuestas
  • 3646 Vistas

0 Usuarios y 3 Visitantes están viendo este tema.

Conectado ANTRAX

  • *
  • Administrator
  • Mensajes: 5499
  • Actividad:
    18.33%
  • Reputación 36
  • ANTRAX
    • Ver Perfil
    • Underc0de
    • Email
  • Skype: underc0de.org
  • Twitter: @Underc0de
« en: Febrero 24, 2010, 04:58:42 pm »
Unidad con cuatro funciones para cuadro de diálogo estándares pero con botones con texto propio (y algún que otro divague mío ;).

Testeado con Delphi 7 en WinXP.

Modo de uso:

Código: Delphi
  1. if MsgBox('Confirmación', '¿Formatear disco rígido?', mtWarning, ['Sí, formatear', '¡No, por Dios!'], 1) = 0 then
  2.     Formatear_Todo_El_Disco('C');
  3.  
  4.   if VolverAAvisar then
  5.     begin
  6.     if MsgBox( 'Confirmación', 'Se necesita crear un perfil por defecto.', mtInformation, ['Crear nuevo', 'Tengo uno guardado'],
  7.                'No volver a preguntar.', VolverAAvisar) = 0 then
  8.       CrearNuevoPerfil
  9.     else
  10.       CargarPerfilDeArchivo;
  11.     end
  12.   else
  13.     CrearNuevoPerfil;
  14.  
  15.   if MsgBox( 'Confirmación', 'Se va a rescunfunrear el índice maestro ahora.'+#13#10+'¿Estás seguro?', mtWarning,
  16.              ['Sí', 'No', '¿Eh? ¿Rescun qué?'], @LlamarAyuda) = 0 then
  17.     RescunfunrearIndice;

Código: Delphi
  1. unit CustomMsgBox;
  2.  
  3. interface
  4.  
  5. uses Dialogs;
  6.  
  7. type TMsgBoxCallBack= procedure;
  8.  
  9. // Muestra un cuadro de diálogo común.
  10. function MsgBox( const Titulo, Texto: string; TipoDialogo: TMsgDlgType; const Botones: array of string; Defecto: Integer = 0): integer; overload;
  11.  
  12. // Muestra un cuadro de diálogo y llama a una función callback al clickear el último botón.
  13. function MsgBox( const Titulo, Texto: string; TipoDialogo: TMsgDlgType; const Botones: array of string;
  14.                  CallBack: TMsgBoxCallBack; Defecto: Integer = 0): integer; overload;
  15.  
  16. // Muestra un cuadro de diálogo con una CheckBox.
  17. function MsgBox( const Titulo, Texto: string; TipoDialogo: TMsgDlgType; const Botones: array of string;
  18.                  const TituloCheckBox: string; var CBChecked: Boolean; Defecto: Integer = 0): integer; overload;
  19.  
  20. // Muestra un cuadro de diálogo con una CheckBox y con función callback.
  21. function MsgBox( const Titulo, Texto: string; TipoDialogo: TMsgDlgType; const Botones: array of string;
  22.                  const TituloCheckBox: string; var CBChecked: Boolean; CallBack: TMsgBoxCallBack; Defecto: Integer = 0): integer; overload;
  23.  
  24.  
  25. implementation
  26.  
  27. uses Forms, Windows, Classes, StdCtrls, ExtCtrls, SysUtils, Math, Graphics;
  28.  
  29. // Íconos estándares de cuadros de diálogo.
  30. const  IconIDs: array[TMsgDlgType] of PChar = (IDI_EXCLAMATION, IDI_HAND, IDI_ASTERISK, IDI_QUESTION, nil);
  31.  
  32. //Sonidos estándares de cuadros de diálogo.
  33. const Sonidos: array[TMsgDlgType] of integer = (MB_ICONEXCLAMATION, MB_ICONHAND, MB_ICONINFORMATION, MB_ICONQUESTION, MB_USERICON);
  34.  
  35. type TFormaDialogo=class(TForm)
  36.   protected
  37.     FBotonClickeado: Integer;
  38.     TipoDialogo: TMsgDlgType;
  39.     SePuedeCerrar: Boolean;
  40.     BotonCallBack: TComponent;
  41.     CallBack: TMsgBoxCallBack;
  42.     procedure PresTecla(Sender: TObject; var Key: Word; Shift: TShiftState);
  43.     procedure ClickBoton(Sender: TObject);
  44.     procedure Cerrar(Sender: TObject; var CanClose: Boolean);
  45.   public
  46.     constructor Create( const Titulo, Texto: string; TipoDialogo: TMsgDlgType; const Botones: array of string;
  47.                         CallBack: TMsgBoxCallBack = nil; Defecto: Integer = 0); reintroduce;
  48.     property BotonClickeado: Integer read FBotonClickeado;
  49.     function ShowModal: Integer; override;
  50. end;
  51.  
  52. { TFormaDialogo }
  53.  
  54. constructor TFormaDialogo.Create( const Titulo, Texto: string; TipoDialogo: TMsgDlgType; const Botones: array of string;
  55.                         CallBack: TMsgBoxCallBack = nil; Defecto: Integer = 0);
  56. var Etiqueta: TLabel;
  57.     Icono: TImage;
  58.     Boton: TButton;
  59.     AltoBotones, AnchoBotones, AnchoTotalBotones, Ind, Aux: Integer;
  60.  
  61. begin
  62.   inherited CreateNew(Application);
  63.   Self.TipoDialogo:= TipoDialogo;
  64.   OnKeyDown:= PresTecla;
  65.   OnCloseQuery:= Cerrar;
  66.   KeyPreview:= True;
  67.   Caption:= Titulo;
  68.   BorderStyle:= bsDialog;
  69.   Position:= poScreenCenter;
  70.   SePuedeCerrar:= False;
  71.  
  72.   AltoBotones:= 0;
  73.   AnchoBotones:= 0;
  74.   for Ind:= 0 to Length(Botones) - 1 do
  75.     begin
  76.     if Canvas.TextWidth(Botones[Ind]) > AnchoBotones then
  77.       AnchoBotones:= Canvas.TextWidth(Botones[Ind]);
  78.     if Canvas.TextHeight(Botones[Ind]) > AltoBotones then
  79.       AltoBotones:= Canvas.TextHeight(Botones[Ind]);
  80.     end;
  81.   AnchoBotones:= Max(AnchoBotones + 16, 75);
  82.   AltoBotones:= Max(AltoBotones + 8, 25);
  83.   AnchoTotalBotones:= Length(Botones) * (AnchoBotones + 8) - 8;
  84.  
  85.   Icono:= TImage.Create(Self);
  86.   with Icono do
  87.     begin
  88.     Parent := Self;
  89.     Picture.Icon.Handle := LoadIcon(0, IconIDs[TipoDialogo]);
  90.     SetBounds(11, 11, 32, 32);
  91.     end;
  92.  
  93.   Etiqueta:= TLabel.Create(Self);
  94.   with Etiqueta do
  95.     begin
  96.     Parent:= Self;
  97.     AutoSize:= True;
  98.     Caption:= Texto;
  99.     Left:= Icono.Left + Icono.Width + 16;
  100.     Top:= 16;
  101.     end;
  102.  
  103.  
  104.   ClientWidth:= Max(Etiqueta.Width + Etiqueta.Left + 16, 10 + AnchoTotalBotones + 10);
  105.   ClientHeight:= Max(Etiqueta.Height + Etiqueta.Top, Icono.Height + Icono.Top) + 16 + AltoBotones + 12;
  106.  
  107.   Aux:= ClientWidth div 2 - (AnchoTotalBotones) div 2;
  108.   for Ind:= 0 to Length(Botones) - 1 do
  109.     begin
  110.     Boton:= TButton.Create(Self);
  111.     with Boton do
  112.       begin
  113.       Parent:= Self;
  114.       Caption:= Botones[Ind];
  115.       Tag:= Ind;
  116.       OnClick:= ClickBoton;
  117.       Left:= Aux + (AnchoBotones + 8) * Ind;
  118.       Width:= AnchoBotones;
  119.       Top:= Max(Etiqueta.Height + Etiqueta.Top, Icono.Top + Icono.Height) + 16;
  120.       if Defecto = Ind then
  121.         ActiveControl:= Boton;
  122.       end;
  123.     end;
  124.   Self.CallBack:= CallBack;
  125.   if Assigned(CallBack) then
  126.     BotonCallBack:= Controls[ControlCount-1];
  127. end;
  128.  
  129. function TFormaDialogo.ShowModal: Integer;
  130. begin
  131.   MessageBeep(Sonidos[TipoDialogo]);
  132.   Result:= inherited ShowModal;
  133. end;
  134.  
  135. procedure TFormaDialogo.ClickBoton(Sender: TObject);
  136. begin
  137.   if (TComponent(Sender) = BotonCallBack) and Assigned(CallBack) then
  138.     CallBack
  139.   else
  140.     begin
  141.     FBotonClickeado:= TButton(Sender).Tag;
  142.     SePuedeCerrar:= True;
  143.     Close;
  144.     end;
  145. end;
  146.  
  147. procedure TFormaDialogo.PresTecla(Sender: TObject; var Key: Word; Shift: TShiftState);
  148. begin
  149.   if (Key = VK_F4) and (ssAlt in Shift) then
  150.     Key:= 0;
  151. end;
  152.  
  153. procedure TFormaDialogo.Cerrar(Sender: TObject; var CanClose: Boolean);
  154. begin
  155.   CanClose:= SePuedeCerrar;
  156. end;
  157.  
  158. {----------------------------------------------------------------------------------------------------------------------}
  159.  
  160.  
  161. function MsgBox(const Titulo, Texto: string; TipoDialogo: TMsgDlgType; const Botones: array of string; Defecto: Integer = 0): integer;
  162. var Dlg: TFormaDialogo;
  163. begin
  164.   if Length(Botones) = 0 then raise Exception.Create('MsgBox: Debe haber al menos un botón.');
  165.  
  166.   Dlg:= TFormaDialogo.Create(Titulo, Texto, TipoDialogo, Botones, nil, Defecto);
  167.   try
  168.     Dlg.ShowModal;
  169.     Result:= Dlg.BotonClickeado;
  170.   finally
  171.     Dlg.Free;
  172.   end;
  173. end;
  174.  
  175.  
  176. function MsgBox( const Titulo, Texto: string; TipoDialogo: TMsgDlgType; const Botones: array of string;
  177.                  CallBack: TMsgBoxCallBack; Defecto: Integer = 0): integer;
  178. var Dlg: TFormaDialogo;
  179. begin
  180.   if Length(Botones) < 2 then raise Exception.Create('MsgBox: Debe haber al menos dos botones.');
  181.  
  182.   Dlg:= TFormaDialogo.Create(Titulo, Texto, TipoDialogo, Botones, CallBack, Defecto);
  183.   try
  184.     Dlg.ShowModal;
  185.     Result:= Dlg.BotonClickeado;
  186.   finally
  187.     Dlg.Free;
  188.   end;
  189. end;
  190.  
  191.  
  192. function MsgBox( const Titulo, Texto: string; TipoDialogo: TMsgDlgType; const Botones: array of string;
  193.                  const TituloCheckBox: string; var CBChecked: Boolean; Defecto: Integer = 0): integer;
  194. begin
  195.   if Length(Botones) = 0 then raise Exception.Create('MsgBox: Debe haber al menos un botón.');
  196.  
  197.   Result:= MsgBox(titulo, Texto, TipoDialogo, Botones, TituloCheckBox, CBChecked, nil, Defecto);
  198. end;
  199.  
  200.  
  201. function MsgBox( const Titulo, Texto: string; TipoDialogo: TMsgDlgType; const Botones: array of string;
  202.                  const TituloCheckBox: string; var CBChecked: Boolean; CallBack: TMsgBoxCallBack; Defecto: Integer = 0): integer; overload;
  203. var Dlg: TFormaDialogo;
  204.     CB: TCheckBox;
  205. begin
  206.   if Assigned(CallBack) and (Length(Botones) < 2) then raise Exception.Create('MsgBox: Debe haber al menos dos botones.');
  207.  
  208.   Dlg:= TFormaDialogo.Create(Titulo, Texto, TipoDialogo, Botones, CallBack, Defecto);
  209.   CB:= TCheckBox.Create(Dlg);
  210.   try
  211.     with CB do
  212.       begin
  213.       Parent:= Dlg;
  214.       Left:= 8;
  215.       Top:= Dlg.ClientHeight;
  216.       Width:= Dlg.Width;
  217.       Caption:= TituloCheckBox;
  218.       Checked:= CBChecked;
  219.       end;
  220.     Dlg.Height:= Dlg.Height + CB.Height+8;
  221.     Dlg.ShowModal;
  222.     CBChecked:= CB.Checked;
  223.     Result:= Dlg.BotonClickeado;
  224.   finally
  225.     Dlg.Free;
  226.   end;
  227. end;
  228.  
  229. end.



« Última modificación: Abril 21, 2013, 12:57:29 pm por Expermicid »


Desconectado AD0

  • *
  • Underc0der
  • Mensajes: 2
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #1 en: Mayo 17, 2011, 07:56:13 pm »

 

¿Te gustó el post? COMPARTILO!