PDA

Ver la Versión Completa : Buscar un flag concreto en una combinación de ellos (MessageBox)


Neftali [Germán.Estévez]
30-01-2015, 18:20:21
Buenas a todos.
Seguro que es una tontería, pero la verdad es que no lo he hecho nunca y no es algo que domine, así que a ver si los que sabéis me podéis dar la pista.

Tengo una llamada, por ejemplo, como esta (la parte importante es la del final):


// parámetros similares a MessageBox
MensajeUsuario(PChar(Mensaje1), PChar(Titulo1), MB_ICONSTOP or MB_OK or MB_APPLMODAL);
MensajeUsuario(PChar(Mensaje1), PChar(Titulo1), MB_ICONERROR or MB_OK or MB_APPLMODAL);
...


El control llega al procedimiento MensajeUsuario, y me gustaría saber el tipo de icono que se ha seleccionado.
Es decir, cual de los siguientes valores se ha pasado en el tercer parámetro (siempre irá uno de los siguientes):


MB_ICONEXCLAMATION
MB_ICONWARNING
MB_ICONINFORMATION
MB_ICONASTERISK
MB_ICONQUESTION
MB_ICONSTOP
MB_ICONERROR
MB_ICONHAND


La llamada tiene la siguiente cabecera:


procedure MensajeUsuario(AMsg, ATitle:PChar; AFlags:integer);


Supongo que debe haber algo como:


if (MB_ICONEXCLAMATION in AFlags) then
...


Un saludo.

Al González
30-01-2015, 18:58:52
Hola Germán. :)

El operador In sólo trabaja con conjuntos.

AFlags es de tipo numero entero, por lo cual hay que recurrir a una típica verificación de bits:
Icono := AFlags And mb_IconMask; // Obtenemos la bandera de icono contenida en AFlags
Nota que la API de Windows incluye la constante MB_ICONMASK (máscara de bits de posibles iconos), fundamentalmente con ese propósito.

Un saludo.

Neftali [Germán.Estévez]
30-01-2015, 20:14:27
Hola Al.
Gracias por contestar. Ya sabía yo que para tí esto sería fácil... :)


El operador In sólo trabaja con conjuntos.


Si, si,... Era para poner un ejemplo de cómo podría ser. Se que no se puede utilizar en ese contexto.


AFlags es de tipo numero entero, por lo cual hay que recurrir a una típica verificación de bits...


Lo pruebo...

Gracias.

Caminante
30-01-2015, 20:51:37
Hola Al.
Ya sabía yo que para tí esto sería fácil... :)


Yo tambien lo sabia ^\||/

Al González
30-01-2015, 21:05:44
Aprovechando el tema. Tal vez quieras echarle un vistazo a algunas funciones de GH Freebrary que van por esta línea.

Por ejemplo:
If ghShowMsg ('Confirmar', '¿Desea guardar el archivo?', mb_YesNo) = IDYes Then
presentará una ventana con el icono MB_ICONQUESTION, mientras que
If ghShowMsg ('Confirmar', '¡No ha salvado los cambios! ¿Guardar?', mb_YesNo) = IDYes Then
presentará una ventana con el icono MB_ICONEXCLAMATION.

ghShowMsg verifica si el mensaje de texto mismo contiene el signo de exclamación o el signo de interrogación para determinar el icono a usar.

La sugerencia es por si te sirve este material para enriquecer las ideas de lo que estás haciendo.

Un cordial saludo. :)

Al.

Al González
30-01-2015, 21:12:51
Yo tambien lo sabia ^\||/
Varios halagos en pocos días; mi cumpleaños fue hace tiempo. Sospecho que ya apareció el verdadero asesino de Kennedy. :p

ecfisa
31-01-2015, 02:00:37
Hola Germán

...
El control llega al procedimiento MensajeUsuario, y me gustaría saber el tipo de icono que se ha seleccionado.
Es decir, cual de los siguientes valores se ha pasado en el tercer parámetro (siempre irá uno de los siguientes):


MB_ICONEXCLAMATION
MB_ICONWARNING
MB_ICONINFORMATION
MB_ICONASTERISK
MB_ICONQUESTION
MB_ICONSTOP
MB_ICONERROR
MB_ICONHAND

...

Recién leo la consulta, y veo que vas a tener un problema al tratar de discriminar algunos de esos valores. El único unívocamente identificable es MB_ICONQUESTION.

MB_ICONERROR 0x00000010L
MB_ICONSTOP 0x00000010L
MB_ICONHAND 0x00000010L
-------------------------------
MB_ICONQUESTION 0x00000020L
-------------------------------
MB_ICONEXCLAMATION 0x00000030L
MB_ICONWARNING 0x00000030L
-------------------------------
MB_ICONINFORMATION 0x00000040L
MB_ICONASTERISK 0x00000040L


Saludos :)