Звонит программер своей девушке в дверь, а она не открывает.
- Неустранимая ошибка по адресу Lenin st. 10/5/44 второй этаж, - подумал программер.
Это маленькая вставка в Ваш наследник от TCustomDBGrid, которая решает данную
задачу.
// DBGRIDEX.PAS// ----------------------------------------------------------------------------destructor TDbGridEx.Destroy;
begin
_HideColumnsValues.Free;
_HideColumns.Free;
inherited Destroy;
end;
// ----------------------------------------------------------------------------constructor TDbGridEx.Create(Component: TComponent);
begininherited Create(Component);
FFreezeCols := ?;
_HideColumnsValues := TList.Create;
_HideColumns := TList.Create;
end;
// ----------------------------------------------------------------------------procedure TDbGridEx.KeyDown(var Key: Word; Shift: TShiftState);
beginif (Key = VK_LEFT) then
ColBeforeEnter(-1);
if (Key = VK_RIGHT) then
ColBeforeEnter(1);
inherited;
end;
// ----------------------------------------------------------------------------procedure TDbGridEx.SetFreezeColor(AColor: TColor);
begin
InvalidateRow(0);
end;
// ----------------------------------------------------------------------------procedure TDbGridEx.SetFreezeCols(AFreezeCols: Integer);
begin
FFreezeCols := AFreezeCols;
InvalidateRow(0);
end;
// ----------------------------------------------------------------------------procedure TDbGridEx.ColEnter;
begin
ColBeforeEnter(0);
if Assigned(OnColEnter) then
OnColEnter(Self);
end;
// ----------------------------------------------------------------------------procedure TDbGridEx.ColBeforeEnter(ADelta: Integer);
var
nIndex: Integer;
function ReadWidth: Integer;
var
i: Integer;
begin
i := _HideColumns.IndexOf(Columns[nIndex]);
if i = -1 then
result := 120
else
result := Integer(_HideColumnsValues[i]);
end;
procedure SaveWidth;
var
i: Integer;
begin
i := _HideColumns.IndexOf(Columns[nIndex]);
if i <> -1 thenbegin
_HideColumnsValues[i] := Pointer(Columns[nIndex].Width);
endelsebegin
_HideColumns.Add(Columns[nIndex]);
_HideColumnsValues.Add(Pointer(Columns[nIndex].Width));
end;
end;
beginfor nIndex := 0 to Columns.Count - 1 dobeginif (Columns[nIndex].Width = 0) thenbeginif (nIndex + 1 <= FreezeCols) or (nIndex >= SelectedIndex + ADelta) then
Columns[nIndex].Width := ReadWidth;
endelsebegin
SaveWidth;
if (nIndex + 1 > FreezeCols) and
(nIndex < SelectedIndex + ADelta) and
(nIndex + 1 < Columns.Count) and
(FreezeCols > 0) then
Columns[nIndex].Width := 0;
end;
end;
end;
Программный код на Delphi, который расширяет компонент TCustomDBGrid для возможности замораживания одного или более столбцов. Компонент TDbGridEx имеет несколько методов и свойств для управления замороженными столбцами.
Вот краткое описание кода:
В деструкторе освобождается список _HideColumnsValues и _HideColumns.
В конструкторе инициализируется список _HideColumnsValues и _HideColumns, а также устанавливается свойство FFreezeCols.
Метод обработки события KeyDown используется для навигации между столбцами. При нажатии клавиши влево или вправо вызывается метод ColBeforeEnter с дельтой -1 или 1 соответственно.
Методы SetFreezeColor и SetFreezeCols используются для установки цвета и количества замороженных столбцов.
Метод обработки события ColEnter вызывается, когда пользователь вводит столбец. Он вызывает метод ColBeforeEnter с дельтой 0.
Метод ColBeforeEnter перебирает все столбцы, проверяет ширину (если она равна нулю, то столбец заморожен), и adjusts ширину соответственно.
Чтобы зафиксировать один или более столбцов в TDBGrid, можно использовать этот код, создав экземпляр TDbGridEx и установив свойство FreezeCols в соответствующее значение. Например:
varGrid:TDbGridEx;beginGrid:=TDbGridEx.Create(nil);try// Установите свойства grid...Grid.FreezeCols:=2;// Заморозить столбцы 0 и 1// ...finallyFreeAndNil(Grid);end;end;
Этот код заморозит первый два столбца в grid.
Обратите внимание, что это реализация предполагает, что замороженные столбцы смежны друг с другом. Если вам нужно зафиксировать не смежные столбцы, вам придется изменить метод ColBeforeEnter соответствующим образом.
В статье описывается способ фиксации одного или нескольких столбцов в TDBGrid 2, используяinheritance от TCustomDBGrid и добавление новых методов и переменных.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.