2012-02-14 20 views
7

Estoy ejecutando Lazarus 0.9.30.¿Cómo puede obtener pistas para que las celdas en una TStringGrid aparezcan de forma más fluida?

Tengo un estándar TStringGrid en un formulario y quiero mostrar una pista diferente cuando muevo el puntero del mouse sobre el título de una columna. Estoy usando este código para hacer esto y funciona, pero a menudo tiene que hacer clic en la celda para cambiar la sugerencia, cuando realmente quiero que cambie a medida que el puntero del mouse se mueve sobre ella. Tengo todas las sugerencias almacenadas en una colección que busco usando el índice de la columna como la clave. ¿Hay alguna manera de obtener una presentación más suave de sugerencias?

procedure TTmMainForm.SgScoutLinkMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
var 
    R, C: Integer; 
begin 
    R := 0; 
    C := 0; 

    SgScoutLink.MouseToCell(X, Y, C, R); 

    with SgScoutLink do 
    begin 
    if (R = 0) then 
     if ((C >= 3) and (C <= 20)) then 
     begin 
     SgScoutLink.Hint := FManager.ScoutLinkColumnTitles.stGetColumnTitleHint(C-3); 
     SgScoutLink.ShowHint:= True; 
     end; {if} 
    end; {with} 
end; 

Respuesta

10

asignar un controlador de eventos para el evento TApplication.OnShowHint o TApplicationEvents.OnShowHint, o subclase de la TStringGrid para interceptar el mensaje CM_HINTSHOW. Cualquiera de ellos le proporcionará acceso a un registro THintInfo que se utiliza para controlar el comportamiento de la ventana de sugerencia. Puede personalizar las coordenadas del miembro THintInfo.CursorRect según sea necesario. La ventana de sugerencia se reactiva con el último texto de propiedad Hint (que se puede personalizar con el miembro THintInfo.HintStr antes de que se muestre) cada vez que el mouse se mueve fuera de ese rectángulo. Cuanto más pequeño sea el rectángulo, más a menudo se reactivará la ventana de sugerencia. Esta característica permite que el control de la IU tenga múltiples subsecciones dentro de su área de cliente que muestran diferentes cadenas de sugerencias mientras el mouse se mueve alrededor del mismo control de IU.

El valor de la propiedad TApplication.HintShortPause (o al interceptar el mensaje CM_HINTSHOWPAUSE) controla si la ventana de sugerencia desaparece antes de reactivarse. Si establece el valor de pausa en cero, la ventana de sugerencia actualiza su texto de inmediato sin desaparecer. Si establece el valor de pausa en un valor distinto de cero, la ventana de sugerencia desaparece y luego reaparece después de que haya transcurrido el número especificado de milisegundos, siempre que el mouse permanezca sobre el mismo control de la IU.

Por ejemplo:

procedure TTmMainForm.FormCreate(Sender: TObject); 
begin 
    Application.OnShowHint := AppShowHint; 
end; 

procedure TTmMainForm.FormDestroy(Sender: TObject); 
begin 
    Application.OnShowHint := nil; 
end; 

procedure TTmMainForm.AppShowHint(var HintStr: String; var CanShow: Boolean; var HintInfo: THintInfo); 
var 
    R, C: Integer; 
begin 
    if HintInfo.HintControl = SgScoutLink then 
    begin 
    R := 0; 
    C := 0; 
    SgScoutLink.MouseToCell(HintInfo.CursorPos.X, HintInfo.CursorPos.Y, C, R); 
    if (R = 0) and (C >= 3) and (C <= 20) then 
    begin 
     HintInfo.CursorRect := SgScoutLink.CellRect(C, R); 
     HintInfo.HintStr := FManager.ScoutLinkColumnTitles.stGetColumnTitleHint(C-3); 
    end; 
    end; 
end; 

Editar: Acabo de notar que está utilizando Lázaro. Lo que describí es cómo manejar este problema en Delphi. No tengo ni idea si también se aplica a Lázaro o no.

+0

I Creo que la llamada SgScoutLink.MouseToCell no funcionará como se esperaba. Espera coordenadas relativas al control TGrid, pero las de CursorPos son coordenadas de pantalla absolutas. Por lo tanto, debe llamarse primero a SgScoutLink.ScreenToClient. – dummzeuch

+0

@dummzeuch 'THintInfo.CursorPos' contiene las coordenadas relativas del cliente dentro de' THintInfo.CursorRect', no las coordenadas de pantalla –

0

llegué a la siguiente solución ... no tienen idea de si funciona en Lázaro pero mi Delphi está bien con él ... Escribe el siguiente pseudo-código del controlador mousemove cuadrícula:

if (current_coords==old_coords) then 
    {showhint=true;hint=use_mousetocell_call_to_create} 
else 
    {showhint=false;hint=''} old_coords=current_coords; 
Cuestiones relacionadas