Если вы используете VirtualStringTree с установленным по умолчанию выравниванием текста в заголовке столбца taLeftJustify, но хотите выровнять ячейки/узлы в этом столбце по правому краю, а текст заголовка столбца - по левому, то эта статья поможет вам решить эту проблему.
Вопрос:
У меня есть VirtualStringTree с установленным по умолчанию выравниванием текста в заголовке столбца taLeftJustify. Есть ли способ установить выравнивание ячеек/узлов этого столбца на taRightJustify, чтобы узлы выравнивались по правому краю, а текст заголовка столбца - по левому?
Желаемый результат (в столбце 1):
Я использую версию VT 4.5.5.
Ответ:
Чтобы выровнять текст заголовка столбца по левому краю, используйте:
Чтобы выровнять ячейки/узлы столбца по правому краю, используйте:
Header.Columns[x].Alignment := taRightJustify;
где x - ваш столбец.
Комментарии:
В моей старой версии VT (4.5.5) нет свойства CaptionAlignment. Однако, после изучения версии 5.3.0, я считаю, что это правильный ответ, поэтому я принимаю его. Если бы я использовал более новую версию VT (что в настоящее время невозможно), я бы сам разобрался в этом. Спасибо.
Если у вас также нет свойства CaptionAlignment в вашей версии VT, вы можете использовать событие OnAdvancedHeaderDraw, чтобы нарисовать свои собственные заголовки столбцов. Установите выравнивание столбца 1 на taRightJustify и обработайте рисование текста заголовка для нужного столбца самостоятельно.
Пример кода на Object Pascal (Delphi) для альтернативного ответа:
type
TVirtualTreeColumnsAccess = class(TVirtualTreeColumns);
procedure TForm1.FormCreate(Sender: TObject);
begin
VST.Header.Options := VST.Header.Options + [hoOwnerDraw];
VST.OnHeaderDrawQueryElements := VSTHeaderDrawQueryElements;
VST.OnAdvancedHeaderDraw := VSTAdvancedHeaderDraw;
end;
procedure TForm1.VSTHeaderDrawQueryElements(Sender: TVTHeader; var PaintInfo: THeaderPaintInfo;
var Elements: THeaderPaintElements);
begin
{ Use OwnerDraw only for desired column(s) }
{ other columns drawing will be handled by VST }
if Assigned(PaintInfo.Column) and (PaintInfo.Column.Index = 1) then
Elements := [hpeText];
end;
procedure TForm1.VSTAdvancedHeaderDraw(Sender: TVTHeader;
var PaintInfo: THeaderPaintInfo; const Elements: THeaderPaintElements);
var
DrawFormat: Cardinal;
R: TRect;
begin
{ The event will fire only for the desired column(s) }
if (hpeText in Elements) and Assigned(PaintInfo.Column) then
with PaintInfo do
begin
DrawFormat := DT_LEFT or DT_TOP or DT_NOPREFIX;
if Column.UseRightToLeftReading then
DrawFormat := DrawFormat or DT_RTLREADING;
R := TextRectangle;
R.Left := PaintRectangle.Left + Column.Margin;
TVirtualTreeColumnsAccess(Column.Owner).DrawButtonText(
TargetCanvas.Handle, Column.Text, R,
IsEnabled,
IsHoverIndex and (hoHotTrack in Sender.Options)
and not (tsUseThemes in Sender.Treeview.TreeStates),
DrawFormat);
end;
end;
Примечание: Убедитесь, что вы импортируете необходимые библиотеки и правильно настраиваете ваш VirtualStringTree, чтобы использовать этот код.
Настройка выравнивания ячеек/узлов столбца в TVirtualStringTree.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.