2015-09-16 2 views
3

Я использую Delphi XE, и я хочу, чтобы стандартный ListView работал и выглядел так, как будто я хочу. Я хочу, чтобы listview был vsReport, поэтому у меня могут быть группы для моих элементов. Во время разработки я создал столбцы (один столбец с именем Тема), две группы и несколько элементов для каждой группы.Как предотвратить заголовок ListView от перекрытия верхней части первой группы?

Во время разработки ListView отлично смотрится, но во время выполнения моя первая группа частично скрыта под заголовком столбца. Вот изображения:

В DesignTime:

enter image description here

во время выполнения:

enter image description here

и вот мой DFM

object Form2: TForm2 
    Left = 326 
    Top = 150 
    Caption = 'Form2' 
    ClientHeight = 636 
    ClientWidth = 1289 
    Color = clBtnFace 
    Font.Charset = DEFAULT_CHARSET 
    Font.Color = clWindowText 
    Font.Height = -11 
    Font.Name = 'Tahoma' 
    Font.Style = [] 
    OldCreateOrder = False 
    PixelsPerInch = 96 
    TextHeight = 13 
    object ListView1: TListView 
    Left = 0 
    Top = 0 
    Width = 205 
    Height = 636 
    Align = alLeft 
    Columns = < 
     item 
     Caption = 'Topic' 
     Width = 200 
     end> 
    ColumnClick = False 
    DoubleBuffered = True 
    FullDrag = True 
    Groups = < 
     item 
     Header = 'First group' 
     GroupID = 0 
     State = [] 
     HeaderAlign = taLeftJustify 
     FooterAlign = taLeftJustify 
     Subtitle = 'Options bellow' 
     TitleImage = 1 
     end 
     item 
     Header = 'Settings' 
     GroupID = 1 
     State = [lgsNormal] 
     HeaderAlign = taLeftJustify 
     FooterAlign = taLeftJustify 
     Subtitle = 'Other options here' 
     TitleImage = 0 
     end> 
    HideSelection = False 
    HotTrack = True 
    HotTrackStyles = [htUnderlineCold, htUnderlineHot] 
    Items.ItemData = { 
     059E000000030000000000000000000000FFFFFFFF0000000000000000000000 
     000A4600690072007300740020006900740065006D000100000001000000FFFF 
     FFFF0000000000000000000000000B5300650063006F006E0064002000690074 
     0065006D000200000002000000FFFFFFFF000000000100000000000000134600 
     69007300720074002000730065007400740069006E0067007300200069007400 
     65006D00} 
    GroupView = True 
    RowSelect = True 
    ParentDoubleBuffered = False 
    ShowWorkAreas = True 
    TabOrder = 0 
    ViewStyle = vsReport 
    OnClick = ListView1Click 
    ExplicitTop = 8 
    ExplicitHeight = 497 
    end 
end 

Как предотвратить это?

ответ

2

Такое поведение присутствует даже в Delphi 10 Seattle. Я не уверен, что вызывает его, но вы можете обойти его, внеся существенные изменения в свойства списка, а затем вернув это изменение. Кажется, этого достаточно, чтобы получить представление списка. Например, этого будет достаточно:

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    ListView1.ViewStyle := vsIcon; 
    ListView1.ViewStyle := vsReport; 
end; 

Но это несколько над верхней частью. Копая в том, что эффект этот код имеет, главное, что он делает это, чтобы воссоздать окно. Что можно сделать так:

type 
    TProtectedHackListView = class(TListView); 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    TProtectedHackListView(ListView1).RecreateWnd; 
end; 

Или даже воссоздавать форму, которая, в свою очередь, будет воссоздавать детей:

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    RecreateWnd; 
end; 
+2

Параметр 'RecreateWnd()' на 'только TListView' будет достаточно. Изменение «ViewStyle» является излишним, так как это воссоздает окно формы и все дочерние элементы управления. –

+0

Спасибо вам обоим. Реми Лебо, ваш комментарий тоже очень помог. Спасибо – user1137313

+0

В качестве теста я создал 'TForm', метод' CreateWnd() 'напрямую вызывает те же API, что и' TListView', и в результате ListView не обнаруживает проблемы. Очень странно. Возможно, есть что-то лишнее, что «TListView» делает, чтобы запутать основное окно в том, как он управляет своим контентом по отношению к встроенному управлению заголовком. –

Смежные вопросы