2012-02-14 9 views
7

Sto eseguendo Lazarus 0.9.30.Come si possono ottenere suggerimenti per le celle in un TStringGrid che appare più agevolmente?

Ho uno standard TStringGrid su un modulo e voglio mostrare un suggerimento diverso mentre sposto il puntatore del mouse sul titolo di una colonna. Sto usando questo codice per fare questo e funziona in qualche modo, ma spesso devi fare clic sulla cella per far sì che il suggerimento cambi, quando in realtà voglio che cambi mentre il puntatore del mouse si sposta su di esso. Ho tutti gli hint memorizzati in una raccolta che cerco usando l'indice della colonna come chiave. C'è un modo per ottenere una visualizzazione più agevole dei suggerimenti?

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; 

risposta

10

assegnare un gestore di eventi per l'evento TApplication.OnShowHint o TApplicationEvents.OnShowHint, o sottoclasse il TStringGrid per intercettare il messaggio CM_HINTSHOW. Ognuno di questi ti fornirà l'accesso a un record THintInfo utilizzato per controllare il comportamento della finestra dei suggerimenti. È possibile personalizzare le coordinate del membro THintInfo.CursorRect secondo necessità. La finestra di suggerimento viene riattivata con il testo della proprietà Hint più recente (che può essere personalizzato con il membro THintInfo.HintStr prima che venga visualizzato) ogni volta che il mouse si sposta all'esterno di tale rettangolo. Più piccolo è il rettangolo, più spesso viene riattivata la finestra del suggerimento. Questa funzionalità consente a un controllo dell'interfaccia utente di avere più sottosezioni all'interno dell'area client che visualizzano stringhe di suggerimento diverse mentre il mouse si muove attorno allo stesso controllo dell'interfaccia utente.

Il valore della proprietà TApplication.HintShortPause (o dall'intercettazione del messaggio CM_HINTSHOWPAUSE) controlla se la finestra di suggerimento scompare prima di riattivare. Se si imposta il valore di pausa su zero, la finestra del suggerimento aggiorna immediatamente il testo senza scomparire. Se si imposta il valore di pausa su un valore diverso da zero, la finestra di suggerimento scompare e quindi riappare dopo che è trascorso il numero specificato di millisecondi, purché il mouse rimanga sullo stesso controllo dell'interfaccia utente.

Ad esempio:

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; 

Edit: Ho appena notato che si sta utilizzando Lazzaro. Quello che ho descritto è come gestire questo problema in Delphi. Non ho idea se si applica anche a Lazzaro o no.

+0

I pensa che la chiamata a SgScoutLink.MouseToCell non funzionerà come previsto. Si aspetta le coordinate relative al controllo TGrid, ma quelle in CursorPos sono le coordinate dello schermo assolute. Quindi SgScoutLink.ScreenToClient dovrebbe essere chiamato prima. – dummzeuch

+0

@dummzeuch 'THintInfo.CursorPos' contiene le coordinate relative del cliente all'interno di' THintInfo.CursorRect', non le coordinate dello schermo –

0

sono giunto alla seguente soluzione ... non hanno alcuna idea se funziona in Lazarus, ma il mio Delphi è ok con esso ... Scrivere il seguente pseudo-codice per il gestore di rete MouseMove:

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