Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Texto cortado en MessageBox (https://www.clubdelphi.com/foros/showthread.php?t=82732)

doctorhd 08-04-2013 08:42:06

Texto cortado en MessageBox
 
Estimados, estoy desplegando un mensaje por pantalla utilizando Application.MessageBox, el tema es que el texto original se corta en 2 lineas, cuestión que no quiero que suceda. Investigando por ahí encontré que este es un comportamiento heredado del sistema operativo (win 7). Como puedo hacer para modificar este comportamiento.

Saludos.

ozsWizzard 08-04-2013 13:32:09

Supongo que si recorres el texto como si fuese un array y buscas los caracteres "13" y /o "10" y los quitas, o los reemplazas por un espacio, debería funcionar.

nlsgarcia 08-04-2013 17:18:29

doctorhd,

!!! Bienvenido al Club Delphi ¡¡¡

Cita:

Empezado por doctorhd
...desplegando un mensaje por pantalla utilizando Application.MessageBox, el tema es que el texto original se corta en 2 lineas...

Revisa este código:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
   i : Integer;
   Msg : String;
   
begin

   for i := 1 to 80 do
      Msg := Msg + IntToStr(i);

   MessageDlg(Msg,mtInformation,[mbOK],0);

   ShowMessage(Msg);

end;
El código anterior permite visualizar un Msg por pantalla sin ruptura de líneas con MessageDlg y ShowMessage.

Revisa esta información:
Cita:

Empezado por Delphi Help MessageBox method (TApplication):

...The value of the Text parameter is the message, which can be longer than 255 characters if necessary. Long messages are automatically wrapped in the message box

The value of the Caption parameter is the caption that appears in the title bar of the dialog box. Captions can be longer than 255 characters, but don't wrap. A long caption results in a wide message box...

Espero sea útil :)

Nelson.

Neftali [Germán.Estévez] 08-04-2013 17:38:29

Estaría bien que enseñaras cómo estás mostrando (código) el texto y cómo se está viendo.

doctorhd 08-04-2013 19:55:18

1 Archivos Adjunto(s)
Gracias a todos por sus respuestas y por la bienvenida. Respondiendo a:

Cita:

Empezado por nlsgarcia
Empezado por Delphi Help MessageBox method (TApplication):

...The value of the Text parameter is the message, which can be longer than 255 characters if necessary. Long messages are automatically wrapped in the message box

The value of the Caption parameter is the caption that appears in the title bar of the dialog box. Captions can be longer than 255 characters, but don't wrap. A long caption results in a wide message box...

La cantidad de caracteres que se despliegan es inferior a 255, tanto en el titulo como en el mensaje..

Cita:

Empezado por Neftali
Estaría bien que enseñaras cómo estás mostrando (código) el texto y cómo se está viendo.

Código:

.
.
const
    ConstNombreSistema: String = 'Sistema Prueba'; //Nombre sistema
    ConstVersionSistema: String = 'v1.0-2013';    //Version
    ConstNombreEmpresa: String ='Empresa Prueba';  //Empresa


resourcestring

    MsgRutaBDNoEncontrada='La ruta de acceso de la base de datos del sistema no ha sido encontrada, deberá ingresarla manualmente. ¿Desea efectuar esta operación?';

Implementation

Begin

    VarDescripcionSistema:= ConstNombreSistema + ' - ' + ConstVersionSistema + '...(' + ConstNombreEmpresa + ')';//Descripcion completa del sistema;

//Se informa al usuario que debe ingresar la ruta manualmente
    If Application.MessageBox(PWideChar(MsgRutaBDNoEncontrada), PWideChar(VarDescripcionSistema + MsgControlError), MB_YESNO + MB_DEFBUTTON1 + MB_ICONEXCLAMATION) = IDNO Then Begin
          .
          .
          .
    End //If

El mensaje desplegado es el siguiente:

ecfisa 08-04-2013 21:26:46

Hola doctorhd.

Application.MessageBox encapsula la la funcion MessageBox. La cantidad de caracteres por línea que muestra está predeterminada por el S.O. (acorde a la versión) y realizará el salto de línea de forma automática. No es posible alterar ese comportamiento.

En mi opinión, la solución que te resultará más versátil, es que realices tu propia función para presentar los mensajes; esto es muy sencillo de realizar usando un TForm mostrado de forma modal.

Saludos.

doctorhd 08-04-2013 22:05:30

ecfisa, estas seguro que no es posible modificar dicho comportamiento, mediando la misma API de Windows...

Saludos...

ecfisa 08-04-2013 22:44:10

Hola doctorhd.
Cita:

Empezado por doctorhd (Mensaje 458280)
ecfisa, estas seguro que no es posible modificar dicho comportamiento, mediando la misma API de Windows...

Saludos...

Hasta donde sé no es posible, nada dice al respecto la referencia de microsoft.

En este enlace, aunque de forma indirecta se habla del tema: Max. no. of characters in a message...
Y en este, al que hace referencia el anterior, hay un poco mas al respecto: MessageBox wrapping text...

Si existe alguna forma indocumentada de alterar el algorítmo original para lograr otro comportamiento, la ignoro.

Saludos.

nlsgarcia 09-04-2013 00:16:15

doctorhd,

Te sugiero considerar la solución propuesta en el Msg #6, la cual se adapta a la solución buscada. Otra opción sería implementar mensajes mas sucintos, para lo cual podrías seguir usando cualquiera de las opciones de visualización de mensajes de Delphi.

Espero sea útil :)

Nelson.

ecfisa 09-04-2013 01:46:22

Cita:

Empezado por nlsgarcia (Mensaje 458286)
Otra opción sería implementar mensajes mas sucintos, para lo cual podrías seguir usando cualquiera de las opciones de visualización de mensajes de Delphi.

Totalmente de acuerdo. ^\||/

Código Delphi [-]
...
const
 MSG = 'El programa no pudo encontrar la ruta a la base de datos.'
       +#10 + #10 + '¿ Desea ingresarla manualmente ?';
begin
  if Application.MessageBox(PChar(Msg),PChar('blabla...'), MB_YESNO+MB_ICONWARNING+MB_DEFBUTTON1) = IDNO then
    Application.Terminate;
  ...
Creo que mensajes similares a este tienen una presentación prolija y son lo suficientemente claros para el usuario.

Saludos. :)

Neftali [Germán.Estévez] 09-04-2013 10:15:02

Prueba un código como este, a ver si se acerca a lo que necesitas.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  res:TModalResult;
  AMsgDialog: TForm;
const
  MsgRutaBDNoEncontrada='La ruta de acceso de la base de datos del sistema no ha sido encontrada, deberá ingresarla manualmente. ¿Desea efectuar esta operación?';
begin
  // crear el mensaje
  AMsgDialog := CreateMessageDialog(MsgRutaBDNoEncontrada, mtWarning, [mbYes, mbNo]);
  // proteccion para liberar
  try
    // Añadir al mensaje el link
    AMsgDialog.Width := AMsgDialog.Width + 40;
    AMsgDialog.Caption := 'Sistema Prueva  - v1.02013...';
    // Visualizar la ventana
    res := AMsgDialog.ShowModal;
  finally
    FreeAndNil(AMsgDialog);
  end;
end;

Un saludo.

Neftali [Germán.Estévez] 09-04-2013 10:17:12

El resultado es algo así:



Aunque sinceramente, casi veo mejor el que has puesto tú...

ozsWizzard 09-04-2013 14:06:31

Entendí la pregunta fatal...

Aunque, como dicen por aquí, lo que mejor veo es formatear el mensaje, claro que así no te vale la constante...

Se puede hacer con varias constantes también, la parte de la pregunta, algo que va a ser muy estándar, puede ser una constante global por si misma.

Saludos

Al González 09-04-2013 19:26:21

Cita:

Empezado por Neftali (Mensaje 458301)
Aunque sinceramente, casi veo mejor el que has puesto tú...

+1 :) ^\||/


Hola doctorhd, no sé si hayas escuchado hablar de por qué el texto de los periódicos se imprime en columnas y no a todo lo ancho de la página:
Cita:

Además, con la división por columnas, la lectura resulta fácil y cómoda, pues sería mucho más monótono y cansino para la vista leer líneas de texto tan largas que ocupasen todo el ancho de una plana de periódico.
Esto, incluso, es una de las razones por las cuales no escribo código fuente más allá de la posición 75. :)

doctorhd 11-04-2013 23:26:56

Gracias a todos por su ayuda, finalmente implemente mi propia función para enviar mensajes al usuario y aunque tienen razón en que estéticamente no es aconsejable mostrar mensajes extensos en solo una linea, quería tener mas control sobre como se mostraba dicha información al usuario.


La franja horaria es GMT +2. Ahora son las 20:15:27.

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