Results 1 to 6 of 6

Thread: Headercontrol gebruik

  1. #1
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747

    Headercontrol gebruik

    Waar is de headercontrol eigenlijk voor. Kan je bijvoorbeeld deze koppelen aan een listview en als de listview horizontaal scrolt de headercontrol meegaat?
    Delphi is great. Lazarus is more powerfull

  2. #2
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Naar mijn weten heeft een THeaderControl helemaal niets met een TListView te maken.
    Ze stammen allebei uit het Win32 tijdperk, maar ik heb hem zelf nooit gebruikt, dus kan er verder weinig over zeggen, anders dan dat de twee niet te koppelen zijn.

    Vanwaar jouw vermoeden en/of wat wil je bereiken?
    TMemoryLeak.Create(Nil);

  3. #3
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Ik zoek iets waarmee je een extra regel in de titel krijgt. Zo goed ben ik niet in het verbouwen van een GUI component en een third party component zie ik niet zo snel zitten.
    Delphi is great. Lazarus is more powerfull

  4. #4
    "niet te koppelen" is een beetje overdreven Kan uiteraard wel alleen dien je zelf iets meer moeite te doen. Heb zelf een headercontrol boven een listbox staan en beide zijn "gekoppeld"

  5. #5
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Maar een listbox verschuift niet als een horizontale scrollbar in listview aanwezig is.
    Delphi is great. Lazarus is more powerfull

  6. #6
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    In het algemeen: een THeaderControl wordt gebruikt als een kop voor tabellarische gegevens. Daarvoor gebruik je doorgaans een grid of een ListView, maar voor een exotische layout van verschillende componenten in elke kolom kun je een HeaderControl gebruiken. Het biedt meer flexibiliteit t.o.v. een Grid of een ListView waarin elke kolom hetzelfde uiterlijk heeft of dezelfde soort gegevens bevat. Vergelijk het met een PageControl dat meer flexibiliteit geeft t.o.v. een TabControl. (Bron: StackOverflow).

    Jouw wens om een HeaderControl te gebruiken voor een ListView om meer tekst te kunnen weergeven is overigens helemaal niet ver gezocht, want de kop van een ListView ís echt een HeaderControl (waarvan je de handle zou kunnen opvragen met ListView_GetHeader(ListView1.Handle)). Echter om van die interne HeaderControl de hoogte aan te passen, én custom drawing in te schakelen lijkt me lastig, want dan ben je dus echt een standaard windows-control aan het verbouwen.

    Je kunt een ListView en een HeaderControl component aan elkaar "koppelen", maar je moet daarbij rekening houden met:
    - de bovenkant van de border van de ListView te vervangen, bijvoorbeeld door een Shape,
    - de HeaderControl te vergroten tot de ScrollRange van de ListView,
    - de HeaderControl horizontaal te verplaatsen a.g.v. de scrollpositie van de ListView,
    - de HeaderControl te beperken tot het formaat van de ListView door hem aan een container toe te voegen, bijvoorbeeld een Panel,
    - de ListView overriden om te kunnen inhaken op scrollactiviteit.

    Alles samengevoegd zou het zoiets kunnen worden als in de bijlage.

    Helaas biedt de VCL slechts beperkte custom drawing mogelijkheden voor een HeaderControl, dus een perfecte gelijkenis met een normaal ListView is niet gelukt.

    Veel plezier ermee en succes.

    Delphi Code:
    1. unit Unit1;
    2.  
    3. interface
    4.  
    5. uses
    6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes,
    7.   Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.ComCtrls, System.Math,
    8.   Vcl.ExtCtrls, System.Types;
    9.  
    10. type
    11.   TListView = class(Vcl.ComCtrls.TListView)
    12.   private
    13.     procedure WMHScroll(var Message: TWMScroll); message WM_HSCROLL;
    14.   end;
    15.  
    16.   TForm1 = class(TForm)
    17.     ListViewGroup: TPanel;
    18.     ListViewHeaderBorder: TShape;
    19.     ListView: TListView;
    20.     ListViewHeaderScroller: TPanel;
    21.     ListViewHeader: THeaderControl;
    22.     procedure ListViewHeaderDrawSection(HeaderControl: THeaderControl;
    23.       Section: THeaderSection; const Rect: TRect; Pressed: Boolean);
    24.     procedure ListViewHeaderSectionResize(HeaderControl: THeaderControl;
    25.       Section: THeaderSection);
    26.     procedure ListViewHeaderSectionDrag(Sender: TObject; FromSection,
    27.       ToSection: THeaderSection; var AllowDrag: Boolean);
    28.   private
    29.     procedure UpdateListViewHeaderPosition;
    30.   end;
    31.  
    32. implementation
    33.  
    34. {$R *.dfm}
    35.  
    36. procedure TForm1.ListViewHeaderDrawSection(HeaderControl: THeaderControl;
    37.   Section: THeaderSection; const Rect: TRect; Pressed: Boolean);
    38. const
    39.   DrawTextFlags = DT_EDITCONTROL or DT_END_ELLIPSIS or DT_LEFT or
    40.     DT_NOPREFIX or DT_TOP or DT_WORDBREAK;
    41.   Margin = 5;
    42. var
    43.   R: TRect;
    44.   S: String;
    45. begin
    46.   R := Rect;
    47.   R.Width := R.Width - 1;
    48.   S := Section.Text;
    49.   HeaderControl.Canvas.Brush.Color := ListView.Color;
    50.   HeaderControl.Canvas.FillRect(R);
    51.   R.Inflate(-Margin, -Margin);
    52.   DrawText(HeaderControl.Canvas.Handle, PChar(S), -1, R, DrawTextFlags or
    53.     DT_CALCRECT);
    54.   if R.Height > (Rect.Height - 2 * Margin) then
    55.     R.Height := Rect.Height - 2 * Margin
    56.   else
    57.     R.Offset(0, (Rect.Height - 2 * Margin - R.Height) div 2);
    58.   DrawText(HeaderControl.Canvas.Handle, PChar(S), -1, R, DrawTextFlags);
    59. end;
    60.  
    61. procedure TForm1.ListViewHeaderSectionDrag(Sender: TObject; FromSection,
    62.   ToSection: THeaderSection; var AllowDrag: Boolean);
    63. begin
    64.    if AllowDrag and (FromSection <> ToSection) then
    65.    begin
    66.      ListView.Columns.FindItemID(FromSection.ID).Index :=
    67.        ListView.Columns.FindItemID(ToSection.ID).Index;
    68.      ListView.Invalidate;
    69.    end;
    70. end;
    71.  
    72. procedure TForm1.ListViewHeaderSectionResize(HeaderControl: THeaderControl;
    73.   Section: THeaderSection);
    74. begin
    75.   ListView.Column[Section.Index].Width := Section.Width;
    76.   UpdateListViewHeaderPosition;
    77. end;
    78.  
    79. procedure TForm1.UpdateListViewHeaderPosition;
    80. var
    81.   ScrollPos: Integer;
    82. begin
    83.   ScrollPos := GetScrollPos(ListView.Handle, SB_HORZ);
    84.   ListViewHeader.Left := -ScrollPos + 1;
    85.   ListViewHeader.Width := ListView.Width + Max(0, ScrollPos) - 3;
    86. end;
    87.  
    88. { TListView }
    89.  
    90. procedure TListView.WMHScroll(var Message: TWMScroll);
    91. begin
    92.   inherited;
    93.   TForm1(Owner).UpdateListViewHeaderPosition;
    94. end;
    95.  
    96. end.

    Project1.zip
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •