PDA

Ver la Versión Completa : Mostar el Hint en un TEdit al presionar el Tabulador


Puberta
01-11-2007, 20:39:50
Hola, ojala alguien me pueda ayudar.

Tengo el siguiente problema, tengo un TRadioButton y lo sigue un
TEdit, el cual tiene un Hint ('Doble clic -> Ayuda'), pero el hint solo es visible cuando se para el Mouse sobre el y no cuando presiono la tecla Tabulador al TRadioButton anterior para pasar el Foco a el TEdit...es posible hacer esto, bueno dicen que en programación todo es posible, pero mi pregunta es ¿cómo?:confused:.

jhonny
01-11-2007, 21:38:56
Según el truco 135 de Trucomania (Quizá haya algo mejor), necesitas dos metodos basicos y un atributo global para la unidad:

private
mango:THintWindow;
function RevealHint(Control: TControl): THintWindow;
procedure RemoveHint(var Hint: THintWindow);


function TForm1.RevealHint (Control: TControl): THintWindow;
var
ShortHint: string;
AShortHint: array[0..255] of Char;
HintPos: TPoint;
HintBox: TRect;
begin
{ Create the window: }
Result := THintWindow.Create(Control);

{ Get first half of hint up to '|': }
ShortHint := GetShortHint(Control.Hint);

{ Calculate Hint Window position & size: }
HintPos := Control.ClientOrigin;
Inc(HintPos.Y, Control.Height + 6);
HintBox := Bounds(0, 0, Screen.Width, 0);
DrawText(Result.Canvas.Handle,
StrPCopy(AShortHint, ShortHint), -1, HintBox,
DT_CALCRECT or DT_LEFT or DT_WORDBREAK or DT_NOPREFIX);
OffsetRect(HintBox, HintPos.X, HintPos.Y);
Inc(HintBox.Right, 6);
Inc(HintBox.Bottom, 2);

{ Now show the window: }
Result.ActivateHint(HintBox, ShortHint);
end; {RevealHint}

procedure TForm1.RemoveHint (var Hint: THintWindow);
begin
Hint.ReleaseHandle;
Hint.Free;
Hint := nil;
end;

Para llamarlos podrias hacerlo por ejemplo en el OnEnter del Edit:

procedure TForm1.Edit1Enter(Sender: TObject);
begin
mango := RevealHint(Edit1);
end;

Y en el OnExit para hacerlo desaparecer:

procedure TForm1.Edit1Exit(Sender: TObject);
begin
RemoveHint(mango);
end;


Y Listo ;), espero te sirva el truco 135 de TrucoMania :).

Puberta
01-11-2007, 22:51:20
Hola Jhonny,

Te agradezco tu ayuda y tiempo, en verdad funcionó de maravilla, llevaba ya un día intentando varias formas de hacerlo pero no me quedaba, no sabes lo agradecida que estoy, aunque aún no lo entiendo del todo (pero lo haré tarde o temprano, ojala que sea temprano).

Alcolea
21-11-2007, 22:16:50
Buscando hacer eso que dices encontre a Alcione, es un conjunto de componente que bajé hace ya algún tiempo, uno de ellos se nombre AllHintBallon o algo parecido que es capaz de ponerte el Hint que quieres sobre cualquier componente con tan solo pasar unos parámetros, como con se usa Application.MessageBox(). Este Hint tiene la misma forma que el balón de Windows con icono de Error, Warning e Information y todo. Si te animas a buscarlo se que no te pesará.

jhonny
21-11-2007, 22:28:37
Pues a mi me funciona bien, creo que debes hacer una mejora al llamar el metodo remove, asi:


if mango <> nil then
RemoveHint(mango);


Para que nos aseguremos que la variable mango siempre tenga algo al momento de llamar el metodo RemoveHint ;).

Al llamar el RevealHint deberia tener otra mejora, asi:


if mango = nil then
mango := RevealHint(Edit1);

Puberta
22-11-2007, 00:04:56
Primero opte por la solución de Jhonny pués ya lo tenia casi todo, solo era cuestión de agregar 2 lineas más.

Jhonny, solo me queda agradecerte de nuevo pues es como indicaste.

Gracias Alcolea, la verdad aún no he probado la solución que mencionas, pero lo haré y después les cuento como me fue.

jhonny
22-11-2007, 00:06:54
Primero opte por la solución de Jhonny pués ya lo tenia casi todo, solo era cuestión de agregar 2 lineas más.

Jhonny, solo me queda agradecerte de nuevo pues es como indicaste.

Gracias Alcolea, la verdad aún no he probado la solución que mencionas, pero lo haré y después les cuento como me fue.

Que bueno que a quedado bien el asunto :).