link8094 link8095 link8096 link8097 link8098 link8099 link8100 link8101 link8102 link8103 link8104 link8105 link8106 link8107 link8108 link8109 link8110 link8111 link8112 link8113 link8114 link8115 link8116 link8117 link8118 link8119 link8120 link8121 link8122 link8123 link8124 link8125 link8126 link8127 link8128 link8129 link8130 link8131 link8132 link8133 link8134 link8135 link8136 link8137 link8138 link8139 link8140 link8141 link8142 link8143 link8144 link8145 link8146 link8147 link8148 link8149 link8150 link8151 link8152 link8153 link8154 link8155 link8156 link8157 link8158 link8159 link8160 link8161 link8162 link8163 link8164 link8165 link8166 link8167 link8168 link8169 link8170 link8171 link8172 link8173 link8174 link8175 link8176 link8177 link8178 link8179 link8180 link8181 link8182 link8183 link8184 link8185 link8186 link8187 link8188 link8189 link8190 link8191 link8192 link8193 link8194 link8195 link8196 link8197 link8198 link8199 link8200 link8201 link8202 link8203 link8204 link8205 link8206 link8207 link8208 link8209 link8210 link8211 link8212 link8213 link8214 link8215 link8216 link8217 link8218 link8219 link8220 link8221 link8222 link8223 link8224 link8225 link8226 link8227 link8228 link8229 link8230 link8231 link8232 link8233 link8234 link8235
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