Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-02-2012
Avatar de lmpadron
lmpadron lmpadron is offline
Miembro
 
Registrado: feb 2009
Ubicación: Habana, Cuba
Posts: 204
Poder: 16
lmpadron Va por buen camino
como usar el BalloonTip

Hola amigos

en este post Chris me indica que use BalloonTip en ves de mensajes de dialogo y realmente cuando lo piensas tiene toda la razón, como ese post se había abierto por otra razón entonces abro este con la siguiente pregunta

Como uso el BalloonTip en c++ builder ?

Busque en internet y no encontré mucho excepto algunos ejemplo de como implementarlo sobre el TryIcon y aquí en el club no hay ningún post en c++ que trate el tema. Chris posteo un ejemplo pero esta escrito en Delphi y no he podido encontrar la forma de hacerlo en c++.

Cita:
Empezado por Chris Ver Mensaje
Este sería el código Delphi para implementar lo que te digo:
Código Delphi [-]
procedure Form1.Edit1OnKeyPress(var Key: Char);
var
    BalloonTip: _tagEDITBALLOONTIP;
begin
    if (B > C) then
    begin
        Key := 0; // no aceptar el caracter ingresado
        
        // mostrar un mensaje sutíl al usuario 
        // indicandole que el problema.
        BalloonTip.cbStruct := SizeOf(BalloonTip);
        BalloonTip.pszTitle := 'B es mayor que C';
        BalloonTip.pszText := 'TODO: EXPLICAR POR QUE B NO PUEDE SER MAYOR QUE C';
        BalloonTip.ttiIcon := 4;

        SendMessage(Edit1.Handle,
                    EM_SHOWBALLOONTIP,
                    0,
                    Integer(@BalloonTip));        
    end;
end;

Tienes que agregar a la sección uses la unidad CommCtrl para hacer uso de los BalloonTips de Windows.

¿Alguien que pueda traducir este código?

Saludos!

Gracias de antemano por su ayuda
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código.


Cuando miras fijamente al abismo, este te devuelve la mirada


oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_
oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_
oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_
oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_
oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_
ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_
________________________________________________________________________________
Responder Con Cita
  #2  
Antiguo 23-02-2012
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Puedes consultar este hilo en CodeGuru http://www.codeguru.com/forum/showthread.php?t=478992 está en inglés.

Además, la API de Windows tiene un macro llamado Edit_ShowBalloonTip. Lee la documentación oficial. Talvez te ayuda a realizarla http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Saludos!
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #3  
Antiguo 23-02-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Impadron.

No he usado los BalloonTip ni en Delphi ni en Builder C++. La primera traducción que intenté no me resultó:
Código:
typedef struct tagEDITBALLOONTIP {
    DWORD cbStruct;
    LPCWSTR pszTitle;
    LPCWSTR pszText;
    INT ttiIcon;
} EDITBALLOONTIP, *PEDITBALLOONTIP;

void __fastcall TForm1::Button1Click(TObject *Sender) {
EDITBALLOONTIP ebt;
  ebt.cbStruct = sizeof(EDITBALLOONTIP);
  ebt.pszTitle = (wchar_t *)"B es mayor que C";
  ebt.pszText  = (wchar_t *)"TODO: EXPLICAR POR QUE B NO PUEDE SER MAYOR QUE C";
  ebt.ttiIcon  = TTI_INFO;
  SendMessage(Edit1->Handle, EM_SHOWBALLOONTIP, 0, (LPARAM) &ebt);
}
Sin embargo, de este modo logré el efecto:
Código:
void ShowBalloonTip(TWinControl *Control,int  Icon, char *Title,  char *Text, 
  TColor BackColor, TColor TextColor) {
HWND hWndTip;
TOOLINFO ti;
HWND hWnd;
TPoint p;
  p.x = Control->Left + Control->Width - 5;
  p.y = Control->Top + 5;
  Mouse->CursorPos = Control->Parent->ClientToScreen(p);
  hWnd    = Control->Handle;
  hWndTip = CreateWindow(TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_NOPREFIX | 
    TTS_BALLOON | TTS_ALWAYSTIP, 0, 0, 0, 0, hWnd, 0, HInstance, NULL);
  if( hWndTip ) {
    SetWindowPos(hWndTip, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE | 
      SWP_NOMOVE | SWP_NOSIZE);
    ti.cbSize = sizeof(ti);
    ti.uFlags = TTF_CENTERTIP | TTF_TRANSPARENT | TTF_SUBCLASS;
    ti.hwnd = hWnd;
    ti.lpszText = Text;
    GetClientRect(hWnd, &ti.rect);
    SendMessage(hWndTip, TTM_SETTIPBKCOLOR, BackColor, 0);
    SendMessage(hWndTip, TTM_SETTIPTEXTCOLOR, TextColor, 0);
    SendMessage(hWndTip, TTM_ADDTOOL, 1, (int) &ti);
    SendMessage(hWndTip, TTM_SETTITLE, Icon % 4, (int)Title);
  }
}

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key) {
 if (Key < '0' || Key > '5') {  // evaluación trivial
  ShowBalloonTip(Edit1, 1, "ERROR", "Sólo números del 0 al 5", clYellow, clBlack);
  Key = 0;
  }
}
...
Aunque dada mi inexperiencia con los BalloonTip, seguramente te darán una mejor propuesta.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 24-02-2012 a las 02:32:12.
Responder Con Cita
  #4  
Antiguo 23-02-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por lmpadron Ver Mensaje
en este post Chris me indica que use BalloonTip en ves de mensajes de dialogo y realmente cuando lo piensas tiene toda la razón, como ese post se había abierto por otra razón entonces abro este con la siguiente pregunta
A ver, yo no entiendo. De por sí los globitos me parecen un recurso horroroso y no sé por qué quieres cotejar lo que se escribe contra un valor en cada tecla que se oprime. ¿Por qué no simplemente dejas que el usuario introduzca el número, apriete un botón y si no cumple los requisitos le presentas un cuadro modal. Sí, modal. Los cuadros modales tienen su razón de ser: evitar que se pueda hacer otra cosa hasta no cumplirse otra: en este caso, parar el proceso hasta que no se tenga un valor correcto.

A menos, claro, que el valor no tenga importancia, y el proceso pueda seguir sin estar correcto.

Por otra parte, aún suponiendo que de verdad necesitas cotejar mientras se escribe, basta que pongas un Label a un lado del Edit con una pequeña indicación mientras no se cumpla el requisito:

Código:
[           84] (el valor es mayor que 10)
// Saludos
Responder Con Cita
  #5  
Antiguo 23-02-2012
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Cita:
Empezado por roman Ver Mensaje
A ver, yo no entiendo. De por sí los globitos me parecen un recurso horroroso y no sé por qué quieres cotejar lo que se escribe contra un valor en cada tecla que se oprime. ¿Por qué no simplemente dejas que el usuario introduzca el número, apriete un botón y si no cumple los requisitos le presentas un cuadro modal. Sí, modal. Los cuadros modales tienen su razón de ser: evitar que se pueda hacer otra cosa hasta no cumplirse otra: en este caso, parar el proceso hasta que no se tenga un valor correcto.
El problema de los cuadros Modales es que requieren de la Intervención del Usuario. Por lo menos hacer clic sobre "OK", apretar Alt+F4, apretar Esc o tirar la computadora por la ventana . Los BalloonTips no requiren ese tipo de interacción, por lo cual son menos intrusivos. Igual, al asignar Key := 0 en el evento OnkeyPress ya no deja al usuario continuar cuando algo está mal.

Mostrar un BalloonTip sobre el campo que está dando el problema y en el momento que se da el problema es como cuando te registras en un servicio web y el campo de "nombre de usario" te dice si ese nombre está disponible mientras lo vas escribiendo. Es algo mucho más usable y amigable con el usuario. ¿No te parecería incomodo un formulario de varias páginas, que al completar la última te diga que dejaste algo mal colocado en la primera?

Otro de los problemas con los MessageBox es que los usuarios no los leen.

Saludos!
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #6  
Antiguo 23-02-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Chris Ver Mensaje
El problema de los cuadros Modales es que requieren de la Intervención del Usuario.
Pero es que esto no es un problema sino una característica. Justamente para eso están, para requerir la intervención del usuario.

Cita:
Empezado por Chris Ver Mensaje
Mostrar un BalloonTip sobre el campo que está dando el problema y en el momento que se da el problema es como cuando te registras en un servicio web y el campo de "nombre de usario" te dice si ese nombre está disponible mientras lo vas escribiendo.
Es una opción, pero yo en particular no usaría un globo.

Cita:
Empezado por Chris Ver Mensaje
Es algo mucho más usable y amigable con el usuario. ¿No te parecería incomodo un formulario de varias páginas, que al completar la última te diga que dejaste algo mal colocado en la primera?
Hombre, aquí ya estás hablando de otra cosa. Y, de entrada, quizá el sistema no debió dejarlo avanzar de página, si había datos incorrectos. Pero en aplicaciones de escritorio, no es tan común tener formularios de varias páginas, y si los hay, entonces puedes validar en cada cambio.

Cita:
Empezado por Chris Ver Mensaje
Otro de los problemas con los MessageBox es que los usuarios no los leen.
Y, ¿por qué sí habrían de leer los globitos?

Yo creo que aquí estamos más bien hablando de dos estrategias de validación de datos: validar en cada campo o validar todos los campos al final. Y no creo que inherentemente una sea mejor que otra.

Como tú lo propones, creo, sería por ejemplo mantener inhabilitado el botón OK mientras los datos no estén todos correctos. De todas maneras, los globos son demasiado distractores para mi gusto.

// Saludos
Responder Con Cita
  #7  
Antiguo 23-02-2012
Avatar de lmpadron
lmpadron lmpadron is offline
Miembro
 
Registrado: feb 2009
Ubicación: Habana, Cuba
Posts: 204
Poder: 16
lmpadron Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
Sin embargo, de este modo logré el efecto:
Pues de ese modo definitivamente se logra sin problemas

Cita:
Empezado por Chris Ver Mensaje
(...) al asignar Key := 0 en el evento OnkeyPress ya no deja al usuario continuar cuando algo está mal.(...)
Esa es exactamente la idea, solucionar el problema sin necesidad de la interacción del usuario, salvo la notificacion del globito.

Cita:
Empezado por roman Ver Mensaje
Yo creo que aquí estamos más bien hablando de dos estrategias de validación de datos: validar en cada campo o validar todos los campos al final.
Si definitivamente es así y dado este caso prefiero validar en el momento.

muchas gracias a todos por su ayuda
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código.


Cuando miras fijamente al abismo, este te devuelve la mirada


oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_
oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_
oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_
oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_
oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_
ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_
________________________________________________________________________________
Responder Con Cita
  #8  
Antiguo 19-03-2012
Avatar de jorosmtz
jorosmtz jorosmtz is offline
Miembro
 
Registrado: dic 2009
Posts: 108
Poder: 15
jorosmtz Va por buen camino
Pues hablando del tema, estoy usando "globitos" (perdón Roman, jeje, a mi si me parecen más estéticos en esta aplicación que estoy haciendo, aunque no para todos los casos).

Mi problema es que cuando en el OnKeyPress pongo la instruccion

Código Delphi [-]
  
if not (key in ['0'..'9'] + ['.'] + [','] + [#8]) then
   begin  
      BalloonHint.ShowHint;
      Key := #0;
   end;

Mi problema principal es que el "globito" sale en la parte superior izquiera de la pantalla, y no sobre el edit sobre el que estoy ejecutando el ShowHint.

¿Alguna idea de como hacerle para que aparezca sobre el componente Edit?

Gracias.
__________________
Javier Oros dice: Deus nobiscum, quis contra nos
Responder Con Cita
  #9  
Antiguo 19-03-2012
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
No sé de dónde viene ni que hace `BalloonHint.ShowHint´. El código de ese procedimiento es el que hay que depurar. Por otro lado, has probado el código que me citan al inicio de este hilo?

Saludos!
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #10  
Antiguo 22-03-2012
Avatar de jorosmtz
jorosmtz jorosmtz is offline
Miembro
 
Registrado: dic 2009
Posts: 108
Poder: 15
jorosmtz Va por buen camino
BalloonHint.ShowHint hace que, en ese caso pasrticular, el globito aparezca cuando se teclea otra cosa que no sea un número, un punto, una compa o la tecla retroceso, y funciona, pero no como espero, ya que el globito aparece en la parte superior izquierda de la pantalla.

A tu otra pregunta, no, no he probado el código, lo voy a hacer y luego posteo aquí, tengo que hacer algo por el momento más importante
__________________
Javier Oros dice: Deus nobiscum, quis contra nos
Responder Con Cita
  #11  
Antiguo 22-03-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cuando Chris pregunta por el significado de BalloonHint.ShowHint lo está haciendo pensando que usas algún componente o clase (TBalloonHint por ejemplo) que no mencionas. No siendo API y no conociendo dicho componente o clase, no se te puede contestar. Lee la documentación de ese componente o clase.


Saludos.
Responder Con Cita
  #12  
Antiguo 22-03-2012
beginner01 beginner01 is offline
Miembro
NULL
 
Registrado: mar 2011
Ubicación: República Dominicana
Posts: 181
Poder: 14
beginner01 Va por buen camino
Cita:
Empezado por jorosmtz Ver Mensaje
BalloonHint.ShowHint hace que, en ese caso pasrticular, el globito aparezca cuando se teclea otra cosa que no sea un número, un punto, una compa o la tecla retroceso, y funciona, pero no como espero, ya que el globito aparece en la parte superior izquierda de la pantalla.

A tu otra pregunta, no, no he probado el código, lo voy a hacer y luego posteo aquí, tengo que hacer algo por el momento más importante
Hola.

Asumiendo que es un componente TBalloonHint te puedo decir que en la llamada a BalloonHint.ShowHint puedes pasar como parámetro el punto donde quieres que se muestre "Parámetro de tipo Tpoint".
Ej.

Código Delphi [-]

procedure TForm1.btn1Click(Sender: TObject);
begin
   BalloonHint1.ShowHint(TButton(Sender).ClientOrigin);
end;
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
como usar RANDOMIZE yessika19 Varios 6 24-10-2018 12:20:13
como usar una imagen como boton? negrokau Varios 5 20-05-2011 16:54:26
como usar tabcontrol??? RedVenom Varios 6 03-04-2011 20:26:17
Balloontip con icono propio, se puede? Cheerpipe API de Windows 2 21-04-2009 18:26:14
Cómo usar una dll masetru Varios 1 20-12-2003 14:15:50


La franja horaria es GMT +2. Ahora son las 13:19:26.


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
Copyright 1996-2007 Club Delphi