C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Hint && DBGrid
laifik
  Отправлено: 02.11.2004, 09:57


Дежурный стрелочник

Группа: Участник
Сообщений: 70



Эта тема не раз обсуждалась. Если прописать просто в событии OnMouseMove Грида код:
CODE
TGridCoord Cell = DBGridEh1->MouseCoord(X,Y);
try
{
 DBGridEh1->Hint = "";

 DBGridEh1->ShowHint = false;
  if ((Cell.X < 0)||(Cell.Y < 0)) return;
   {
    DBGridEh1->ShowHint = true;
    DBGridEh1->Hint = ModuleLoad->ADORD->FieldByName("NaimenRD")->AsString;
   }
}
catch(...) {}
, то появляется Hint длиной строкой на весь экран. Я хочу, чтобы вырисовывался прямоугольник. Поэтому делаю через функцию
CODE
void __fastcall TFormCard::DBGridEh1MouseMove(TObject *Sender,
     TShiftState Shift, int X, int Y)
{
Application->HintPause = 0;
Application->HintShortPause = 0;
Application->HintHidePause = 10000000000;
Application->OnShowHint = DoShowHint;
}
, а далее

CODE
void __fastcall TFormCard::DoShowHint(System::AnsiString &HintStr, bool
&CanShow, THintInfo &HintInfo)
{
int X, Y;
CanShow = true;
 if (HintInfo.HintControl == DBGridEh1 )
 {
       if( Mouse->Capture )
       {
           CanShow = false;
           return;
       }
   HintInfo.ReshowTimeout = 100;  
   TRect R;
TGridCoord Cell = DBGridEh1->MouseCoord(X,Y);
try
{
 DBGridEh1->Hint = "";

 DBGridEh1->ShowHint = false;
 if ((Cell.X < 0)||(Cell.Y < 0)) return;
   {
   DBGridEh1->ShowHint = true;
   DBGridEh1->Hint = ModuleLoad->ADORD->FieldByName("NaimenRD")->AsString;

R.Left = DBGridEh1->Left;
R.Top = DBGridEh1->Top;
R.Right = DBGridEh1->Left + DBGridEh1->Width;
R.Bottom = DBGridEh1->Top + DBGridEh1->Height;

     TPoint w_tl=TPoint(R.Left,R.Top);
TPoint w_br=TPoint(R.Right,R.Bottom);
     w_tl=DBGridEh1->ClientToScreen(w_tl);
     w_br=DBGridEh1->ClientToScreen(w_br);

     HintInfo.CursorRect=TRect(w_tl,w_br);
     HintInfo.HintPos=w_tl;  
   }
}
catch(...) {}
}
и у меня не работает. В чем моя ошибка? wink.gif
Gedeon
Отправлено: 02.11.2004, 10:19


Ветеран

Группа: Модератор
Сообщений: 1742



Вот именно не раз обсуждалось, AVC сделал отличное решение этой проблемы, ищите в поиске, по поводу формы хинта тоже в поиск, все это было.
laifik
Отправлено: 02.11.2004, 11:04


Дежурный стрелочник

Группа: Участник
Сообщений: 70



QUOTE (Gedeon @ 02/11/2004, 11:21)
Вот именно не раз обсуждалось, AVC сделал отличное решение этой проблемы, ищите в поиске, по поводу формы хинта тоже в поиск, все это было.

Gedeon, я честно просмотрела все форумы, rambler и yandex на эту тему и все, что касается hint-а. В основном, коды на Делпфи (один и тот же код повторяется десятки раз). И нет ни одного примера на С++ Билдере с выводом хинта в компактный прямоугольник. На Делпфи есть такой намек, но я не знаю, как его перевести на Си.
Если можно, укажите ссылку на AVC. Если это код на компонент StringGrid, то я его наизусть знаю. Он существенно отличается от DBGrid.
Gedeon
Отправлено: 02.11.2004, 12:07


Ветеран

Группа: Модератор
Сообщений: 1742



Искать эффективнее поиском того форума, где сейчас находитесь. Вот ссылочка на DBGrid || DBGridEh
https://rxlib.ru/forums/index.php?ac...6bc0e0233121b8e

А вот как сделать другой хинт
https://rxlib.ru/forums/index.php?ac...6bc0e0233121b8e
laifik
Отправлено: 02.11.2004, 14:03


Дежурный стрелочник

Группа: Участник
Сообщений: 70



Спасибо за коды. Таких я еще не видела. Буду разбираться.
Но не думала, что этот вопрос такой объемный. С "деревом" и ЛистБоксом все было гораздо проще. cool.gif
Rius
Отправлено: 02.11.2004, 14:09


Мастер участка

Группа: Участник
Сообщений: 321



Кидаешь данный код в файл HintX.pas и подключаешь к C++Builder по Shift+F11.
CODE

unit HintX;
//-----------------------------------------------------------------------------

interface

uses
 Windows, Messages, Controls, Graphics, Classes;

type
 THintX = class(THintWindow)
 protected
   procedure Paint; override;
 public
   procedure ActivateHint(Rect: TRect; const  AHint: AnsiString); override;
   function CalcHintRect(MaxWidth: Integer; const AHint: string;
   AData: Pointer): TRect; override;
end;
//-----------------------------------------------------------------------------

implementation

uses Forms;

{ TIconHintX }

//-----------------------------------------------------------------------------
{-Вычисляем новый размер окошка подсказки для помещения в него иконки:-}
function THintX.CalcHintRect(MaxWidth: Integer;
const AHint: string; AData: Pointer): TRect;
begin
 Result := inherited CalcHintRect(MaxWidth, AHint, AData);
 Result.Right := (Canvas.TextWidth(AHint) + 10);
 Result.Bottom := Canvas.TextHeight('М') * 2 + 10;
//  MessageBeep(MB_OK);
end;
//-----------------------------------------------------------------------------

procedure THintX.Paint;
const
 MARGIN = 5;
var
Rect: TRect;
Styles: TFontStyles;

begin
//  inherited;
Include (Styles, fsBold);
Canvas.Font.Style := Styles;
Rect.Left := 2;
Rect.Top := 2;
Rect.Right := Width — 2;
Rect.Bottom := Canvas.TextHeight('М') + 2;
Canvas.TextRect(Rect, Rect.Left+2, Rect.Top, 'Подсказка');

Canvas.Pen.Color := clSkyBlue;
Canvas.MoveTo(2, Rect.Bottom+2);
Canvas.LineTo(Canvas.TextWidth('Подсказка') + 7,  Rect.Bottom+2);
Canvas.LineTo(Canvas.TextWidth('Подсказка') + 7, 2);

Exclude (Styles, fsBold);
Canvas.Font.Style := Styles;
Rect.Top := Rect.Bottom + 2;
Rect.Bottom := Height — 2;
Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, Caption);

Canvas.Pen.Color := 12626353;
// Canvas.RoundRect(0,0,Width-2,Height-2,15,15);
Canvas.Rectangle(0,0,Width-2,Height-2);

//  Canvas.Draw(MARGIN, MARGIN * 5, Application.Icon);
 //рисуем рамку окошка подсказки
//  SendMessage(Handle, WM_NCPAINT, 0, 0);
end;
//-----------------------------------------------------------------------------

procedure THintX.ActivateHint(Rect: TRect; const AHint: AnsiString);
var
regn1: HRGN;
begin
inherited;
// regn1 := CreateRoundRectRgn(0,0,Width,Height,15,15);
//  SetWindowRgn(Self.Handle,regn1,true);
end;
//-----------------------------------------------------------------------------
initialization
 //связываем наш новый класс с классом окошка
 //подсказки установленным поумолчанию:
 HintWindowClass := THintX;

end.

На С++ перевести несложно, но есть непонятные участки.
Guest
Отправлено: 02.11.2004, 14:37


Не зарегистрирован







QUOTE
есть непонятные участки

Какие ?
Rius
Отправлено: 02.11.2004, 16:36


Мастер участка

Группа: Участник
Сообщений: 321



Вот непонятно, куда это в билдере ставить:
CODE
initialization
//связываем наш новый класс с классом окошка
//подсказки установленным поумолчанию:
HintWindowClass := THintX;
Guest
Отправлено: 02.11.2004, 17:26


Не зарегистрирован







Секция инициализации.
Вызывается один раз при старте модуля.
Первый пришедший в голову аналог (по смыслу) на C
Application->OnShowHint = ваша_функция_показывающая_Hint
из топика https://rxlib.ru/forums/index.php?ac...6bc0e0233121b8e упоминавшегося ранее.

Вернуться в Вопросы программирования в C++Builder