[РЕШЕНО]:Индекс колонки с измененной шириной
				
Добавлено: 
13.11.2016 15:28:46 zoltanleo
				Комрады, как получить сабж до того, как отпустил ЛКМ? 
OnColumnSized позволяет отловить измененную колонку после отпускания ЛКМ
OnKeyDown можно поймать только Row, нажал мышью не на колонку, а между ними?
			 
			
				Re: Индекс колонки с измененной шириной
				
Добавлено: 
13.11.2016 17:06:15 alexs
				Наверное - тут надо будет писать обработчики на OnMouseDown и OnMouseMove
			 
			
				Re: Индекс колонки с измененной шириной
				
Добавлено: 
21.12.2016 16:27:25 zoltanleo
				Вообщем, примерно такое решение созрело в течение 2 мес (заранее прошу прощение за индусский код)  
 
  - Код: Выделить всё
- 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;