MG: TListView now works handleless and SetSelection implemented

git-svn-id: trunk@3312 -
This commit is contained in:
lazarus 2002-09-10 10:00:27 +00:00
parent 385cd1efb4
commit fc518c76b8
3 changed files with 72 additions and 27 deletions

View File

@ -253,6 +253,9 @@ type
TLVColumnClickEvent = procedure(Sender: TObject; Column: TListColumn) of object; TLVColumnClickEvent = procedure(Sender: TObject; Column: TListColumn) of object;
TLVColumnRClickEvent = procedure(Sender: TObject; Column: TListColumn; Point: TPoint) of object; TLVColumnRClickEvent = procedure(Sender: TObject; Column: TListColumn; Point: TPoint) of object;
TLVSelectItemEvent = procedure(Sender: TObject; Item: TListItem; Selected: Boolean) of object; TLVSelectItemEvent = procedure(Sender: TObject; Item: TListItem; Selected: Boolean) of object;
TListViewState = (lvMultiSelect, lvUpdateNeeded);
TListViewStates = set of TListViewState;
TCustomListView = class(TWinControl) TCustomListView = class(TWinControl)
private private
@ -265,7 +268,6 @@ type
FViewStyle : TViewStyle; FViewStyle : TViewStyle;
FSortType: TSortType; FSortType: TSortType;
FSortColumn : Integer; FSortColumn : Integer;
FMultiSelect: Boolean;
FImageChangeLink : TChangeLink; FImageChangeLink : TChangeLink;
FScrollBars: TScrollStyle; FScrollBars: TScrollStyle;
FScrolledLeft: integer; // horizontal scrolled pixels (hidden pixels at top) FScrolledLeft: integer; // horizontal scrolled pixels (hidden pixels at top)
@ -274,10 +276,11 @@ type
FLastHorzScrollInfo: TScrollInfo; FLastHorzScrollInfo: TScrollInfo;
FLastVertScrollInfo: TScrollInfo; FLastVertScrollInfo: TScrollInfo;
FUpdateCount: integer; FUpdateCount: integer;
FUpdateNeeded: boolean;
FOnChange: TLVChangeEvent; FOnChange: TLVChangeEvent;
FOnColumnClick: TLVColumnClickEvent; FOnColumnClick: TLVColumnClickEvent;
FOnSelectItem: TLVSelectItemEvent; FOnSelectItem: TLVSelectItemEvent;
FStates: TListViewStates;
function GetMultiSelect: Boolean;
function GetSelection: TListItem; function GetSelection: TListItem;
procedure SetColumns(const AValue: TListColumns); procedure SetColumns(const AValue: TListColumns);
procedure SetDefaultItemHeight(AValue: integer); procedure SetDefaultItemHeight(AValue: integer);
@ -296,6 +299,7 @@ type
procedure DoUpdate; procedure DoUpdate;
protected protected
ParentWindow : TScrolledWindow; ParentWindow : TScrolledWindow;
procedure InitializeWnd; override;
procedure Change(AItem: TListItem; AChange: Integer); dynamic; procedure Change(AItem: TListItem; AChange: Integer); dynamic;
procedure ColClick(AColumn: TListColumn); dynamic; procedure ColClick(AColumn: TListColumn); dynamic;
procedure Delete(Item : TListItem); procedure Delete(Item : TListItem);
@ -316,7 +320,7 @@ type
property DefaultItemHeight: integer read FDefItemHeight write SetDefaultItemHeight; property DefaultItemHeight: integer read FDefItemHeight write SetDefaultItemHeight;
// property HideSelection: Boolean read FHideSelection write SetHideSelection default True; // property HideSelection: Boolean read FHideSelection write SetHideSelection default True;
property Items: TListItems read FListItems write SetItems; property Items: TListItems read FListItems write SetItems;
property MultiSelect: Boolean read FMultiSelect write SetMultiSelect default False; property MultiSelect: Boolean read GetMultiSelect write SetMultiSelect default False;
// property ReadOnly: Boolean read FReadOnly write SetReadOnly; // property ReadOnly: Boolean read FReadOnly write SetReadOnly;
// property RowSelect: Boolean read FRowSelect write SetRowSelect default False; // property RowSelect: Boolean read FRowSelect write SetRowSelect default False;
property ScrolledLeft: integer read FScrolledLeft write SetScrolledLeft; property ScrolledLeft: integer read FScrolledLeft write SetScrolledLeft;
@ -1594,6 +1598,9 @@ end.
{ ============================================================================= { =============================================================================
$Log$ $Log$
Revision 1.43 2002/09/10 10:00:27 lazarus
MG: TListView now works handleless and SetSelection implemented
Revision 1.42 2002/09/10 06:49:18 lazarus Revision 1.42 2002/09/10 06:49:18 lazarus
MG: scrollingwincontrol from Andrew MG: scrollingwincontrol from Andrew

View File

@ -13,9 +13,9 @@
* * * *
***************************************************************************** *****************************************************************************
} }
{------------------------------------------------------------------------------} {------------------------------------------------------------------------------
{ TCustomListView Constructor } TCustomListView Constructor
{------------------------------------------------------------------------------} ------------------------------------------------------------------------------}
constructor TCustomListView.Create(Aowner: TComponent); constructor TCustomListView.Create(Aowner: TComponent);
begin begin
inherited Create(AOwner); inherited Create(AOwner);
@ -40,7 +40,7 @@ end;
{------------------------------------------------------------------------------} {------------------------------------------------------------------------------}
Procedure TCustomListView.ColumnsChanged; Procedure TCustomListView.ColumnsChanged;
Begin Begin
FUpdateNeeded:=true; Include(FStates,lvUpdateNeeded);
DoUpdate; DoUpdate;
end; end;
@ -137,16 +137,25 @@ end;
procedure TCustomListView.DoUpdate; procedure TCustomListView.DoUpdate;
begin begin
if FUpdateCount>0 then exit; if FUpdateCount>0 then exit;
if not FUpdateNeeded then exit; if not (lvUpdateNeeded in FStates) then exit;
FUpdateNeeded:=false;
if csDestroying in Componentstate Then Exit; if csDestroying in Componentstate Then Exit;
//TODO: Optimize implementation by invoking individual upadates instead of //TODO: Optimize implementation by invoking individual upadates instead of
// recreating window // recreating window
//notify the interface.... //notify the interface....
if (not HandleAllocated) or (csLoading in ComponentState) then exit;
Exclude(FStates,lvUpdateNeeded);
RecreateWnd; RecreateWnd;
CNSendMessage(LM_SETPROPERTIES,self,nil); CNSendMessage(LM_SETPROPERTIES,self,nil);
end; end;
procedure TCustomListView.InitializeWnd;
begin
inherited InitializeWnd;
CNSendMessage(LM_SETPROPERTIES,self,nil);
if FSelected<>nil then
CNSendMessage(LM_LV_SELECTITEM,self,FSelected);
end;
{------------------------------------------------------------------------------} {------------------------------------------------------------------------------}
{ TCustomListView DoSelectItem } { TCustomListView DoSelectItem }
{------------------------------------------------------------------------------} {------------------------------------------------------------------------------}
@ -162,10 +171,12 @@ Procedure TCustomListView.ItemChanged(Index : Integer); //called by TListItems
Begin Begin
if csDestroying in Componentstate Then Exit; if csDestroying in Componentstate Then Exit;
if FUpdateCount>0 then if FUpdateCount>0 then
FUpdateNeeded:=true Include(FStates,lvUpdateNeeded)
else else begin
//notify the interface.... //notify the interface....
if (not HandleAllocated) or (csLoading in ComponentState) then exit;
CNSendMessage(LM_LV_CHANGEITEM,self,@Index); CNSendMessage(LM_LV_CHANGEITEM,self,@Index);
end;
End; End;
{------------------------------------------------------------------------------} {------------------------------------------------------------------------------}
@ -175,23 +186,27 @@ Procedure TCustomListView.ItemDeleted(Index : Integer); //called by TListItems
Begin Begin
if csDestroying in Componentstate Then Exit; if csDestroying in Componentstate Then Exit;
if FUpdateCount>0 then if FUpdateCount>0 then
FUpdateNeeded:=true Include(FStates,lvUpdateNeeded)
else else begin
//notify the interface.... //notify the interface....
if (not HandleAllocated) or (csLoading in ComponentState) then exit;
CNSendMessage(LM_LV_DELETEITEM,self,@Index); CNSendMessage(LM_LV_DELETEITEM,self,@Index);
end;
End; End;
{------------------------------------------------------------------------------} {------------------------------------------------------------------------------}
{ TCustomListView ItemAdded } { TCustomListView ItemAdded }
{------------------------------------------------------------------------------} {------------------------------------------------------------------------------}
Procedure TCustomListView.ItemAdded; Procedure TCustomListView.ItemAdded;
Begin Begin
if csDestroying in Componentstate Then Exit; if csDestroying in Componentstate Then Exit;
if FUpdateCount>0 then if FUpdateCount>0 then
FUpdateNeeded:=true Include(FStates,lvUpdateNeeded)
else else begin
//notify the interface.... //notify the interface....
if (not HandleAllocated) or (csLoading in ComponentState) then exit;
CNSendMessage(LM_LV_ADDITEM,self,nil); CNSendMessage(LM_LV_ADDITEM,self,nil);
end;
End; End;
{------------------------------------------------------------------------------} {------------------------------------------------------------------------------}
@ -230,6 +245,7 @@ procedure TCustomListView.SetViewStyle(const AValue: TViewStyle);
begin begin
if FViewStyle = AValue then Exit; if FViewStyle = AValue then Exit;
FViewStyle := AValue; FViewStyle := AValue;
if (not HandleAllocated) or (csLoading in ComponentState) then exit;
CNSendMessage(LM_SETPROPERTIES,self,nil); CNSendMessage(LM_SETPROPERTIES,self,nil);
end; end;
@ -241,6 +257,7 @@ procedure TCustomListView.SetSortType(const AValue: TSortType);
begin begin
if FSortType = AValue then Exit; if FSortType = AValue then Exit;
FSortType := AValue; FSortType := AValue;
if (not HandleAllocated) or (csLoading in ComponentState) then exit;
CNSendMessage(LM_SETPROPERTIES,self,nil); CNSendMessage(LM_SETPROPERTIES,self,nil);
end; end;
@ -251,6 +268,7 @@ procedure TCustomListView.SetSortColumn(const AValue : Integer);
begin begin
if FSortColumn = AValue then Exit; if FSortColumn = AValue then Exit;
FSortColumn := AValue; FSortColumn := AValue;
if (not HandleAllocated) or (csLoading in ComponentState) then exit;
CNSendMessage(LM_SETPROPERTIES,self,nil); CNSendMessage(LM_SETPROPERTIES,self,nil);
end; end;
@ -289,6 +307,11 @@ begin
DoUpdate; DoUpdate;
end; end;
function TCustomListView.GetMultiSelect: Boolean;
begin
Result:=lvMultiSelect in FStates;
end;
{------------------------------------------------------------------------------} {------------------------------------------------------------------------------}
{ TCustomListView GetSelection } { TCustomListView GetSelection }
{------------------------------------------------------------------------------} {------------------------------------------------------------------------------}
@ -303,19 +326,24 @@ end;
procedure TCustomListView.SetSelection(const AValue: TListItem); procedure TCustomListView.SetSelection(const AValue: TListItem);
begin begin
if FSelected=AValue then exit; if FSelected=AValue then exit;
// ToDo: send message to interface FSelected := AValue;
//FSelected := AValue; if (not HandleAllocated) or (csLoading in ComponentState) then exit;
CNSendMessage(LM_LV_SELECTITEM,self,FSelected);
//DoSelectItem(FSelected, True); //DoSelectItem(FSelected, True);
end; end;
procedure TCustomListView.SetMultiSelect(const AValue: Boolean); procedure TCustomListView.SetMultiSelect(const AValue: Boolean);
begin begin
if FMultiSelect <> AValue then if MultiSelect <> AValue then
Begin Begin
FMultiSelect := AValue; if AValue then
CNSendMessage(LM_SETPROPERTIES,self,nil); Include(FStates,lvMultiSelect)
end; else
Exclude(FStates,lvMultiSelect);
if (not HandleAllocated) or (csLoading in ComponentState) then
Include(FStates,lvUpdateNeeded);
CNSendMessage(LM_SETPROPERTIES,self,nil);
end;
end; end;
procedure TCustomListView.SetSmallImages(const AValue: TCustomImageList); procedure TCustomListView.SetSmallImages(const AValue: TCustomImageList);
@ -332,6 +360,7 @@ begin
FSmallImages.RegisterChanges(FImageChangeLink); FSmallImages.RegisterChanges(FImageChangeLink);
FSmallImages.FreeNotification(self); FSmallImages.FreeNotification(self);
end; end;
if (not HandleAllocated) or (csLoading in ComponentState) then exit;
CNSendMessage(LM_SETPROPERTIES,self,nil); CNSendMessage(LM_SETPROPERTIES,self,nil);
end; end;
end; end;
@ -340,10 +369,12 @@ Procedure TCustomListView.ImageChanged(Sender : TObject);
begin begin
if csDestroying in Componentstate Then Exit; if csDestroying in Componentstate Then Exit;
if FUpdateCount>0 then if FUpdateCount>0 then
FUpdateNeeded:=true Include(FStates,lvUpdateNeeded)
else else begin
//image changed so redraw it all.... //image changed so redraw it all....
if (not HandleAllocated) or (csLoading in ComponentState) then exit;
CNSendMessage(LM_SETPROPERTIES,self,nil); CNSendMessage(LM_SETPROPERTIES,self,nil);
end;
end; end;
procedure TCustomListView.SetScrollBars(const Value: TScrollStyle); procedure TCustomListView.SetScrollBars(const Value: TScrollStyle);
@ -383,7 +414,7 @@ procedure TCustomListView.UpdateScrollbars;
var var
ScrollInfo: TScrollInfo; ScrollInfo: TScrollInfo;
begin begin
writeln('TODO: TCustomListView.UpdateScrollbars'); writeln('TODO: TCustomListView.UpdateScrollbars');
exit; exit;
if not HandleAllocated then exit if not HandleAllocated then exit
@ -497,6 +528,9 @@ end;
{ ============================================================================= { =============================================================================
$Log$ $Log$
Revision 1.21 2002/09/10 10:00:27 lazarus
MG: TListView now works handleless and SetSelection implemented
Revision 1.20 2002/08/28 10:44:45 lazarus Revision 1.20 2002/08/28 10:44:45 lazarus
MG: implemented run param environment variables MG: implemented run param environment variables

View File

@ -126,6 +126,7 @@ const
LM_LV_ADDITEM = LM_LV_FIRST+1; LM_LV_ADDITEM = LM_LV_FIRST+1;
LM_LV_CHANGEITEM = LM_LV_FIRST+2; LM_LV_CHANGEITEM = LM_LV_FIRST+2;
LM_LV_DELETEITEM = LM_LV_FIRST+3; LM_LV_DELETEITEM = LM_LV_FIRST+3;
LM_LV_SELECTITEM = LM_LV_FIRST+4;
LM_LV_LAST = LM_LV_FIRST+9; // LM_COMUSER+89 LM_LV_LAST = LM_LV_FIRST+9; // LM_COMUSER+89
// TComboBox // TComboBox
@ -847,6 +848,9 @@ end.
{ {
$Log$ $Log$
Revision 1.31 2002/09/10 10:00:27 lazarus
MG: TListView now works handleless and SetSelection implemented
Revision 1.30 2002/09/04 09:32:17 lazarus Revision 1.30 2002/09/04 09:32:17 lazarus
MG: improved streaming error handling MG: improved streaming error handling