Конференция "Начинающим" » Как получить координаты курсора в TStringGrid при DblClick? [D7, XP]
 
  • maxon (30.06.08 00:06) [0]
    Как можно узнать координаты курсора в таблице при двойном щелчке мыши?
    А еще лучше, сразу узнать координаты той ячейки, на которой кликнули.
  • Тын-Дын © (30.06.08 00:09) [1]
    Может стоило немного почитать форум и поискать сначала?

    http://pda.delphimaster.net/?n=18&search=DblClick
  • maxon (30.06.08 00:12) [2]
    Да вот, интернет медленный. А вопросы иной раз издалека начинают задавать. Всего и не перечитаешь.
  • Amoeba © (30.06.08 00:18) [3]

    > сразу узнать координаты той ячейки, на которой кликнули.
    >
    >

    MouseToCell
    Подробности по F1
  • maxon (30.06.08 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;

  • Игорь Шевченко © (30.06.08 00:33) [5]
    Убери fMain из кода
  • maxon (30.06.08 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 или щелкнул мышью в другом месте ) выделилась опять вся строка?
  • Игорь Шевченко © (30.06.08 00:53) [7]

    > Вообще я хотел чтобы по двойному щелчку в ячейки начиналось
    > ее редактирование, но при этом, чтобы в TStringGrid.Options
    > было goRowSelect.


    А зачем именно RowSelect ? Чтобы строка выделялась или чтобы клавишами вправо-влево тоже был переход по строкам ?
  • maxon (30.06.08 00:59) [8]
    2 Игорь Шевченко
    Чтобы строка выделялась. Но очередное раскрашивание таблицы не лучший вариант ( я и так каждый 2й столбик подкрашиваю ).
  • Германн © (30.06.08 02:25) [9]

    > maxon   (30.06.08 00:59) [8]
    >
    > 2 Игорь Шевченко
    > Чтобы строка выделялась. Но очередное раскрашивание таблицы
    > не лучший вариант ( я и так каждый 2й столбик подкрашиваю
    > ).
    >

    Сделай как в TBGrid. Добавь фиксированный столбец с индикатором.
  • ЮЮ © (30.06.08 04:36) [10]
    > Чтобы строка выделялась. Но очередное раскрашивание таблицы
    > не лучший вариант ( я и так каждый 2й столбик подкрашиваю
    > ).


    И что, раскраска всего одной строки (которая и так выполняется при RowSelect) кого-то сильно нагрузит?
  • maxon (30.06.08 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;



    Надеюсь, все правильно?
 
Конференция "Начинающим" » Как получить координаты курсора в TStringGrid при DblClick? [D7, XP]
Есть новые Нет новых   [132743   +23][b:0][p:0.003]