Class TCustomEnhListView (unit EnhListView) |
Inherits from
TCustomListView
The new class
constructor Create(AOwner: TComponent);
- Override constructor to "zero out" our internal variable.
procedure BeginUpdate;
Use these as replacements for Items.
procedure DefaultSort(ColumnIndex:integer; Descending: boolean);
destructor Destroy;
inhibit sorting until finished creating.
procedure EndUpdate;
function LoadSettings: boolean;
procedure ResizeColumns(ResizeMethod: TResizeMethod);
Resize all columns.
procedure Resort;
function StoreSettings: boolean;
function ActualColumnIndex(Index: integer): integer;
Can't do this above because FLastColumnClicked is used to paint the arrow
procedure AfterDrawItem(var Canvas: TCanvas; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
procedure ColClick(Column: TListColumn);
Overriden ancestor methods
procedure CreateParams(var Params: TCreateParams);
procedure CreateSortBmps(var UpBmp, DownBmp: TBitmap);
procedure CreateWnd;
procedure DefaultDrawHeader(var Canvas: TCanvas; Index: Integer;
var Rect: TRect; Selected: boolean);
procedure DefaultDrawItem(Index: Integer; Rect: TRect;
State: TOwnerDrawState; FullRowSelect: boolean);
procedure DefaultDrawSubItem(Index, SubItem: integer; Rect: TRect;
State: TOwnerDrawState);
procedure DestroyWnd;
Don't ask about the drawing.
procedure DoSort(ColumnIndex:integer; Descending: boolean);
procedure DrawHeader(var Canvas: TCanvas; Index: Integer; var Rect: TRect;
Selected: boolean; var DefaultDrawing: boolean);
procedure DrawItem(var Canvas: TCanvas; Index: Integer; Rect: TRect;
State: TOwnerDrawState; var DefaultDrawing,
FullRowSelect: boolean);
Call this last so resort happens before screen redraw is re-enabled.
procedure DrawSubItem(Index, SubItem: Integer; Rect: TRect;
State: TOwnerDrawState; var DefaultDrawing: boolean);
SubItem is -1 for Caption item
procedure Edit(const Item: TLVItem);
Check if the sort order should be toggled
procedure EditCanceled(const Item: TLVItem);
function GetActualColumn(Index: integer): TListColumn;
CNDrawItem
function GetSubItemText(Index, SubItem: integer): string;
Delphi 2 and C++B 1 have a bug in TListColumn.
function GetVersion: TDFSVersion;
procedure InvalidateColumnHeader(Index: integer);
procedure Loaded;
If we are loading object from stream (form file), we have to wait until everything is loaded before populating the list.
procedure MeasureItem(var Height: Integer);
procedure ProcessDrawHeaderMsg(Index: Integer; Rect: TRect;
State: TOwnerDrawState; var DefaultDrawing: boolean);
CNDrawItem
procedure ProcessDrawItemMsg(Index: Integer;
Rect: TRect; State: TOwnerDrawState; var DefaultDrawing,
FullRowSelect: boolean);
Hidden item
procedure SetAutoColumnSort(Value: TAutoColumnSort);
Property methods
procedure SetAutoResort(Value: boolean);
procedure SetAutoSortAscending(Value: boolean);
procedure SetAutoSortStyle(Value: TAutoSortStyle);
procedure SetColumnsOwnerDrawFlag(OwnerDrawn: boolean);
procedure SetCurrentSortAscending(Value: boolean);
procedure SetLastColumnClicked(Value: integer);
procedure SetOnDrawHeader(Value: TLVHDrawItemEvent);
taLeftJustify, taCenter Only draw if we have enough room
procedure SetReverseSortArrows(Value: boolean);
procedure SetShowSortArrows(Value: boolean);
procedure SetStyle(Value: TLVStyle);
Don't let it go past first column width
procedure SetVersion(const Val: TDFSVersion);
procedure SortBegin(ColumnIndex: integer; Ascending: boolean);
The only way to get in here is if FOnSortItems is assigned, so don't bother checking for NIL
procedure SortFinished(ColumnIndex: integer; Ascending: boolean);
procedure SortItems(const Item1, Item2: TListItem; SortColumn: integer;
var CompResult: integer);
Check if the sort order should be toggled
procedure CMSysColorChange(var Message: TWMSysColorChange);
Message handlers
procedure CNDrawItem(var Message: TWMDrawItem);
procedure CNMeasureItem(var Message: TWMMeasureItem);
Need to recreate the sort arrow bmps to use the new system colors
procedure CNNotify(var Message: TWMNotify);
procedure WMDestroy(var Message: TWMDestroy);
Something flaky going on.
procedure WMDrawHeader(var Message: TWMDrawItem);
old way.
procedure WMNotify(var Message: TWMNotify);
procedure WMOwnerDrawColumns(var Message: TMessage);
Adjust for shadow
property Version : TDFSVersion
property ActualColumn : TListColumn
Accounts for re-ordered columns
property AutoColumnSort : TAutoColumnSort
property AutoResort : boolean
property AutoSortAscending : boolean
property AutoSortStyle : TAutoSortStyle
property CurrentSortAscending : boolean
property HeaderHandle : HWnd
Should be published by descendants as needed
property LastColumnClicked : Integer
Should be made public by descendants as needed
property ReverseSortArrows : boolean
property SaveSettings : TEnhLVSaveSettings
property ShowSortArrows : boolean
property SortDownBmp : TBitmap
property SortUpBmp : TBitmap
Should probably remain protected
property Style : TLVStyle
event OnAfterDefaultDrawItem : TLVAfterDrawItemEvent
event OnDrawHeader : TLVHDrawItemEvent
Events
event OnDrawItem : TLVDrawItemEvent
event OnDrawSubItem : TLVDrawSubItemEvent
event OnEditCanceled : TLVEditCanceled
event OnMeasureItem : TLVMeasureItemEvent
event OnSortBegin : TLVSortStatusEvent
event OnSortFinished : TLVSortStatusEvent
event OnSortItems : TLVSortItemsEvent
FCanvas : TCanvas;
USE WITH CARE.
FHeaderHandle : HWND;
FAutoColumnSort : TAutoColumnSort;
FAutoResort : boolean;
FAutoSortAscending : boolean;
FAutoSortStyle : TAutoSortStyle;
FLastColumnClicked : Integer;
FOnAfterDefaultDrawItem : TLVAfterDrawItemEvent;
FOnDrawHeader : TLVHDrawItemEvent;
FOnDrawItem : TLVDrawItemEvent;
FOnDrawSubItem : TLVDrawSubItemEvent;
FOnEditCanceled : TLVEditCanceled;
FOnMeasureItem : TLVMeasureItemEvent;
FOnSortBegin : TLVSortStatusEvent;
FOnSortFinished : TLVSortStatusEvent;
FOnSortItems : TLVSortItemsEvent;
FReverseSortArrows : boolean;
FSaveSettings : TEnhLVSaveSettings;
FShowSortArrows : boolean;
FSortDirty : boolean;
FSortDownBmp : TBitmap;
FSortUpBmp : TBitmap;
FStyle : TLVStyle;
FTmpAutoSortAscending : boolean;
FUpdateCount : integer;
constructor Create(AOwner: TComponent);
Override constructor to "zero out" our internal variable.
procedure BeginUpdate;
Use these as replacements for Items.BeginUpdate and EndUpdate. They call those methods, but they also inhibit autosorting until after the last EndUpdate.
procedure DefaultSort(ColumnIndex:integer; Descending: boolean);
destructor Destroy;
inhibit sorting until finished creating.
procedure EndUpdate;
function LoadSettings: boolean;
procedure ResizeColumns(ResizeMethod: TResizeMethod);
Resize all columns.
empty write method, just needed to get it to show up in Object Inspector
procedure Resort;
function StoreSettings: boolean;
function ActualColumnIndex(Index: integer): integer;
Can't do this above because FLastColumnClicked is used to paint the arrow
procedure AfterDrawItem(var Canvas: TCanvas; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
procedure ColClick(Column: TListColumn);
Overriden ancestor methods
procedure CreateParams(var Params: TCreateParams);
procedure CreateSortBmps(var UpBmp, DownBmp: TBitmap);
procedure CreateWnd;
procedure DefaultDrawHeader(var Canvas: TCanvas; Index: Integer;
var Rect: TRect; Selected: boolean);
procedure DefaultDrawItem(Index: Integer; Rect: TRect;
State: TOwnerDrawState; FullRowSelect: boolean);
procedure DefaultDrawSubItem(Index, SubItem: integer; Rect: TRect;
State: TOwnerDrawState);
procedure DestroyWnd;
Don't ask about the drawing. I just fooled around until I got
something I liked.
procedure DoSort(ColumnIndex:integer; Descending: boolean);
procedure DrawHeader(var Canvas: TCanvas; Index: Integer; var Rect: TRect;
Selected: boolean; var DefaultDrawing: boolean);
procedure DrawItem(var Canvas: TCanvas; Index: Integer; Rect: TRect;
State: TOwnerDrawState; var DefaultDrawing,
FullRowSelect: boolean);
Call this last so resort happens before screen redraw is re-enabled.
procedure DrawSubItem(Index, SubItem: Integer; Rect: TRect;
State: TOwnerDrawState; var DefaultDrawing: boolean);
SubItem is -1 for Caption item
procedure Edit(const Item: TLVItem);
Check if the sort order should be toggled
procedure EditCanceled(const Item: TLVItem);
function GetActualColumn(Index: integer): TListColumn;
CNDrawItem
function GetSubItemText(Index, SubItem: integer): string;
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 GetVersion: TDFSVersion;
procedure InvalidateColumnHeader(Index: integer);
procedure Loaded;
If we are loading object from stream (form file), we have to wait until everything is loaded before populating the list. If we are not loading, i.e. the component was created dynamically or was just dropped on a form, we need to reset the flag now.
procedure MeasureItem(var Height: Integer);
procedure ProcessDrawHeaderMsg(Index: Integer; Rect: TRect;
State: TOwnerDrawState; var DefaultDrawing: boolean);
CNDrawItem
procedure ProcessDrawItemMsg(Index: Integer;
Rect: TRect; State: TOwnerDrawState; var DefaultDrawing,
FullRowSelect: boolean);
Hidden item
procedure SetAutoColumnSort(Value: TAutoColumnSort);
Property methods
procedure SetAutoResort(Value: boolean);
procedure SetAutoSortAscending(Value: boolean);
procedure SetAutoSortStyle(Value: TAutoSortStyle);
procedure SetColumnsOwnerDrawFlag(OwnerDrawn: boolean);
procedure SetCurrentSortAscending(Value: boolean);
procedure SetLastColumnClicked(Value: integer);
procedure SetOnDrawHeader(Value: TLVHDrawItemEvent);
taLeftJustify, taCenter Only draw if we have enough room
procedure SetReverseSortArrows(Value: boolean);
procedure SetShowSortArrows(Value: boolean);
procedure SetStyle(Value: TLVStyle);
Don't let it go past first column width
procedure SetVersion(const Val: TDFSVersion);
procedure SortBegin(ColumnIndex: integer; Ascending: boolean);
The only way to get in here is if FOnSortItems is assigned, so don't bother checking for NIL
procedure SortFinished(ColumnIndex: integer; Ascending: boolean);
procedure SortItems(const Item1, Item2: TListItem; SortColumn: integer;
var CompResult: integer);
Check if the sort order should be toggled
procedure CMSysColorChange(var Message: TWMSysColorChange);
Message handlers
procedure CNDrawItem(var Message: TWMDrawItem);
procedure CNMeasureItem(var Message: TWMMeasureItem);
Need to recreate the sort arrow bmps to use the new system colors
procedure CNNotify(var Message: TWMNotify);
procedure WMDestroy(var Message: TWMDestroy);
Something flaky going on. Hard to explain, but this clears it up.
procedure WMDrawHeader(var Message: TWMDrawItem);
old way. had some performance problems when used in conjunction with
TToolbar97 component. No idea why that would cause it, though.
// For some reason, the SECOND time you drag a header width, it toasts the
// column index in the draw item message. Also seems to reset owner draw
// info at times, too. Anyway, the best fix I could come up with was to
// always watch for a change in the header handle, and always reset the owner
// draw flag. Note the recursion flag. This is needed since the
// SetColumnsOwnerDrawFlag will cause some HDN_xxx notification messages.
// Best way that I can find to snag the real header handle. Kludgy at best,
// but what else are you gonna do?
case Message.NMHdr.code of
HDN_LAST..HDN_FIRST:
begin
if Message.NMHdr.hwndFrom <> FHeaderHandle then
FHeaderHandle := Message.NMHdr^.hwndFrom;
if RECURSE_FLAG or (FUpdateCount > 0) then exit;
RECURSE_FLAG := TRUE;
try
SetColumnsOwnerDrawFlag(assigned(FOnDrawHeader) or FShowSortArrows);
finally
RECURSE_FLAG := FALSE;
end;
end;
end;
procedure WMNotify(var Message: TWMNotify);
procedure WMOwnerDrawColumns(var Message: TMessage);
Adjust for shadow
property Version : TDFSVersion
property ActualColumn : TListColumn
Accounts for re-ordered columns
property AutoColumnSort : TAutoColumnSort
property AutoResort : boolean
property AutoSortAscending : boolean
property AutoSortStyle : TAutoSortStyle
property CurrentSortAscending : boolean
property HeaderHandle : HWnd
Should be published by descendants as needed
property LastColumnClicked : Integer
Should be made public by descendants as needed
property ReverseSortArrows : boolean
property SaveSettings : TEnhLVSaveSettings
property ShowSortArrows : boolean
property SortDownBmp : TBitmap
property SortUpBmp : TBitmap
Should probably remain protected
property Style : TLVStyle
event OnAfterDefaultDrawItem : TLVAfterDrawItemEvent
event OnDrawHeader : TLVHDrawItemEvent
Events
event OnDrawItem : TLVDrawItemEvent
event OnDrawSubItem : TLVDrawSubItemEvent
event OnEditCanceled : TLVEditCanceled
event OnMeasureItem : TLVMeasureItemEvent
event OnSortBegin : TLVSortStatusEvent
event OnSortFinished : TLVSortStatusEvent
event OnSortItems : TLVSortItemsEvent
FCanvas : TCanvas;
USE WITH CARE. This can be NIL
FHeaderHandle : HWND;
FAutoColumnSort : TAutoColumnSort;
FAutoResort : boolean;
FAutoSortAscending : boolean;
FAutoSortStyle : TAutoSortStyle;
FLastColumnClicked : Integer;
FOnAfterDefaultDrawItem : TLVAfterDrawItemEvent;
FOnDrawHeader : TLVHDrawItemEvent;
FOnDrawItem : TLVDrawItemEvent;
FOnDrawSubItem : TLVDrawSubItemEvent;
FOnEditCanceled : TLVEditCanceled;
FOnMeasureItem : TLVMeasureItemEvent;
FOnSortBegin : TLVSortStatusEvent;
FOnSortFinished : TLVSortStatusEvent;
FOnSortItems : TLVSortItemsEvent;
FReverseSortArrows : boolean;
FSaveSettings : TEnhLVSaveSettings;
FShowSortArrows : boolean;
FSortDirty : boolean;
FSortDownBmp : TBitmap;
FSortUpBmp : TBitmap;
FStyle : TLVStyle;
FTmpAutoSortAscending : boolean;
FUpdateCount : integer;