Waar is de headercontrol eigenlijk voor. Kan je bijvoorbeeld deze koppelen aan een listview en als de listview horizontaal scrolt de headercontrol meegaat?
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
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);
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
"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"
Maar een listbox verschuift niet als een horizontale scrollbar in listview aanwezig is.
Delphi is great. Lazarus is more powerfull
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:
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.ComCtrls, System.Math, Vcl.ExtCtrls, System.Types; type TListView = class(Vcl.ComCtrls.TListView) private procedure WMHScroll(var Message: TWMScroll); message WM_HSCROLL; end; TForm1 = class(TForm) ListViewGroup: TPanel; ListViewHeaderBorder: TShape; ListView: TListView; ListViewHeaderScroller: TPanel; ListViewHeader: THeaderControl; procedure ListViewHeaderDrawSection(HeaderControl: THeaderControl; Section: THeaderSection; const Rect: TRect; Pressed: Boolean); procedure ListViewHeaderSectionResize(HeaderControl: THeaderControl; Section: THeaderSection); procedure ListViewHeaderSectionDrag(Sender: TObject; FromSection, ToSection: THeaderSection; var AllowDrag: Boolean); private procedure UpdateListViewHeaderPosition; end; implementation {$R *.dfm} procedure TForm1.ListViewHeaderDrawSection(HeaderControl: THeaderControl; Section: THeaderSection; const Rect: TRect; Pressed: Boolean); const DrawTextFlags = DT_EDITCONTROL or DT_END_ELLIPSIS or DT_LEFT or DT_NOPREFIX or DT_TOP or DT_WORDBREAK; Margin = 5; var R: TRect; S: String; begin R := Rect; R.Width := R.Width - 1; S := Section.Text; HeaderControl.Canvas.Brush.Color := ListView.Color; HeaderControl.Canvas.FillRect(R); R.Inflate(-Margin, -Margin); DrawText(HeaderControl.Canvas.Handle, PChar(S), -1, R, DrawTextFlags or DT_CALCRECT); if R.Height > (Rect.Height - 2 * Margin) then R.Height := Rect.Height - 2 * Margin else R.Offset(0, (Rect.Height - 2 * Margin - R.Height) div 2); DrawText(HeaderControl.Canvas.Handle, PChar(S), -1, R, DrawTextFlags); end; procedure TForm1.ListViewHeaderSectionDrag(Sender: TObject; FromSection, ToSection: THeaderSection; var AllowDrag: Boolean); begin if AllowDrag and (FromSection <> ToSection) then begin ListView.Columns.FindItemID(FromSection.ID).Index := ListView.Columns.FindItemID(ToSection.ID).Index; ListView.Invalidate; end; end; procedure TForm1.ListViewHeaderSectionResize(HeaderControl: THeaderControl; Section: THeaderSection); begin ListView.Column[Section.Index].Width := Section.Width; UpdateListViewHeaderPosition; end; procedure TForm1.UpdateListViewHeaderPosition; var ScrollPos: Integer; begin ScrollPos := GetScrollPos(ListView.Handle, SB_HORZ); ListViewHeader.Left := -ScrollPos + 1; ListViewHeader.Width := ListView.Width + Max(0, ScrollPos) - 3; end; { TListView } procedure TListView.WMHScroll(var Message: TWMScroll); begin inherited; TForm1(Owner).UpdateListViewHeaderPosition; end; end.
Project1.zip
(Sender as TNLDUser).Signature := 'Groeten van Albert';
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks