E giochino che ho fatto un po' di tempo fa, mi è servito in quanto avendo le colonne della grid molto strette non vedevo l'intera scritta, allora ho pensato di mostrarla come hint al passaggio del mouse.
Data una TDBGrid standard, biosogna utilizzare 2 workaround:
type
TMouseGrid = class(TCustomDrawGrid);
THackDBGrid = Class(TDBGrid);
in modo da poter utilizzare le loro property, l'evento da utilizzare è OnMouseMove nel quale andiamo a cercare l'hint da visualizzare
Il tutto è contenuto nell'evento OnMouseMove della grid:
[code]
var s: string;
DLink : TDataLink;
nCol,nRow:Integer;
OldPosRecord: Integer;// vecchia posizione del cursore
Procedure NoHint;
begin // nel caso di nessun hint .. lo nascondo
DBGrid1.Hint:='';
Application.HideHint;
end;
begin
nCol := -1;
nRow := -1;
s:= '';
if DBGrid1.DataSource.DataSet.Active then // solo se il dataset è aperto
begin
TMouseGrid(Sender).MouseToCell(X, Y, nCol, nRow); //Mi ritorna riga colonna del mouse
if (nCol>0) and (nRow>0) then
begin
DLink:=THackDBGrid(DBGrid1).DataLink; //mi becco il datalink
if Assigned(DLink) then // è sicuramente assegnato .. ma ..
begin
OldPosRecord := DLink.ActiveRecord; // salvo il cursore del record
DLink.ActiveRecord := nRow - 1; //-1 conto che ci sia l'intestazione
if assigned(DBGrid1.DataSource.DataSet.Fields[nCol - 1]) then
s := DBGrid1.DataSource.DataSet.Fields[nCol - 1].AsString; // prendo il valore
DBGrid1.Hint := s; // assegno il valore all'hint della grid
Application.ActivateHint(DBGrid1.ClientToScreen( Point(X,Y) )); //mostro l'hint nella posizione del cursore
DLink.ActiveRecord := OldPosRecord; // ripristino posizione
end
else
NoHint;
end
else
NoHint;
end
else
NoHint;
[/code]
Il tutto è molto semplice e chiaro, ho utilizzato Delphi7, ma credo che sia ininfluente e il codice sia valido anche per le versioni successive (e precedenti) di delphi.
G.
Aggiungi un commento