![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить координаты курсора в TStringGrid при DblClick? [D7, XP]
maxon © (2008-06-30 00:06:00)Как можно узнать координаты курсора в таблице при двойном щелчке мыши?
А еще лучше, сразу узнать координаты той ячейки, на которой кликнули.
Amoeba (2008-07-01 02:00:00) [1]
> Зато, работает так:
>
> pPnt:= TStringGrid(Sender).ScreenToClient( pPnt );
>
> TStringGrid(Sender).MouseToCell( pPnt.X, pPnt.Y, xCol,
> xRow );
>
>
> Без этого - pPnt:= TStringGrid(Sender).ScreenToClient( pPnt
> );
> - никак!
>
Все правильно. Просто не было времени проверить, и я напрасно забраковал 1-ю строку, хотя и не было полной уверенности.
maxon (2008-07-01 01:48:00) [2]Зато, работает так:
pPnt:= TStringGrid(Sender).ScreenToClient( pPnt );
TStringGrid(Sender).MouseToCell( pPnt.X, pPnt.Y, xCol, xRow );
Без этого -pPnt:= TStringGrid(Sender).ScreenToClient( pPnt );- никак!
maxon (2008-07-01 01:42:00) [3]2 Amoeba
Мож я че не так делаю, но у меня так:TStringGrid(Sender).MouseToCell(pPnt.X, pPnt.Y, xCol, xRow);не работает :(
Amoeba (2008-07-01 01:14:00) [4]Замени эту хрень:
pPnt:= TStringGrid(Sender).ScreenToClient( pPnt );
// Находим позицию нашей ячейки
xCol:= TStringGrid(Sender).MouseCoord( pPnt.X, pPnt.Y ).X;
xRow:= TStringGrid(Sender).MouseCoord( pPnt.X, pPnt.Y ).Y;
на:
TStringGrid(Sender).MouseToCell(pPnt.X, pPnt.Y, xCol, xRow);
maxon (2008-06-30 23:44:00) [5]Вот, вообщем мое решение:
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;
// Редактируем ячейки начиная с первой строки (не 0-ой).
if xCol > 0 then
begin
// Устанавливаем атрибут goEditing и удаляем goRowSelect.
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
// Если фокус получает другая ячейка таблицы (не та которую мы редактируем),
// то удаляем атрибут goEditing и устанавливаем goRowSelect.
if ( zACol <> ACol ) or ( zARow <> ARow ) then
TStringGrid(Sender).Options:= SGOPTS_RO;
zACol:= ACol; // Сохраняем новые координаты
zARow:= ARow;
end;
Надеюсь, все правильно?
ЮЮ (2008-06-30 04:36:00) [6]> Чтобы строка выделялась. Но очередное раскрашивание таблицы
> не лучший вариант ( я и так каждый 2й столбик подкрашиваю
> ).
И что, раскраска всего одной строки (которая и так выполняется при RowSelect) кого-то сильно нагрузит?
Германн (2008-06-30 02:25:00) [7]
> maxon (30.06.08 00:59) [8]
>
> 2 Игорь Шевченко
> Чтобы строка выделялась. Но очередное раскрашивание таблицы
> не лучший вариант ( я и так каждый 2й столбик подкрашиваю
> ).
>
Сделай как в TBGrid. Добавь фиксированный столбец с индикатором.
maxon (2008-06-30 00:59:00) [8]2 Игорь Шевченко
Чтобы строка выделялась. Но очередное раскрашивание таблицы не лучший вариант ( я и так каждый 2й столбик подкрашиваю ).
Игорь Шевченко (2008-06-30 00:53:00) [9]
> Вообще я хотел чтобы по двойному щелчку в ячейки начиналось
> ее редактирование, но при этом, чтобы в TStringGrid.Options
> было goRowSelect.
А зачем именно RowSelect ? Чтобы строка выделялась или чтобы клавишами вправо-влево тоже был переход по строкам ?
maxon (2008-06-30 00:46:00) [10]Вообще я хотел чтобы по двойному щелчку в ячейки начиналось ее редактирование, но при этом, чтобы в 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 или щелкнул мышью в другом месте ) выделилась опять вся строка?
Игорь Шевченко (2008-06-30 00:33:00) [11]Убери fMain из кода
maxon (2008-06-30 00:22:00) [12]Да, вот спасибо еще раз (надеюсь не последний)!
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;
Amoeba (2008-06-30 00:18:00) [13]
> сразу узнать координаты той ячейки, на которой кликнули.
>
>
MouseToCell
Подробности по F1
maxon (2008-06-30 00:12:00) [14]Да вот, интернет медленный. А вопросы иной раз издалека начинают задавать. Всего и не перечитаешь.
Тын-Дын (2008-06-30 00:09:00) [15]Может стоило немного почитать форум и поискать сначала?
http://www.delphimaster.ru/cgi-bin/forum.pl?n=18&search=DblClick