Class TExtListView (unit ExtListView)

Inherits from

TCustomEnhListView

The new class.

Constructors


constructor Create(AOwner: TComponent);

Override constructor to "zero out" our internal variable.


Functions

function ApproximateViewRect(Count: integer; const Proposed: TPoint): TPoint;


function CheckComCtlVersion(MajorHi, MajorLo, MinorHi, MinorLo: word): boolean;

Add LVCF_FMT Just to make sure.

destructor Destroy;


function ELV_GetNextItem(StartItem: integer; Direction: TSearchDirection; States: TItemStates): integer;


function GetColumnOrder(Count: integer; var IntArray: array of integer): boolean;


function GetSubItemAt(X, Y: integer): string;


function LoadSettings: boolean;

DON'T CALL INHERITED!!!! It has caused me no end of trouble, so I just resave the width stuff if I need to rather than call inherited.

procedure SetColumnOrder(Count: integer; const IntArray: array of integer);


procedure SetIconSpacing(X, Y: integer);


procedure SetItemCountEx(Count: integer; Flags: TLVItemCountFlags);


function StoreSettings: boolean;


procedure UpdateColumnImage(Index: integer);


procedure UpdateColumnsImages;

Force reset of column image information

function ActualColumnIndex(Index: integer): integer;


procedure CreateParams(var Params: TCreateParams);

don't think i need this, it has an Owner property

procedure CreateWnd;


procedure DefaultDrawHeader(var Canvas: TCanvas; Index: Integer; var Rect: TRect; Selected: boolean);

Default to whatever is in ExtendedStyles settings

procedure DrawItem(var Canvas: TCanvas; Index: Integer; Rect: TRect; State: TOwnerDrawState; var DefaultDrawing, FullRowSelect: boolean);

I must have been high for x := 0 to ColCount-1 do if ColArray[x] = Index then begin Result := Columns[ColArray[x]]; exit; end;

function GetActualColumn(Index: integer): TListColumn;

needs to account for modified column order

function GetCheckState(Index: integer): boolean;


function GetExtendedStyles: TLVExtendedStyles;

Property method to get the extended style bits.

function GetHeaderHandle: HWnd;

A real world use of XOR!!! We need to invalidate if subitem images is in new value and not in old, or in old value and not in new, but NOT if it is set or cleared in both.

function GetHotCursor: HCursor;


function GetHotItem: integer;


function GetHoverTime: DWORD;

Call even if not changed because handle may not have been allocated

function GetSelectionMark: integer;

Force the header to redraw

function GetShowSortArrows: boolean;


function GetSmallImages: TImageList;

Set it.

function GetSubItemImageIndex(Item, SubItem: integer): integer;


function GetSubItemRect(Item, SubItem: integer; Index: integer): TRect;

Not sure about how to update the view after changing this.

function GetSubItemText(Index, SubItem: integer): string;

Subitem set to -1 means Caption text

function GetVersion: TDFSVersion;

account for modified column order Delphi 2 and C++B 1 have a bug in TListColumn.

function HotTrack(var Item: TNMListView): boolean;


procedure ItemActivate;


procedure Loaded;


function MarqueeBegin: boolean;

Event method handlers -- fire the events if they exist.

procedure SetCheckState(Index: integer; Checked: boolean);


procedure SetColumnsFormat(Value: TExtListColumns);

Images changed

procedure SetExtendedStyles(Val: TLVExtendedStyles);

Property method for setting styles.

procedure SetHotCursor(const Val: HCursor);


procedure SetHotItem(Val: integer);


procedure SetHoverTime(Val: DWORD);


procedure SetRequireComCtlUpdate(Value: boolean);

Call even if not changed because handle may not have been allocated

procedure SetSelectionMark(Val: integer);


procedure SetShowSortArrows(Value: boolean);


procedure SetSmallImages(Value: TImageList);

Nothing, just get it

procedure SetSubItemImageIndex(Item, SubItem, Value: integer);

Get it.

procedure SetVirtualMode(Val: boolean);


procedure SetWorkArea(Rect: TRect);


procedure VMCacheHint(var HintInfo: TNMCacheHint);

No way.

function VMFindItem(var FindInfo: TNMFindItem): integer;


procedure VMGetDispInfo(var ItemInfo: TLVItemEx);


procedure VMStateChanged(var StateInfo: TNMODStateChange);


procedure CNNotify(var Message: TWMNotify);

Set it.

procedure ColumnHeaderImagesChange(Sender: TObject);


function GetItemIndent(Index: integer): Integer;


procedure SetItemIndent(Index: integer; Value: Integer);

Get it.

function SetValueFromAPIValue(Styles: DWORD): TLVExtendedStyles;

Function to convert from the API values to our style set type.

function SetValueToAPIValue(Styles: TLVExtendedStyles): LPARAM;

Function to convert from our set type to expected API value.

procedure WMNotify(var Message: TWMNotify);

We only want to handle LVN_GETDISPINFO when in virtual mode

Properties

property Align :


property AllocBy :


property AutoColumnSort :

Publish inherited protected properties

property AutoResort :


property AutoSortAscending :


property AutoSortStyle :


property BorderStyle :


property Color :


property ColumnClick :


property Columns :


property ColumnsFormat : TExtListColumns


property Ctl3D :


property DragCursor :


property DragMode :


property Enabled :


property ExtendedStyles : TLVExtendedStyles

Property for new styles.

property Font :


property HideSelection :


property HoverTime : DWORD


property IconOptions :


property Items :


property LargeImages :


property LastColumnClicked :


property MultiSelect :


property ParentColor :


property ParentFont :


property ParentShowHint :


property PopupMenu :


property ReadOnly :


property RequireComCtlUpdate : boolean


property ReverseSortArrows :


property SaveSettings : TExtLVSaveSettings

Autosave settings property.

property ShowColumnHeaders :


property ShowHint :


property ShowSortArrows : boolean


property SmallImages : TImageList

Redeclare so we can know when it changes and hook into it.

property StateImages :


property Style :


property TabOrder :


property TabStop :


property ViewStyle :


property VirtualMode : boolean


property Visible :


property CurrentSortAscending :


property HeaderHandle : HWnd


property HotCursor : HCursor


property HotItem : integer


property IsChecked : boolean


property ItemIndent : integer


property SelectionMark : integer


property SubItem_BoundsRect : TRect


property SubItem_IconRect : TRect


property SubItem_ImageIndex : integer


property SubItem_LabelRect : TRect


property SubItem_SelectBoundsRect : TRect


property WorkArea : TRect


Events

event OnAfterDefaultDrawItem :


event OnChange :


event OnChanging :


event OnClick :


event OnColumnClick :


event OnDblClick :


event OnDeletion :


event OnDragDrop :


event OnDragOver :


event OnDrawHeader :


event OnDrawItem :


event OnDrawSubItem :


event OnEditCanceled :


event OnEdited :


event OnEditing :


event OnEndDrag :


event OnEnter :


event OnExit :


event OnHotTrack : TLVHotTrackEvent


event OnInsert :


event OnItemActivate : TLVItemActivateEvent


event OnKeyDown :


event OnKeyPress :


event OnKeyUp :


event OnMarqueeBegin : TLVMarqueeBeginEvent

Events

event OnMeasureItem :


event OnMouseDown :


event OnMouseMove :


event OnMouseUp :


event OnSortBegin :


event OnSortFinished :


event OnSortItems :


event OnStartDrag :


event OnVMCacheHint : TLVVMCacheHintEvent


event OnVMFindItem : TLVVMFindItemEvent


event OnVMGetItemInfo : TLVVMGetItemInfoEvent


event OnVMStateChanged : TLVVMStateChangedEvent


Variables

FColumnOrder : PIntArray;


FColumnOrderCount : integer;


FColumnsFormat : TExtListColumns;


FColumnsFormatChangeLink : TChangeLink;


FExtendedStyles : TLVExtendedStyles;


FHoverTime : DWORD;


FItemCountEx : integer;


FItemCountExFlags : TLVItemCountFlags;


FOnHotTrack : TLVHotTrackEvent;


FOnItemActivate : TLVItemActivateEvent;


FOnMarqueeBegin : TLVMarqueeBeginEvent;


FOnVMCacheHint : TLVVMCacheHintEvent;


FOnVMFindItem : TLVVMFindItemEvent;


FOnVMGetItemInfo : TLVVMGetItemInfoEvent;


FOnVMStateChanged : TLVVMStateChangedEvent;


FRequireComCtlUpdate : boolean;


FSaveSettings : TExtLVSaveSettings;


FSelectionMark : integer;


FVirtualMode : boolean;



Constructors


constructor Create(AOwner: TComponent);

Override constructor to "zero out" our internal variable.


Functions


function ApproximateViewRect(Count: integer; const Proposed: TPoint): TPoint;


function CheckComCtlVersion(MajorHi, MajorLo, MinorHi, MinorLo: word): boolean;

Add LVCF_FMT Just to make sure...


destructor Destroy;


function ELV_GetNextItem(StartItem: integer; Direction: TSearchDirection; States: TItemStates): integer;


function GetColumnOrder(Count: integer; var IntArray: array of integer): boolean;


function GetSubItemAt(X, Y: integer): string;


function LoadSettings: boolean;

DON'T CALL INHERITED!!!! It has caused me no end of trouble, so I just resave the width stuff if I need to rather than call inherited.


procedure SetColumnOrder(Count: integer; const IntArray: array of integer);


procedure SetIconSpacing(X, Y: integer);


procedure SetItemCountEx(Count: integer; Flags: TLVItemCountFlags);


function StoreSettings: boolean;


procedure UpdateColumnImage(Index: integer);


procedure UpdateColumnsImages;

Force reset of column image information


function ActualColumnIndex(Index: integer): integer;


procedure CreateParams(var Params: TCreateParams);

don't think i need this, it has an Owner property


procedure CreateWnd;


procedure DefaultDrawHeader(var Canvas: TCanvas; Index: Integer; var Rect: TRect; Selected: boolean);

Default to whatever is in ExtendedStyles settings


procedure DrawItem(var Canvas: TCanvas; Index: Integer; Rect: TRect; State: TOwnerDrawState; var DefaultDrawing, FullRowSelect: boolean);

I must have been high for x := 0 to ColCount-1 do if ColArray[x] = Index then begin Result := Columns[ColArray[x]]; exit; end;


function GetActualColumn(Index: integer): TListColumn;

needs to account for modified column order


function GetCheckState(Index: integer): boolean;


function GetExtendedStyles: TLVExtendedStyles;

Property method to get the extended style bits.


function GetHeaderHandle: HWnd;

A real world use of XOR!!! We need to invalidate if subitem images is in new value and not in old, or in old value and not in new, but NOT if it is set or cleared in both.


function GetHotCursor: HCursor;


function GetHotItem: integer;


function GetHoverTime: DWORD;

Call even if not changed because handle may not have been allocated


function GetSelectionMark: integer;

Force the header to redraw


function GetShowSortArrows: boolean;


function GetSmallImages: TImageList;

Set it.


function GetSubItemImageIndex(Item, SubItem: integer): integer;


function GetSubItemRect(Item, SubItem: integer; Index: integer): TRect;

Not sure about how to update the view after changing this. Refresh doesn't do the job. Seems the best way to do it is in client code, something like: (* SetIconSpacing(X, Y); // Does strange things if ViewStyle is not set to vsIcon! if ViewStyle = vsIcon then begin SendMessage(Handle, WM_SETREDRAW, 0, 0); try ViewStyle := vsSmallIcon; ViewStyle := vsIcon; finally SendMessage(Handle, WM_SETREDRAW, 1, 0); end; end;


function GetSubItemText(Index, SubItem: integer): string;

Subitem set to -1 means Caption text


function GetVersion: TDFSVersion;

account for modified column order Delphi 2 and C++B 1 have a bug in TListColumn.GetWidth. It returns zero for the width if the handle hasn't been allocated yet instead of returning the value of the internal storage variable like Delphi 3 does. I've also had some problems similar under Delphi 3, so I'm just always requiring the handle to be valid.


function HotTrack(var Item: TNMListView): boolean;


procedure ItemActivate;


procedure Loaded;


function MarqueeBegin: boolean;

Event method handlers -- fire the events if they exist.

For some reason, the SECOND time you drag a header width, it toasts the bitmap. I think it has to do with the TListView class somehow resetting the column information, overwriting our information (image info). Anyway, catching the condition (begin column header drag) and resetting all the extended information for that column fixes it.


procedure SetCheckState(Index: integer; Checked: boolean);


procedure SetColumnsFormat(Value: TExtListColumns);

Images changed


procedure SetExtendedStyles(Val: TLVExtendedStyles);

Property method for setting styles.

Property method to set new style bits.


procedure SetHotCursor(const Val: HCursor);


procedure SetHotItem(Val: integer);


procedure SetHoverTime(Val: DWORD);


procedure SetRequireComCtlUpdate(Value: boolean);

Call even if not changed because handle may not have been allocated


procedure SetSelectionMark(Val: integer);


procedure SetShowSortArrows(Value: boolean);


procedure SetSmallImages(Value: TImageList);

Nothing, just get it


procedure SetSubItemImageIndex(Item, SubItem, Value: integer);

Get it.


procedure SetVirtualMode(Val: boolean);


procedure SetWorkArea(Rect: TRect);


procedure VMCacheHint(var HintInfo: TNMCacheHint);

No way.


function VMFindItem(var FindInfo: TNMFindItem): integer;


procedure VMGetDispInfo(var ItemInfo: TLVItemEx);


procedure VMStateChanged(var StateInfo: TNMODStateChange);


procedure CNNotify(var Message: TWMNotify);

Set it.


procedure ColumnHeaderImagesChange(Sender: TObject);


function GetItemIndent(Index: integer): Integer;


procedure SetItemIndent(Index: integer; Value: Integer);

Get it.


function SetValueFromAPIValue(Styles: DWORD): TLVExtendedStyles;

Function to convert from the API values to our style set type.


function SetValueToAPIValue(Styles: TLVExtendedStyles): LPARAM;

Function to convert from our set type to expected API value.

LVS_EX_INFOTIP, LVS_EX_REGIONAL, LVS_EX_MULTIWORKAREAS - not implemented Function to convert our style set type into the value expected by the API.


procedure WMNotify(var Message: TWMNotify);

We only want to handle LVN_GETDISPINFO when in virtual mode


Properties


property Align :


property AllocBy :


property AutoColumnSort :

Publish inherited protected properties


property AutoResort :


property AutoSortAscending :


property AutoSortStyle :


property BorderStyle :


property Color :


property ColumnClick :


property Columns :


property ColumnsFormat : TExtListColumns


property Ctl3D :


property DragCursor :


property DragMode :


property Enabled :


property ExtendedStyles : TLVExtendedStyles

Property for new styles.


property Font :


property HideSelection :


property HoverTime : DWORD


property IconOptions :


property Items :


property LargeImages :


property LastColumnClicked :


property MultiSelect :


property ParentColor :


property ParentFont :


property ParentShowHint :


property PopupMenu :


property ReadOnly :


property RequireComCtlUpdate : boolean


property ReverseSortArrows :


property SaveSettings : TExtLVSaveSettings

Autosave settings property.


property ShowColumnHeaders :


property ShowHint :


property ShowSortArrows : boolean


property SmallImages : TImageList

Redeclare so we can know when it changes and hook into it.


property StateImages :


property Style :


property TabOrder :


property TabStop :


property ViewStyle :


property VirtualMode : boolean


property Visible :


property CurrentSortAscending :


property HeaderHandle : HWnd


property HotCursor : HCursor


property HotItem : integer


property IsChecked : boolean


property ItemIndent : integer


property SelectionMark : integer


property SubItem_BoundsRect : TRect


property SubItem_IconRect : TRect


property SubItem_ImageIndex : integer


property SubItem_LabelRect : TRect


property SubItem_SelectBoundsRect : TRect


property WorkArea : TRect


Events


event OnAfterDefaultDrawItem :


event OnChange :


event OnChanging :


event OnClick :


event OnColumnClick :


event OnDblClick :


event OnDeletion :


event OnDragDrop :


event OnDragOver :


event OnDrawHeader :


event OnDrawItem :


event OnDrawSubItem :


event OnEditCanceled :


event OnEdited :


event OnEditing :


event OnEndDrag :


event OnEnter :


event OnExit :


event OnHotTrack : TLVHotTrackEvent


event OnInsert :


event OnItemActivate : TLVItemActivateEvent


event OnKeyDown :


event OnKeyPress :


event OnKeyUp :


event OnMarqueeBegin : TLVMarqueeBeginEvent

Events


event OnMeasureItem :


event OnMouseDown :


event OnMouseMove :


event OnMouseUp :


event OnSortBegin :


event OnSortFinished :


event OnSortItems :


event OnStartDrag :


event OnVMCacheHint : TLVVMCacheHintEvent


event OnVMFindItem : TLVVMFindItemEvent


event OnVMGetItemInfo : TLVVMGetItemInfoEvent


event OnVMStateChanged : TLVVMStateChangedEvent


Variables


FColumnOrder : PIntArray;


FColumnOrderCount : integer;


FColumnsFormat : TExtListColumns;


FColumnsFormatChangeLink : TChangeLink;


FExtendedStyles : TLVExtendedStyles;


FHoverTime : DWORD;


FItemCountEx : integer;


FItemCountExFlags : TLVItemCountFlags;


FOnHotTrack : TLVHotTrackEvent;


FOnItemActivate : TLVItemActivateEvent;


FOnMarqueeBegin : TLVMarqueeBeginEvent;


FOnVMCacheHint : TLVVMCacheHintEvent;


FOnVMFindItem : TLVVMFindItemEvent;


FOnVMGetItemInfo : TLVVMGetItemInfoEvent;


FOnVMStateChanged : TLVVMStateChangedEvent;


FRequireComCtlUpdate : boolean;


FSaveSettings : TExtLVSaveSettings;


FSelectionMark : integer;


FVirtualMode : boolean;