HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Hint a TListBox széles elemeire


Példaprogram letöltése

8855 bájt

Ebben a példában továbbfejlesztjük a TListBox komponenst felkészítve azt arra az esetre, hogy ha valamelyik elemében olyan hosszú lenne az elhelyezett sztring, mely már meghaladja a komponens szélességét és így nem lesz látható a teljes szöveg, akkor a TListBox automatikusan megjelenítsen egy Hint ablakot, melyben megmutatja a szöveg egészét abban az esetben, ha a felhasználó az egérrel erre a sorra mutat.
A mellékelt példaprogram megnyitása előtt a HintListBox.pas-ban lévő komponenst telepítenie kell a Delphi alá.

Megvalósításhoz figyelnünk kell először is az egér mozgását. Ehhez felülírjuk az ősosztályban lévő MouseMove eljárást.
Itt a kapott X, Y koordináta alapján az ItemAtPos segítségével lekérdezzük, hogy az egér melyik sor felett tartózkodik. A kapott érték az Items tömb indexe lesz, kivéve ha az egér egyik sor felett sem áll. Ebben az esetben -1 értéket kapunk vissza. Következő lépésként ellenőrizzük az adott sor szövegének a szélességét. Ehhez a Canvas objektum TextWidth függvénye segít bennünket. Ha úgy találjuk, hogy ez a szélesség nagyobb, mint a komponensé, akkor szükséges a Hint ablak megjelenítése. Ehhez egy THintWindow osztályt használunk fel, melyet a komponens konstruktorában már létrehoztunk. Némi koordináta számolgatás után a THintWindow osztály ActivateHint hívásával megjelenítjük a Hint ablakot az adott elem szövegével. A Hint ablakot el kell tüntetnünk abban az esetben, ha az egér nem egy szövegre mutat, vagy ha az elfér a komponens szélességén belül.
procedure THintListBox.MouseMove(Shift: TShiftState;
     X, Y: Integer);
var
  w, h, ind: integer;
  s: string;
  r: TRect;
  p: TPoint;
begin
  inherited;
  p:=Point(x, y);
  ind:=ItemAtPos(p, true);
  if ind>0 then begin
    if FOldInd<>ind then begin
      FOldInd:=ind;
      s:=Items[ind];
      w:=Canvas.TextWidth(s)+8;
      h:=Canvas.TextHeight(s);
      if w>Width then begin
        r:=ItemRect(ind);
        p:=ClientToScreen(Point(r.Left, r.Top));
        r:=Rect(p.x, p.y, p.x+w, p.y+h);
        FHintWindow.ActivateHint(r, s);
      end else begin
        FHintWindow.ReleaseHandle;
      end;
    end;
  end else begin
    FOldInd:=-1;
    FHintWindow.ReleaseHandle;
  end;
end;
További probléma az az eset, amikor a komponens megjelenített egy Hint ablakot, de a felhasználó elhagyja az egérrel a komponens területét és így az többé nem kap MouseMove eseményt. Ezt viszont figyelhetjük a CM_MOUSELEAVE eseménnyel. Ha ez bekövetkezik, akkor mindentől függetlenül a Hint ablakot el kell tüntetnünk.
procedure THintListBox.CMMouseLeave(var Message: TMessage);
begin
  FOldInd:=-1;
  FHintWindow.ReleaseHandle;
end;


Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2001 évkönyv 81. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |