Форум: "Начинающим";
Текущий архив: 2007.11.25;
Скачать: [xml.tar.bz2];
ВнизdxDBGrid и OnMouseMove Найти похожие ветки
← →
Sonia © (2007-10-29 14:42) [0]Всем привет!
Имеются колонки грида. Надо при наведении на каждую колонку выводить подсказку. Делаю все в MouseMove, все работает. Однако если после наведения на одну колонку навести указатель мыши на другую колонку (не выходя за пределы грида), то событие не работает. И если выйти за пределы грида, то все ОК.
Подскажите, как сделать, чтобы событие работало всегда (внутри грида)?
Спасибо!
← →
Sonia © (2007-10-29 14:47) [1]Или кто подскажет более рациональное решение...
← →
Leonid Troyanovsky © (2007-10-29 15:09) [2]
> Sonia © (29.10.07 14:42)
> Подскажите, как сделать, чтобы событие работало всегда (внутри
> грида)?
Пример для StringGrid, но принцип тот же.
Только OldCol, OldRow сделай полями формы.
http://groups.google.com/group/fido7.ru.delphi.chainik/msg/940aab89c7d48cb6
--
Regards, LVT.
← →
Sonia © (2007-10-29 15:46) [3]Посмотрела ссылку, однако не нашла ключевого момента, удовлетворяющего моей просьбе...
Application.CancelHint; просто запрещает все подсказки и вообще ничего не выводит...
Может что-то еще надо добавить?
← →
clickmaker © (2007-10-29 15:53) [4]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;
← →
Sonia © (2007-10-29 16:28) [5]Спасибо, буду разбираться
← →
Lacmus © (2007-10-29 17:08) [6]
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;
← →
Leonid Troyanovsky © (2007-10-29 17:53) [7]
> Sonia © (29.10.07 15:46) [3]
> Может что-то еще надо добавить?
С тех времен изменилась обработка событий хинта:
она переместилась в Application.Idle.
Поэтому, цитированный код оказался нерабочим, sorry.
См. [6], т.е. при движении мыши сначала CancelHint,
если он стал неактуальным, и, при продолжении движения,
показывается новый.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2007-10-29 18:06) [8]
> 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.
← →
Sonia © (2007-10-30 11:01) [9]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, то подсказки отменяются либо в конкретном столбце, либо вообще в гриде...
Не пойму, что я делаю не так?
← →
Sonia © (2007-10-30 11:13) [10]А, забыла добавить, мне не важно на какую строку указатель падает, главное на какой столбец.
← →
clickmaker © (2007-10-30 11:19) [11]
> мне не важно на какую строку указатель падает
а смысл хинта тогда в чем?
← →
Sonia © (2007-10-30 11:28) [12]
> а смысл хинта тогда в чем?
Смысл в столбце. Столбцы имеют заголовок, кот. стоит как аббривеатура, а при наведении на любое место в столбце идет расшифровка заголовка (фактически назначение) столбца.
Пытаюсь сейчас реализовать с помощью представленной вами функции PrepareHint, но вот надо ли это, или можно сделать проще?
← →
clickmaker © (2007-10-30 11:30) [13]
> [12] Sonia © (30.10.07 11:28)
тогда можно проще, конечно
DataLink.ActiveRecord, например, не нужна и GetFieldValue
← →
Sonia © (2007-10-30 11:37) [14]
> DataLink.ActiveRecord, например, не нужна и GetFieldValue
Да это я уже поняла :) А вот можно ли вообще отказаться от структуры THintInfo и сделать напрямую через dxDBGrid.Hint?
← →
clickmaker © (2007-10-30 11:56) [15]
> 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 12:10) [16]
> я бы, кстати, забил бы массив хинтов, а потом - по индексу
> столбца
Можно, но так нагляднее мне кажется.
А что есть FCurrX из [15] ?
← →
clickmaker © (2007-10-30 12:12) [17]
> Можно, но так нагляднее мне кажется
не гоже константы по коду разбрасывать, тем более, что они сгруппированы по логике
Менять проще, а если в ресурс - то еще и локализовать, если что
FCurrX - приватная переменная формы, типа integer
← →
Sonia © (2007-10-30 12:39) [18]
> не гоже константы по коду разбрасывать
Я исправлюсь, честно :)
А вот MouseCoord у меня не работает, т.к. использую dxDBGrid :(
И вот если можно поподробнее про FCurrX....
← →
clickmaker © (2007-10-30 12:45) [19]
> .к. использую dxDBGrid
ну там есть метод для определения строки/столбца по координатам?
> поподробнее про FCurrX
куда подробней? что непонятно-то?
← →
Sonia © (2007-10-30 13:53) [20]
> ну там есть метод для определения строки/столбца по координатам?
Да, метод нашла:
function GetColumnAt(X, Y: Integer): TdxDBTreeListColumn;
> куда подробней? что непонятно-то?
Компилятор ее не распознает. А я не могу в справке найти :(
← →
clickmaker © (2007-10-30 13:56) [21]
> Компилятор ее не распознает
Ты чего, Марина - не выспалась сегодня? )
это приватная переменная формы, типа integer. Сама ее туда впиши, в секцию private
А нужна она, чтобы хинт менялся, только если мы перешли на другую колонку
← →
Sonia © (2007-10-30 14:02) [22]
> Ты чего, Марина - не выспалась сегодня? )
Ну да, к сожалению, присутствует такое явление....
Спасибо огромное, Александр!!! :)
Дальше думаю разберусь.
← →
Sonia © (2007-10-30 15:32) [23]Все! Разобралась окончательно, для тех, кому еще понадобится (используя 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;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.11.25;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.044 c