Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Botones personalizados en messagedlg (https://www.clubdelphi.com/foros/showthread.php?t=32446)

miguelml 06-06-2006 14:22:10

Botones personalizados en messagedlg
 
Hola!
Alguien sabe como se puede personalizar el caption de los botones de un messagedlg?
por ejemplo, un messagedlg que alsalir tenga dos botones que ponga "hola" "adios"

gracias!

dec 06-06-2006 15:09:00

Hola,

Hay una función en SwissDelphiCenter que puede venirte de perilla. Yo recuerdo que el compañero Román propuso una solución para este tema, y me pareció estupenda, pero, no he conseguido localizar el Hilo en cuestión. Lo mismo Román lee esto, se acuerda, y lo comenta.

En todo caso la función que enlazo arriba parece cumplir perfectamente. :)

Lepe 06-06-2006 16:25:41

Y en lugar de hacer todo eso...

¿No sería mejor hacer un Form con los botones que quieras y llamarlo con ShowModal?

En definitiva es lo que hace la rutina, pero no puedes darle un valor al caption mostrado en la barra de título. Ya puestos, construyes el Form al completo con parámetros más claros.

La rutina lo creas con mbOkCancel... vale 2 botones, pero ahora le cambias el título a pelo, despues en el código tienes que verificar que devuelve mrOk que se corresponde con el primer título, o sea en el ejemplo un "1", o bien mrCancel que se corresponde con el botón "2"... ¿uf que lío de cosas no?

Resulta más barato que devuelva, por ejemplo, el título del botón pulsado. Cuando el usuario pulsa en alguno de los botones personalizados, en tu Form pones ModalResult a mrOk, y en una propiedad que creas tú mismo en ese Form devuelves el título.

dec 06-06-2006 17:01:02

Hola,

Cita:

Empezado por Lepe
Y en lugar de hacer todo eso...

¿Qué eso? Se trata de una función, ¿no usas funciones en tus programas? :D

Cita:

Empezado por Lepe
¿No sería mejor hacer un Form con los botones que quieras y llamarlo con ShowModal?

Fíjate que la función de que hablamos devuelve, precisamente, el resultado de mostrar el diálogo como "modal". Lo digo porque...

Cita:

Empezado por Lepe
La rutina lo creas con mbOkCancel... vale 2 botones, pero ahora le cambias el título a pelo, despues en el código tienes que verificar que devuelve mrOk que se corresponde con el primer título, o sea en el ejemplo un "1", o bien mrCancel que se corresponde con el botón "2"... ¿uf que lío de cosas no?

¿De dónde sacas que la función compruebe lo que tiene que retornar basándose en el título de ningún botón? ¡Por eso es casi perfecta! ¡Porque devuelve justo lo que se espera que devuelva un "MessageDlg"!

Lo primero que he hecho al ver la función ha sido decirme, David, puede mejorarse (ja, ja, ja) y lo segundo que he pensado ha sido: ¿para qué utilizar el parámetro "buttons"? ¿porqué no crear los botones mediante los "Caption" que se pasan como parámetros?

He tardado un poco... casi me pongo a tratar de mejorar la función... hasta que me he dado cuenta que ese parámetro "buttons" tiene su quehacer, y que más vale dejarlo como está.

Como digo, la función enlazada más arriba devuelve justo lo que se espera que devuelva un "MessageBox", esto es, qué botón pulso el usuario: "mbCancel", "mbOK", "mbYes", etc. En ningún momento hace uso de los "Caption" de los botones para determinar el resultado, porque para eso tiene los botones, cada cual son su particular "constante" asociada.

En fin, Lepe, que creo, efectivamente, siempre puede hacerse uno su propio formulario para estos menesteres, pero, una cosa no quita la otra, y, personalmente, no veo nada complicada la manera de prodecer de la función de que hablamos.

Si alguien me demuestra otra cosa yo encantado, ¿eh? Que aquí hemos venido para aprender. :)

miguelml 06-06-2006 17:45:20

Si queria usar un messagedlg era precisamente para ahorrarme crear una form, y ahorrarme codigo, nosé, pensé que seria más facil, no obstante, gracias dec, e usado el codigo del link que me has pasado y me ha ido a la perfección, aunque e tenido que incluir un poco de codigo, pero weno, me ha ido bien.

un saludo!

Lepe 06-06-2006 21:42:35

Cita:

Empezado por Dec
¿De dónde sacas que la función compruebe lo que tiene que retornar basándose en el título de ningún botón? ¡Por eso es casi perfecta! ¡Porque devuelve justo lo que se espera que devuelva un "MessageDlg"!

No he pretendido decir eso.

Imagina que le paso 3 captions para los buttons:
- "Crear Nueva Factura"
- "Insertar en la Factura Actual"
- "Cancelar Proceso"

¿Qué botones asocio con cada una de esos títulos? ¿eh?, ¿eh?, ¿eh? :p

Prefiero que la rutina devuelva el texto, o una constante u otra cosa que aclare el código fuente; para no recordar que mrIgnore se corresponde con "Insertar en la Factura Actual".

Imagina que en mi programa creo 3 constantes:
Código Delphi [-]
const CREAR = "Crear Factura";
const INSERTAR = "Insertar en Factura Actual";
const CANCELAR = "Cancelar Proceso";
A tu rutina le paso las 3 constantes, y la función me devuelve el Caption de los botones. Fijate qué código tan fácil de leer:
Código Delphi [-]
var respuesta :string;
begin
respuesta =  MessageDlgPropio(¿Qué desea hacer con los productos seleccionados?, [CREAR, INSERTAR, CANCELAR]);

if respuesta = CREAR then
  // blah blah
else if respuesta = INSERTAR then
  // blah blah
else if respuesta = CANCELAR
  // blah blah

En programas pequeños no importa, pero cuando se trata de depurar o corregir un programa de 300.000 lineas de código, te aseguro que si importa esos pequeños detalles que te alejan de tu tarea principal (depurar o corregir), haciendo que pierdas tiempo viendo si el valor devuelto se corresponde con la lógica del programa.

Por supuesto es mi opinión, ni buena, ni mala, es una opinión más; de eso se trata al responder un hilo, compartir ideas y experiencias.

Saludos

dec 06-06-2006 22:07:28

Hola,

Pues mira que me estás convenciendo... Tal vez pudiera usarse la función que enlazé más arriba para mostrar diálogos hasta cierto punto predecibles, esto es, que contengan un par de botones, en definitiva, tal como se espera del "MessageDlg".

Ahora bien, ¿puede mejorarse el asunto? No lo dudo. Desde luego lo que dices parece muy razonable. :)

Lepe 07-06-2006 10:22:00

Como dije anteriormente, esa función es bastante limitada:
- Barra de título en inglés.
- Iconos bastante justitos (son 4, quizás basten)
- Habría que modificar también el Width de cada botón, para que se ajuste al texto pasado, si no, quedará truncado el texto.
- Ya puestos a modificar un Dialog de ese tipo, pues incluso se le pueden añadir negritas, subrayados y colores al texto, para hacerlo más "moderno". Hay muchos Labels que lo permiten.

Siempre se puede crear un Form para ese propósito y reutilizarlo en varios proyectos.

Que conste que lo pensé hace tiempo, pero seamos realistas, hace falta tiempo para hacerlo y un simple MessageBox "dá el avío" ;).

Saludos


La franja horaria es GMT +2. Ahora son las 09:42:33.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi