Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.25;
Скачать: CL | DM;

Вниз

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 = ("&#207;&#240;&#232;&#235;&#229;&#242;/&#194;&#251;&#235;&#229;&#242;", "&#208;&#229;&#233;&#241;", "&#202;&#238;&#236;&#239;&#224;&#237;&#232;&#255;");
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.014 c
2-1193760863
ari_9
2007-10-30 19:14
2007.11.25
QuantumGrid, как покрасить стилями выбранную (Selected) строку?


15-1192890186
Petr V. Abramov
2007-10-20 18:23
2007.11.25
посоветуйте программу для работы с Motorola L6


2-1193854961
Miraj
2007-10-31 21:22
2007.11.25
перенос из базы в combobox без дубликации значений


15-1193108125
Slider007
2007-10-23 06:55
2007.11.25
С днем рождения ! 23 октября 2007 вторник


6-1161104009
BFG9k
2006-10-17 20:53
2007.11.25
обработка PHP сценариев с помощью HTTP сервера Indy