Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.017 c
15-1212475156
pasha_golub
2008-06-03 10:39
2008.07.27
Заюзать .lib от Borland C compiler в Delphi


15-1213218108
wl
2008-06-12 01:01
2008.07.27
статистика wi-fi соединений???


15-1212943505
Alexey
2008-06-08 20:45
2008.07.27
Организация доступа к данным


15-1213187241
Dennis I. Komarov
2008-06-11 16:27
2008.07.27
MS SQL Server 2005 EE


15-1213004432
LightRipple
2008-06-09 13:40
2008.07.27
Коварный inline :)