Как **FIX** значение к высоте заголовка DBGrid?
Когда пользователь выбирает заголовок моей сетки, я бы хотел выделить заголовок столбца сетки.
Я использую следующий код для достижения этой цели:
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var I: Integer;
begin
//Prevent multiple clicks!
if fsBold in Column.Title.Font.Style then
Exit;
for I:= 0 to Column.Collection.Count-1 do
(Column.Collection.Items[I] as TColumn)
.Title.Font.Style := [];
Column.Title.Font.Style := [fsBold];
end;
Этот код работает нормально.
в OnFormCreate
Я определил следующую высоту заголовка:
type
DBGridHack = class(TDBGrid);
procedure TForm1.FormCreate(Sender: TObject);
begin
DBGridHack(DBGrid1).RowHeights[0] := 45;
end;
Когда я нажимаю в заголовке, процедура InternalLayout.MeasureTitleHeights
изменяет размер обратно на оригинал. Таким образом, каждый раз, когда я меняю стиль шрифта, мне нужно переопределить значение для RowHeight[0]
,
Код будет выглядеть так:
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var I: Integer;
begin
//Prevent multiple clicks!
if fsBold in Column.Title.Font.Style then
Exit;
for I:= 0 to Column.Collection.Count-1 do
(Column.Collection.Items[I] as TColumn)
.Title.Font.Style := [];
Column.Title.Font.Style := [fsBold];
//Every time!!
DBGridHack(DBGrid1).RowHeights[0] := 45;
end;
Существует другая проблема, когда пользователь переопределяет ширину столбца, в этом случае RowHeight[0]
также возвращается к исходному значению. Единственный способ решить эту проблему - наследовать DBGrid и переопределять ColWidthsChanged
, но сколько еще методов мне придется переопределить?
Почему это происходит?
Это ошибка, или мой код прослушивается?
Есть ли способ обойти это?
В простом вопросе.
Как исправить значение высоты заголовка DBGrid?
1 ответ
Кажется, если я переопределить Paint
Процедура, она будет работать как положено. Я не знаю, есть ли побочные эффекты в этом решении.
Это код для пользовательского DBGrid. Пожалуйста, если это не хорошее решение, я был бы признателен, если бы вы заявили об этом.
TDBGrid1 = class(TDBGrid)
private
FTitleFixedHeight: Integer;
function CheckHeaderFixed: Boolean;
protected
procedure Paint; override;
public
{ Public declarations }
published
property TitleFixedHeight: Integer read FTitleFixedHeight write FTitleFixedHeight;
end;
function TDBGrid1.CheckHeaderFixed: Boolean;
begin
Result := (TitleFixedHeight <> 0) and (RowHeights[0] <> TitleFixedHeight);
end;
procedure TDBGrid1.Paint;
begin
if CheckHeaderFixed then
begin
RowHeights[0] := TitleFixedHeight;
end;
inherited;
end;