Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить координаты курсора в 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


Наверх

Титульная страница Поиск, карта сайта Написать письмо