[РЕШЕНО]:Индекс колонки с измененной шириной
Добавлено:
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;