2012-02-14 12 views
7

Używam Łazarza 0.9.30.Jak uzyskać bardziej płynne wskazówki dla komórek w TStringGrid?

Mam standardowy TStringGrid w formularzu i chcę pokazać inną wskazówkę, gdy przesuję wskaźnik myszy nad tytułem kolumny. Używam tego kodu, aby to zrobić i to działa, ale często trzeba kliknąć komórkę, aby uzyskać podpowiedź do zmiany, kiedy naprawdę chcę, aby to się zmieniło, gdy przesunie się nad nią wskaźnik myszy. Mam wszystkie wskazówki przechowywane w kolekcji, którą przeszukuję, używając indeksu kolumny jako klucza. Czy istnieje sposób na sprawniejsze wyświetlanie wskazówek?

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; 

Odpowiedz

10

Przypisywanie obsługi zdarzeń do zdarzenia TApplication.OnShowHint lub TApplicationEvents.OnShowHint lub podklasy TStringGrid przechwycić wiadomość CM_HINTSHOW. Każda z nich zapewni ci dostęp do rekordu THintInfo, który jest używany do kontrolowania zachowania okna podpowiedzi. W razie potrzeby możesz dostosować współrzędne elementu THintInfo.CursorRect. Okno podpowiedzi zostanie ponownie aktywowane najnowszym tekstem właściwości Hint (który można dostosować za pomocą elementu THintInfo.HintStr przed wyświetleniem) za każdym razem, gdy mysz znajdzie się poza tym prostokątem. Im mniejszy jest prostokąt, tym częściej okno podpowiedzi jest reaktywowane. Ta funkcja pozwala kontrolce interfejsu użytkownika mieć wiele podsekcji w obszarze roboczym, które wyświetlają różne ciągi podpowiedzi, podczas gdy mysz porusza się wokół tego samego kontrolki interfejsu użytkownika.

Wartość właściwości TApplication.HintShortPause (lub przechwytywanie wiadomości CM_HINTSHOWPAUSE) określa, czy okno podpowiedzi zniknie przed ponowną aktywacją. Jeśli ustawisz wartość pauzy na zero, okno podpowiedzi natychmiast zaktualizuje tekst, nie znikając. Jeśli ustawisz wartość pauzy na wartość niezerową, okno podpowiedzi zniknie, a następnie pojawi się ponownie po upływie określonej liczby milisekund, o ile mysz pozostanie nad tym samym elementem interfejsu użytkownika.

Na przykład:

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: Właśnie zauważyłem, że używasz Łazarza. Opisałem sposób radzenia sobie z tym problemem w Delphi. Nie mam pojęcia, czy odnosi się to również do Łazarza, czy też nie.

+0

I Myślę, że wywołanie SgScoutLink.MouseToCell nie będzie działać zgodnie z oczekiwaniami. Oczekuje współrzędnych względem kontrolki TGrid, ale te w CursorPos są absolutnymi współrzędnymi ekranu. Dlatego SgScoutLink.ScreenToClient powinien zostać wywołany jako pierwszy. – dummzeuch

+0

@dummzeuch 'THintInfo.CursorPos' zawiera względne współrzędne klienta w obrębie' THintInfo.CursorRect', a nie współrzędne ekranu –

0

doszedłem do następującego roztworu ... nie mam pojęcia, czy to działa w Łazarza ale mój Delphi jest ok z nim ... napisać następujący pseudo-kod do obsługi sieci mousemove:

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