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