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

 
Ячейка в DBGridEh
Gedeon
Отправлено: 06.07.2004, 17:06


Ветеран

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



Как получить колонку и строку ячейки, над которой находится указатель мыши или по координатам на гриде? Собственно еще хотелось бы получить значение в ячейке по колонке, строке без перехода на эту запись. Чето у меня не получается нифига, в стринггриде без проблем, но вот в DBGridEh че-то никак sad.gif .

Отредактировано Gedeon — 06/07/2004, 18:09
Admin
Отправлено: 07.07.2004, 09:00


Владимир

Группа: Администратор
Сообщений: 1190



CODE

Returns the screen coordinates of a cell in the grid

function CellRect(ACol, ARow: Longint): TRect;



Наверное придется написать что-то типа, вроде работает:

CODE

//---------------------------------------------------------------------------

void __fastcall TForm1::DBGridEh1MouseMove(TObject *Sender,
     TShiftState Shift, int X, int Y)
{

for(int i=0; i<DBGridEh1->Columns->Count; i++){
   for(int j=0; j<DBGridEh1->RowCount; j++){
      bool isX = false, isY = false;
      TRect Tr = DBGridEh1->CellRect(i,j);
      if(X >= Tr.Left && X <= Tr.Right) isX = true;
      if(Y >= Tr.Top && Y <= Tr.Bottom) isY = true;
      if(isX && isY) Label1->Caption = IntToStr(j) + ":" + IntToStr(i);
      }
   }
}
//---------------------------------------------------------------------------

AVC
Отправлено: 07.07.2004, 09:21


Ветеран

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



Вот недавно писал на форум www.bcbdev.ru для DBGrid. Может подойдет.

CODE

class TDBGridtmp1 : public TDBGrid
{
public:
int __fastcall GetRow(void) {return TCustomGrid::Row;};
};

void __fastcall TForm1::DBGrid1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{
TGridCoord cell = DBGrid1->MouseCoord(X, Y);
// вместо TCustomDBGrid.RawToDataColumn(ACol)
int clnidx = cell.X — (DBGrid1->Options.Contains(dgIndicator)? 1 : 0);
AnsiString fname = (clnidx >= 0 && clnidx < DBGrid1->Columns->Count)?
 DBGrid1->Columns->Items[clnidx]->FieldName : AnsiString("");

int row;
{ TDBGridtmp1 *gtm = (TDBGridtmp1*)DBGrid1;
 row = gtm->GetRow();
}
int dlty = 0;
if (DBGrid1->Options.Contains(dgTitles))
{ if (cell.Y > 0)   dlty = cell.Y — row; }
else
{ if (cell.Y >= 0)   dlty = cell.Y — row; }

if (dlty) DBGrid1->DataSource->DataSet->MoveBy(dlty);

Lbl1->Caption =
fname +
", x=" + AnsiString(clnidx) +
", y=" + AnsiString(cell.Y) +
", r=" + AnsiString(row) +
"" ;
}
Gedeon
Отправлено: 07.07.2004, 12:27


Ветеран

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



О, спасибо,
CODE

struct TGridCoord

{
 int X;
 int Y;
};

TGridCoord __fastcall MouseCoord(int X, int Y);

то, что надо, проглядел sad.gif .
QUOTE

значение в ячейке по колонке, строке без перехода на эту запись.

похоже не получится, но все равно так даже удобнее оказалось.
Вообще это надо было для того чтобы при вождении над первой колонкой грида крысой показывался хинт над каждой строкой, текст которого находится в четвертой невидимой колонке.
Вот код
это в конструктор формы:
CODE

   Application->HintPause = 100;
   Application->HintShortPause = 100;
   Application->HintHidePause = 2500;
   Application->OnShowHint = DoShowHint;

это собственно сама функция
CODE

void __fastcall TFMailNotifier::DoShowHint(System::AnsiString & HintStr,
bool & CanShow, THintInfo & HintInfo)
{

   CanShow=true;
   if(HintInfo.HintControl==DBGridEh2){
       if(Mouse->Capture){
           CanShow=false;
           return;
       }


       HintInfo.ReshowTimeout=100;
       TPoint pnt;

       SIZE strsize;
       TRect CellRect;

       TGridCoord GC = DBGridEh2->MouseCoord(HintInfo.CursorPos.x,HintInfo.CursorPos.y);

       int grCol = GC.X ,grRow = GC.Y;
       if ((grCol!=0)||(grRow<1)){
           CanShow=false;
           return;
       }
       int row;
       {
           TDBGridtmp1 *gtm = (TDBGridtmp1*)DBGridEh2;
           row = gtm->GetRow();
       }
       int dlty = 0;
       if (DBGridEh2->Options.Contains(dgTitles)){
           if (grRow > 0)   dlty = grRow — row;
       }
       else{
           if (grRow >= 0)   dlty = grRow — row;
       }
       if (dlty) DBGridEh2->DataSource->DataSet->MoveBy(dlty);

       HintStr=DBGridEh2->Columns->Items[3]->Field->AsString;

   }
}
//---------------------------------------------------------------------------

Не забыть у грида поставить ShowHint=true;
Ну и класс от AVC в h файл, еще раз огромное спасибо biggrin.gif
CODE

class TDBGridtmp1 : public TDBGrid
{
public:
int __fastcall GetRow(void) {return TCustomGrid::Row;};
};
//---------------------------------------------------------------------------

Вернуться в Работа с базами данных в C++Builder