-
Как можно узнать координаты курсора в таблице при двойном щелчке мыши? А еще лучше, сразу узнать координаты той ячейки, на которой кликнули.
-
-
Да вот, интернет медленный. А вопросы иной раз издалека начинают задавать. Всего и не перечитаешь.
-
> сразу узнать координаты той ячейки, на которой кликнули. > >
MouseToCell Подробности по F1
-
Да, вот спасибо еще раз (надеюсь не последний)!
procedure TfMain.sgMainDblClick(Sender: TObject);
var
pPnt: TPoint;
begin
GetCursorPos( pPnt );
pPnt:= sgMain.ScreenToClient( pPnt );
fMain.Caption:= IntToStr( sgMain.MouseCoord( pPnt.X, pPnt.Y ).X ) + ' X ' +
IntToStr( sgMain.MouseCoord( pPnt.X, pPnt.Y ).Y );
end;
-
Убери fMain из кода
-
Вообще я хотел чтобы по двойному щелчку в ячейки начиналось ее редактирование, но при этом, чтобы в TStringGrid.Options было goRowSelect. И вот что получилось:
procedure TfMain.sgMainDblClick(Sender: TObject);
var
pPnt: TPoint;
begin
GetCursorPos( pPnt );
pPnt:= sgMain.ScreenToClient( pPnt );
if xRow > 0 then
begin
sgMain.Options:= sgMain.Options - [goRowSelect] + [goEditing];
sgMain.Col:= sgMain.MouseCoord( pPnt.X, pPnt.Y ).X;
sgMain.Row:= sgMain.MouseCoord( pPnt.X, pPnt.Y ).Y;
sgMain.EditorMode:= true;
end;
end;
Но, как теперь все вернуть назад? Т.е. чтобы когда пользователь закончил редактировать ячейку ( нажал Enter, Esc или щелкнул мышью в другом месте ) выделилась опять вся строка?
-
> Вообще я хотел чтобы по двойному щелчку в ячейки начиналось > ее редактирование, но при этом, чтобы в TStringGrid.Options > было goRowSelect.
А зачем именно RowSelect ? Чтобы строка выделялась или чтобы клавишами вправо-влево тоже был переход по строкам ?
-
2 Игорь Шевченко Чтобы строка выделялась. Но очередное раскрашивание таблицы не лучший вариант ( я и так каждый 2й столбик подкрашиваю ).
-
> maxon (30.06.08 00:59) [8] > > 2 Игорь Шевченко > Чтобы строка выделялась. Но очередное раскрашивание таблицы > не лучший вариант ( я и так каждый 2й столбик подкрашиваю > ). >
Сделай как в TBGrid. Добавь фиксированный столбец с индикатором.
-
> Чтобы строка выделялась. Но очередное раскрашивание таблицы > не лучший вариант ( я и так каждый 2й столбик подкрашиваю > ).
И что, раскраска всего одной строки (которая и так выполняется при RowSelect) кого-то сильно нагрузит?
-
Вот, вообщем мое решение:
const
SGOPTS_RO = [goFixedVertLine,goFixedHorzLine,goColSizing,goColMoving,goRowSelect];
SGOPTS_RW = [goFixedVertLine,goFixedHorzLine,goColSizing,goColMoving,goEditing];
...
var
zACol, zARow: integer;
implementation
...
procedure TfMain.sgMainDblClick(Sender: TObject);
var
pPnt: TPoint; xCol, xRow: integer; begin
GetCursorPos( pPnt );
pPnt:= TStringGrid(Sender).ScreenToClient( pPnt );
xCol:= TStringGrid(Sender).MouseCoord( pPnt.X, pPnt.Y ).X;
xRow:= TStringGrid(Sender).MouseCoord( pPnt.X, pPnt.Y ).Y;
if xCol > 0 then
begin
TStringGrid(Sender).Options:= SGOPTS_RW;
TStringGrid(Sender).Col:= xCol; TStringGrid(Sender).Row:= xRow;
zACol:= xCol; zARow:= xRow;
TStringGrid(Sender).EditorMode:= true; end;
end;
procedure TfMain.sgMainSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
begin
if ( zACol <> ACol ) or ( zARow <> ARow ) then
TStringGrid(Sender).Options:= SGOPTS_RO;
zACol:= ACol; zARow:= ARow;
end;
Надеюсь, все правильно?
|