[РЕШЕНО]:Индекс колонки с измененной шириной

Модераторы: alexs, Модераторы

[РЕШЕНО]:Индекс колонки с измененной шириной

Сообщение zoltanleo » 13.11.2016 15:28:46

Комрады, как получить сабж до того, как отпустил ЛКМ?

OnColumnSized позволяет отловить измененную колонку после отпускания ЛКМ
OnKeyDown можно поймать только Row, нажал мышью не на колонку, а между ними?
Последний раз редактировалось zoltanleo 21.12.2016 16:35:05, всего редактировалось 1 раз.
Аватара пользователя
zoltanleo
постоялец
 
Сообщения: 101
Зарегистрирован: 17.10.2013 10:55:01

Re: Индекс колонки с измененной шириной

Сообщение alexs » 13.11.2016 17:06:15

Наверное - тут надо будет писать обработчики на OnMouseDown и OnMouseMove
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3476
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Индекс колонки с измененной шириной

Сообщение zoltanleo » 21.12.2016 16:27:25

Вообщем, примерно такое решение созрело в течение 2 мес (заранее прошу прощение за индусский код) :roll:
Код: Выделить всё
function TForm1.ColNumIsResized(Sender: TRxDBGrid; Shift: TShiftState; X,
  Y: Integer; out AColNum: Integer): Boolean;
const
  //смещение курсора от границы между столбцами, когда он меняет форму на crHSplit
  OffSetMargin: Integer =2;
  var
    Col //общий номер столбца грида, включая индикатор
  , Row // строка грида, включая заголовок
  , ColNum // номер изменяемого столбца (исключает индикатор)
                : Longint;

    XX //координаты курсора на гриде по горизонтали
  , YY //координаты курсора на гриде по вертикали
  , IndWidth //поправка на ширину индикатора
  , total, i //переменные дял промежуточных расчетов
  //, RealCol  //номер столбца, ширину которого можно изменять в текущей позиции курсора
                : Integer;
  ColMargArray: Array of Integer;//массив с координатами правого края столбца (исключая индикатор) грида
begin
  AColNum:= -1;
  Result:= False;

  XX:=TRxDBGrid(Sender).ScreenToClient(Mouse.CursorPos).X;
  YY:=TRxDBGrid(Sender).ScreenToClient(Mouse.CursorPos).Y;
  TRxDBGrid(Sender).MouseToCell(xx,yy,Col,Row);

  if (Row > 0) then Exit; // если это не титл грида
  if not (ssLeft in Shift) then Exit; //если ЛКМ не нажата


  if dgIndicator in TRxDBGrid(Sender).Options
    then
      begin
        IndWidth:= IndicatorWidth;
        ColNum:= Col - 1;
      end
    else
      begin
        IndWidth:= 0;
        ColNum:= Col;
      end;

  total:= IndWidth;

  {TODO: обработать ситуацию невидимых столбцов}
  SetLength(ColMargArray,TRxDBGrid(Sender).Columns.Count);


  for i := 0 to Pred(TRxDBGrid(Sender).Columns.Count) do
    begin
      total:= total + TRxDBGrid(Sender).Columns.Items[i].Width;

      if (i = Pred(TRxDBGrid(Sender).Columns.Count))
        then
          ColMargArray[i]:= total - 1
        else
          ColMargArray[i]:= total;
    end;


  if ColNum >= 0 then
    begin
      {TODO: обработать ситуацию, когда столбцов всего один}
      if TRxDBGrid(Sender).Columns.Count = 1 then
        begin
          AColNum:= 0;
          Result:= True;
          Exit;
        end;

      //не на границе ли столбцов курсор
      for i := Low(ColMargArray) to High(ColMargArray) do
        if (XX = ColMargArray[i]) then
          begin
            AColNum:= i;
            Break;
          end;
      //курсор вне границ столбцов
      if AColNum = -1 then
        begin
          if ColNum = Low(ColMargArray) //если это первый столбец
            then
              begin
                //мы отошли от границы столбца влево не более, чем
                //на OffSetMargin пикселей (курсор имеет форму crHSplit)
               if ((ColMargArray[ColNum] - XX) <= OffSetMargin)
                 then
                   AColNum:= ColNum;
              end
            else
              if ColNum = High(ColMargArray) //если это последний столбец
                then
                  begin
                    //мы отошли от границы предыдущего столбца вправо не более, чем
                    //на OffSetMargin пикселей (курсор имеет форму crHSplit)
                    if (XX - ColMargArray[ColNum-1]) <= OffSetMargin
                      then
                        AColNum:= (ColNum - 1);

                    //мы отошли от границы этого столбца влево не более, чем
                    //на OffSetMargin - 1 пикселей (курсор имеет форму crHSplit и еще позволяет изменять его ширину)
                    if ((ColMargArray[ColNum] - XX) <= (OffSetMargin - 1))
                      then
                        AColNum:= ColNum;
                  end
                else //остальные столбцы
                  begin
                    //мы отошли от границы предыдущего столбца вправо не более, чем
                    //на OffSetMargin пикселей (курсор имеет форму crHSplit)
                    if (XX - ColMargArray[ColNum-1]) <= OffSetMargin
                      then
                        AColNum:= (ColNum - 1);

                    //мы отошли от границы этого столбца влево не более, чем
                    //на OffSetMargin пикселей (курсор имеет форму crHSplit)
                    if ((ColMargArray[ColNum] - XX) <= OffSetMargin)
                      then
                        AColNum:= ColNum;
                  end;
        end;
    end;

  Result:= (AColNum >= 0);
end;                                                                     


Применение
Код: Выделить всё
procedure TForm1.rxgridMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var Col: Integer;
begin
with Memo1 do
begin
  Clear;
  if ColNumIsResized(rxgrid,Shift,x,y,Col)
    then
      Lines.Add(Format('Col = %d',[Col]))
    else
      begin
        Clear;
        Lines.Add('Ресайзинг столбца невозможен');
      end;
end;
end;
Аватара пользователя
zoltanleo
постоялец
 
Сообщения: 101
Зарегистрирован: 17.10.2013 10:55:01


Вернуться в RxLib

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru
cron