![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
dxDBGrid и OnMouseMove [D7, 2000]
Sonia © (2007-10-29 14:42:00)Всем привет!
Имеются колонки грида. Надо при наведении на каждую колонку выводить подсказку. Делаю все в MouseMove, все работает. Однако если после наведения на одну колонку навести указатель мыши на другую колонку (не выходя за пределы грида), то событие не работает. И если выйти за пределы грида, то все ОК.
Подскажите, как сделать, чтобы событие работало всегда (внутри грида)?
Спасибо!
Sonia (2007-10-30 15:32:00) [1]Все! Разобралась окончательно, для тех, кому еще понадобится (используя dxDBGrid), вот код:
type
TfMain = class(TForm)
procedure dxDBGridMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
FCurrX: integer;
end;
var
fMain: TfMain;
implementation
procedure TfMain.dxDBGridMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
const
ColHints: array[0..10] of string = ('Прилет/Вылет', 'Рейс', 'Тип ВС', 'Рег.номер ВС','План.время','Расч.время','Время прибытия на/ухода с МС','Факт.время взлет/посадка','Стоянка прибытия/отправления','Буксир','Стоянка текущая');
var
Coord: TdxDBTreeListColumn;
begin
Coord := dxDBGrid.GetColumnAt(X, Y);
if coord<>nil then
if (Coord.Index <> FCurrX) then begin
Application.CancelHint;
dxDBGrid.Hint := ColHints[Coord.index];
dxDBGrid.ShowHint:=true;
FCurrX := Coord.index;
end;
end;
Sonia (2007-10-30 14:02:00) [2]
> Ты чего, Марина - не выспалась сегодня? )
Ну да, к сожалению, присутствует такое явление....
Спасибо огромное, Александр!!! :)
Дальше думаю разберусь.
clickmaker (2007-10-30 13:56:00) [3]
> Компилятор ее не распознает
Ты чего, Марина - не выспалась сегодня? )
это приватная переменная формы, типа integer. Сама ее туда впиши, в секцию private
А нужна она, чтобы хинт менялся, только если мы перешли на другую колонку
Sonia (2007-10-30 13:53:00) [4]
> ну там есть метод для определения строки/столбца по координатам?
Да, метод нашла:
function GetColumnAt(X, Y: Integer): TdxDBTreeListColumn;
> куда подробней? что непонятно-то?
Компилятор ее не распознает. А я не могу в справке найти :(
clickmaker (2007-10-30 12:45:00) [5]
> .к. использую dxDBGrid
ну там есть метод для определения строки/столбца по координатам?
> поподробнее про FCurrX
куда подробней? что непонятно-то?
Sonia (2007-10-30 12:39:00) [6]
> не гоже константы по коду разбрасывать
Я исправлюсь, честно :)
А вот MouseCoord у меня не работает, т.к. использую dxDBGrid :(
И вот если можно поподробнее про FCurrX....
clickmaker (2007-10-30 12:12:00) [7]
> Можно, но так нагляднее мне кажется
не гоже константы по коду разбрасывать, тем более, что они сгруппированы по логике
Менять проще, а если в ресурс - то еще и локализовать, если что
FCurrX - приватная переменная формы, типа integer
Sonia (2007-10-30 12:10:00) [8]
> я бы, кстати, забил бы массив хинтов, а потом - по индексу
> столбца
Можно, но так нагляднее мне кажется.
А что есть FCurrX из [15] ?
clickmaker (2007-10-30 11:56:00) [9]
> vSTAT и vFLT это целые переменные конечных координат столбцов
> в гриде
> if (X< vSTAT) then
> dxDBGrid.Hint:='Прилет/Вылет';
>
> if (X>vSTAT) and (X< vFLT) then
> dxDBGrid.Hint:='Рейс';
я бы, кстати, забил бы массив хинтов, а потом - по индексу столбца
procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
const
ColHints: array[1..3] of string = ('Ïðèëåò/Âûëåò', 'Ðåéñ', 'Êîìïàíèÿ');
var
Coord: TGridCoord;
begin
Coord := DBGrid1.MouseCoord(X, Y);
if (Coord.X FCurrX) then begin
Application.CancelHint;
DBGrid1.Hint := ColHints[Coord.X];
FCurrX := Coord.X;
end;
end;
Sonia (2007-10-30 11:37:00) [10]
> DataLink.ActiveRecord, например, не нужна и GetFieldValue
Да это я уже поняла :) А вот можно ли вообще отказаться от структуры THintInfo и сделать напрямую через dxDBGrid.Hint?
clickmaker (2007-10-30 11:30:00) [11]
> [12] Sonia © (30.10.07 11:28)
тогда можно проще, конечно
DataLink.ActiveRecord, например, не нужна и GetFieldValue
Sonia (2007-10-30 11:28:00) [12]
> а смысл хинта тогда в чем?
Смысл в столбце. Столбцы имеют заголовок, кот. стоит как аббривеатура, а при наведении на любое место в столбце идет расшифровка заголовка (фактически назначение) столбца.
Пытаюсь сейчас реализовать с помощью представленной вами функции PrepareHint, но вот надо ли это, или можно сделать проще?
clickmaker (2007-10-30 11:19:00) [13]
> мне не важно на какую строку указатель падает
а смысл хинта тогда в чем?
Sonia (2007-10-30 11:13:00) [14]А, забыла добавить, мне не важно на какую строку указатель падает, главное на какой столбец.
Sonia (2007-10-30 11:01:00) [15]Leonid Troyanovsky, немножко чего-то недопонимаю...
Вот мой кусок кода:
procedure TfMain.dxDBGridMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
dxDBGrid.ShowHint:=false;
//проверка попадания указателя мыши на dxDBGrid
if (X > dxDBGrid.Left) and (X< (dxDBGrid.Left + dxDBGRid.Width )) then
begin
// vSTAT и vFLT это целые переменные конечных координат столбцов в гриде
if (X< vSTAT) then
dxDBGrid.Hint:='Прилет/Вылет';
if (X>vSTAT) and (X< vFLT) then
dxDBGrid.Hint:='Рейс';
end;
Если я ставлю условие Application.CancelHint в какой-либо if, то подсказки отменяются либо в конкретном столбце, либо вообще в гриде...
Не пойму, что я делаю не так?
Leonid Troyanovsky (2007-10-29 18:06:00) [16]
> Leonid Troyanovsky © (29.10.07 17:53) [7]
> См. [6], т.е. при движении мыши сначала CancelHint,
> если он стал неактуальным, и, при продолжении движения,
Чего-то слишком корявое описалово, приведу-ка лучше пример.
type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
shint : String;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if shint <> Hint then
begin
Application.CancelHint;
Hint := shint;
end;
if PtInRect(Rect(0,0,100,100), Point(X,Y)) then
shint := '321'
else
shint := '123';
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Rectangle(0,0,100,100);
end;
--
Regards, LVT.
Leonid Troyanovsky (2007-10-29 17:53:00) [17]
> Sonia © (29.10.07 15:46) [3]
> Может что-то еще надо добавить?
С тех времен изменилась обработка событий хинта:
она переместилась в Application.Idle.
Поэтому, цитированный код оказался нерабочим, sorry.
См. [6], т.е. при движении мыши сначала CancelHint,
если он стал неактуальным, и, при продолжении движения,
показывается новый.
--
Regards, LVT.
Lacmus (2007-10-29 17:08:00) [18]
procedure dxSetTreeListHint(aTreeControl: TCustomdxTreeListControl; X, Y, aHintColumn: Integer; const aHint: string);
var
HitInfo: TdxTreeListHitInfo;
sHint: string;
begin
HitInfo := aTreeControl.GetHitInfo(Point(X, Y));
if HitInfo.Column = aHintColumn then
sHint := aHint
else
sHint := '';
if (aTreeControl.Hint <> sHint) then begin
aTreeControl.ShowHint := True;
aTreeControl.Hint := sHint;
Application.CancelHint
end
end;
Sonia (2007-10-29 16:28:00) [19]Спасибо, буду разбираться
clickmaker (2007-10-29 15:53:00) [20]function HandleGridHint (var CanShow: Boolean; var HintInfo: THintInfo): boolean;
// It corrects HintInfo for all DBGrid components.
// TRUE - means function handles this call, FALSE - otherwise.
// You may call this function from any OnShowHint handlers.
implementation
type
TMyDBGrid = class(TDBGrid)
public
property DataLink;
function BoxRect(ALeft, ATop, ARight, ABottom: Longint): TRect;
end;
function TMyDBGrid.BoxRect(ALeft, ATop, ARight, ABottom: Longint): TRect;
begin
Result := inherited BoxRect(ALeft, ATop, ARight, ABottom);
end;
function PrepareHint(G: TDBGrid; var HintInfo: THintInfo): Boolean;
var CC: TGridCoord;
S: string;
W, OldActive: Integer;
Sz: TSize;
R: TRect;
begin
Result := False;
with G do begin
CC := MouseCoord(HintInfo.CursorPos.X, HintInfo.CursorPos.Y);
if (CC.X > 0) and (CC.Y > 0) then begin
OldActive := TMyDBGrid(G).DataLink.ActiveRecord;
try
R := TMyDBGrid(G).BoxRect(CC.X, CC.Y, CC.X, CC.Y);
W := R.Right-R.Left-2;
TMyDBGrid(G).DataLink.ActiveRecord := CC.Y-ORD(dgTitles in G.Options);
S := TrimRight(TMyDBGrid(G).GetFieldValue(CC.X-ORD(dgIndicator in G.Options)));
if GetTextExtentPoint32(Canvas.Handle, PChar(S), Length(S), Sz) then
if Sz.Cx > W then begin
with HintInfo do begin
HintStr := TrimLeft(S);
HintPos := ClientToScreen(R.TopLeft);
ReshowTimeout := 512;
end;
Result := True;
end;
finally
TMyDBGrid(G).DataLink.ActiveRecord := OldActive;
end;
end;
end;
end;
function HandleGridHint (var CanShow: Boolean; var HintInfo: THintInfo): boolean;
begin
Result:= (HintInfo.HintControl is TDBGrid);
if Result then
CanShow := PrepareHint(TDBGrid(HintInfo.HintControl), HintInfo);
end;