Gedeon |
Отправлено: 06.07.2004, 17:06 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Как получить колонку и строку ячейки, над которой находится указатель мыши или по координатам на гриде? Собственно еще хотелось бы получить значение в ячейке по колонке, строке без перехода на эту запись. Чето у меня не получается нифига, в стринггриде без проблем, но вот в DBGridEh че-то никак .
Отредактировано 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); |
то, что надо, проглядел .
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 файл, еще раз огромное спасибо
CODE |
class TDBGridtmp1 : public TDBGrid
{
public:
int __fastcall GetRow(void) {return TCustomGrid::Row;};
};
//--------------------------------------------------------------------------- |
|
|
|