У меня есть Delphi DBGrid, который выглядит нормально при первой загрузке. Я настроил событие OnTitleClick, которое сортирует DBGrid по столбцу при нажатии на заголовок. Как только вы нажимаете на заголовок, заголовок столбца действует как нажатие кнопки, и появляется уродливая черная линия. (См. рис. 2 ниже)
Как только событие щелчка выполнено, сетка снова выглядит нормально.
Как предотвратить появление этой черной линии при нажатии на заголовок столбца?
РЕДАКТИРОВАТЬ: контроль качества отправлен в Embarcadero
Хотя отключение возможности изменения размера столбцов приводит к исчезновению поведения черной линии, это лишает очень приятную функцию. Я думаю, что это поведение должно быть исправлено. Я отправил следующий QC 98255 в Embarcadero. Пожалуйста, проголосуйте за эту запись.
ОБНОВЛЕНИЕ: 30 июля 2017 г.
Я нашел, где рисуется эта горизонтальная черная линия.
Vcl.Grids > процедура TCustomGrid.DrawMove;
Для Canvas.Pen.Width установлено значение 5. Я изменил его так, что Canvas.Pen.Width := 1;
Это выглядит намного лучше. Теперь, когда я нажимаю на ячейку заголовка "Contact_Last", черная индикаторная линия имеет ширину всего один пиксель и гораздо менее навязчива.
procedure TCustomGrid.DrawMove;
var
OldPen: TPen;
Pos: Integer;
R: TRect;
begin
OldPen := TPen.Create;
try
with Canvas do
begin
OldPen.Assign(Pen);
try
Pen.Style := psDot;
Pen.Mode := pmXor;
//+----------------------------------------------------------------+
// Modified 2017-07-30 by Michael J Riley (MJR)
// Changed Pen.Width from 5 to 1
// This makes the vertical black move-indicator line 1 pixel wide
// Which is the same width as column resize vertical line
//+----------------------------------------------------------------+
//Pen.Width := 5;
Pen.Width := 1;
if FGridState = gsRowMoving then
begin
R := CellRect(0, FMovePos);
if FMovePos > FMoveIndex then
Pos := R.Bottom else
Pos := R.Top;
MoveTo(0, Pos);
LineTo(ClientWidth, Pos);
end
else
begin
R := CellRect(FMovePos, 0);
if FMovePos > FMoveIndex then
if not UseRightToLeftAlignment then
Pos := R.Right
else
Pos := R.Left
else
if not UseRightToLeftAlignment then
Pos := R.Left
else
Pos := R.Right;
MoveTo(Pos, 0);
LineTo(Pos, ClientHeight);
end;
finally
Canvas.Pen := OldPen;
end;
end;
finally
OldPen.Free;
end;
end;