unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ImgList, EasyListview, MPCommonUtilities, MPCommonObjects; type TForm1 = class(TForm) Panel1: TPanel; ImageList1: TImageList; ImageList2: TImageList; Splitter1: TSplitter; RadioGroupHintType: TRadioGroup; CheckBoxAllowOnItemsOnly: TCheckBox; cbViews: TComboBox; CheckBoxCustomizeText: TCheckBox; Label1: TLabel; VCLv: TEasyListview; EditPauseDelayTime: TEdit; Label2: TLabel; Label3: TLabel; CheckBoxHeader: TCheckBox; procedure FormCreate(Sender: TObject); procedure InvalidateCLVClick(Sender: TObject); procedure RadioGroupHintTypeClick(Sender: TObject); procedure cbViewsChange(Sender: TObject); procedure FormShow(Sender: TObject); procedure CheckBoxCustomizeTextClick(Sender: TObject); procedure VCLvHintPauseTime(Sender: TCustomEasyListview; HintWindowShown: Boolean; var PauseDelay: Integer); procedure CheckBoxHeaderClick(Sender: TObject); procedure VCLvHintCustomDraw(Sender: TCustomEasyListview; const TargetObj: TEasyCollectionItem; const Info: TEasyHintInfo); procedure VCLvHintCustomInfo(Sender: TCustomEasyListview; const TargetObj: TEasyCollectionItem; Info: TEasyHintInfo); procedure VCLvHintPopup(Sender: TCustomEasyListview; TargetObj: TEasyCollectionItem; HintType: TEasyHintType; MousePos: TPoint; var Text: WideString; var HideTimeout, ReShowTimeout: Integer; var Allow: Boolean); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.InvalidateCLVClick(Sender: TObject); begin VCLv.Invalidate; end; procedure TForm1.FormCreate(Sender: TObject); var i, j, k: Integer; Item: TEasyCollectionItem; Column: TEasyCollectionItem; Group: TEasyCollectionItem; begin VCLv.BeginUpdate; try for i := 0 to 9 do begin Column := VCLv.Header.Columns.Add; Column.Caption := 'Column: ' + IntToStr(i); Column.ImageIndex := Random(ImageList1.Count); TEasyColumnStored( Column).Width := 120; end; for i := 0 to 9 do begin Group := VCLv.Groups.Add; if i mod 2 = 0 then Group.Caption := 'Group: ' + IntToStr(i) else Group.Caption := 'Group: ' + IntToStr(i) + ' has an very long caption that just goes on forever'; Group.ImageIndex := Random(ImageList1.Count); for j := 0 to 19 do begin Item := TEasyGroupStored(Group).Items.Add; if j mod 2 = 0 then Item.Caption := 'Item: ' + IntToStr(j) else Item.Caption := 'Item: ' + IntToStr(j) + ' has an very long caption that just goes on forever'; Item.ImageIndex := Random(ImageList1.Count); // Fill in the Item Details for k := 1 to 9 do Item.Captions[k] := 'Item: ' + IntToStr(j) + ' Column: ' + IntToStr(k); end end; finally VCLv.EndUpdate(); end end; procedure TForm1.RadioGroupHintTypeClick(Sender: TObject); begin VCLv.HintType := TEasyHintType( RadioGroupHintType.ItemIndex); CheckBoxCustomizeText.Enabled := RadioGroupHintType.ItemIndex = 0; CheckBoxAllowOnItemsOnly.Enabled := CheckBoxCustomizeText.Checked; VCLv.Invalidate end; procedure TForm1.cbViewsChange(Sender: TObject); begin VCLv.View := TEasyListStyle( cbViews.ItemIndex) end; procedure TForm1.FormShow(Sender: TObject); begin FillStringsWithEasyListStyles(cbViews.Items); cbViews.ItemIndex := Ord(VCLv.View); end; procedure TForm1.CheckBoxCustomizeTextClick(Sender: TObject); begin CheckBoxAllowOnItemsOnly.Enabled := CheckBoxCustomizeText.Checked; end; procedure TForm1.VCLvHintPauseTime(Sender: TCustomEasyListview; HintWindowShown: Boolean; var PauseDelay: Integer); begin // If the Hint Window is already shown then wait a bit between showing // it again as the mouse is moved around the control // This is the same property that can be globally set in // Application.HintShortPause // But here it can be set dynamically. // Unfortunately the VCL does not allow us to know what the old hint // control was nor the new one. It also does not allow us to see the // cursor postion. if HintWindowShown then PauseDelay := StrToInt(EditPauseDelayTime.Text) end; procedure TForm1.CheckBoxHeaderClick(Sender: TObject); begin VCLv.Header.Visible := CheckBoxHeader.Checked end; procedure TForm1.VCLvHintCustomDraw(Sender: TCustomEasyListview; const TargetObj: TEasyCollectionItem; const Info: TEasyHintInfo); var R: TRect; begin if TargetObj is TEasyItem then begin R := Info.Bounds; Imagelist2.DrawingStyle := dsTransparent; ImageList2.Draw(Info.Canvas, 2, (RectHeight(R) - 32) div 2, TEasyItem( TargetObj).ImageIndex mod ImageList2.Count); R.Left := R.Left + 36; DrawTextWEx(Info.Canvas.Handle, Info.Text, R, [dtSingleLine, dtLeft, dtVCenter], 1); end end; procedure TForm1.VCLvHintCustomInfo(Sender: TCustomEasyListview; const TargetObj: TEasyCollectionItem; Info: TEasyHintInfo); var R: TRect; begin if Info.HintType = ehtCustomDraw then begin Info.Text := 'Custom Draw HintText for Item: ' + IntToStr(TargetObj.Index); R := Rect(0, 0, Screen.Width, Screen.Height); DrawTextWEx(Info.Canvas.Handle, Info.Text, R, [dtSingleLine, dtCalcRect, dtCalcRectAdjR], -1); OffsetRect(R, -R.Left, -R.Top); R.Right := R.Right + 32 + 4 + 4; if R.Bottom < 32 + 2 then R.Bottom := 32 + 2; Info.Bounds := R; end end; procedure TForm1.VCLvHintPopup(Sender: TCustomEasyListview; TargetObj: TEasyCollectionItem; HintType: TEasyHintType; MousePos: TPoint; var Text: WideString; var HideTimeout, ReShowTimeout: Integer; var Allow: Boolean); var ItemInfo: TEasyItemHitTestInfoSet; GroupInfo: TEasyGroupHitTestInfoSet; ViewPt: TPoint; begin ViewPt := VCLv.Scrollbars.MapWindowToView(MousePos); if HintType = ehtCustomDraw then begin Allow := TargetObj is TEasyItem; end else if HintType = ehtText then begin Allow := (TargetObj is TEasyItem) or (TargetObj is TEasyGroup); if Allow then begin if TargetObj is TEasyItem then begin TEasyItem( TargetObj).HitTestAt(ViewPt, ItemInfo); if CheckBoxCustomizeText.Checked then begin Text := 'Hovering over' + #13+ #10 + 'Item #' + IntToStr(TargetObj.Index); if ehtOnIcon in ItemInfo then Text := Text + #13+ #10 + 'OnIcon'; if ehtOnClickSelectBounds in ItemInfo then Text := Text + #13+ #10 + 'OnClickSelectBound'; if ehtOnDragSelectBounds in ItemInfo then Text := Text + #13+ #10 + 'OnDragSelectBound'; if ehtOnText in ItemInfo then Text := Text + #13+ #10 + 'OnTextRect'; if ehtOnEdit in ItemInfo then Text := Text + #13+ #10 + 'OnEditRect'; if ehtOnCheck in ItemInfo then Text := Text + #13+ #10 + 'OnCheckRect'; end else Allow := ItemInfo <> [] end else if TargetObj is TEasyGroup then begin TEasyGroup(TargetObj).HitTestAt(ViewPt, GroupInfo); if CheckBoxCustomizeText.Checked then begin Text := 'Hovering over' + #13+ #10 + 'Group #' + IntToStr(TargetObj.Index); if egtOnBand in GroupInfo then Text := Text + #13+ #10 + 'OnBand'; if egtOnExpandButton in GroupInfo then Text := Text + #13+ #10 + 'OnExpandButton'; if egtOnIcon in GroupInfo then Text := Text + #13+ #10 + 'OnIcon'; if egtOnLabel in GroupInfo then Text := Text + #13+ #10 + 'OnOnLabel'; if egtOnText in GroupInfo then Text := Text + #13+ #10 + 'OnOnText'; if egtOnHeader in GroupInfo then Text := Text + #13+ #10 + 'OnHeader'; if egtOnFooter in GroupInfo then Text := Text + #13+ #10 + 'OnFooter'; if egtOnLeftMargin in GroupInfo then Text := Text + #13+ #10 + 'OnLeftMargin'; if egtOnRightMargin in GroupInfo then Text := Text + #13+ #10 + 'OnRightMargin'; end else Allow := GroupInfo <> [] end end end else if HintType = ehtToolTip then begin end; // Only allow hints over Items if checked if CheckBoxAllowOnItemsOnly.Checked then Allow := TargetObj is TEasyItem end; end.