Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Buscar un flag concreto en una combinación de ellos (MessageBox) (https://www.clubdelphi.com/foros/showthread.php?t=87613)

Neftali [Germán.Estévez] 30-01-2015 18:20:21

Buscar un flag concreto en una combinación de ellos (MessageBox)
 
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):

Código Delphi [-]
  // 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:

Código Delphi [-]
  procedure MensajeUsuario(AMsg, ATitle:PChar; AFlags:integer);

Supongo que debe haber algo como:

Código Delphi [-]
  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:
Código Delphi [-]
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... :)

Cita:

Empezado por Al González (Mensaje 488309)
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.

Cita:

Empezado por Al González (Mensaje 488309)
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

Cita:

Empezado por Neftali (Mensaje 488324)
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:
Código Delphi [-]
  If ghShowMsg ('Confirmar', '¿Desea guardar el archivo?', mb_YesNo) = IDYes Then
presentará una ventana con el icono MB_ICONQUESTION, mientras que
Código Delphi [-]
  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

Cita:

Empezado por Caminante (Mensaje 488327)
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
Cita:

Empezado por Neftali (Mensaje 488302)
...
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.
Código:

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 :)


La franja horaria es GMT +2. Ahora son las 11:51:58.

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