Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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 = ("&#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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.044 c
11-1177948951
dss
2007-04-30 20:02
2007.11.25
TextAlign


2-1194125113
nWinter
2007-11-04 00:25
2007.11.25
PopupMenu


15-1192777802
vajo
2007-10-19 11:10
2007.11.25
Игра ма-джонг


1-1189054256
Mirablics
2007-09-06 08:50
2007.11.25
Запрет на закрытие программы


15-1193152531
Petr V.Abramov
2007-10-23 19:15
2007.11.25
Стрим vs Wifi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский