From 8c2198629fc1c15bf1bc8d8db0f82284642136c8 Mon Sep 17 00:00:00 2001 From: paul Date: Sun, 9 Sep 2007 09:33:16 +0000 Subject: [PATCH] - fix hang (on exit) of projects contains listview with assigned more than 1 imagelist (and hang on lazarus itself) (from Nikolay) issue #9609 git-svn-id: trunk@11975 - --- lcl/comctrls.pp | 2 +- lcl/include/customlistview.inc | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/lcl/comctrls.pp b/lcl/comctrls.pp index 19024fad4b..4e64ce880d 100644 --- a/lcl/comctrls.pp +++ b/lcl/comctrls.pp @@ -858,12 +858,12 @@ type FListItems: TListItems; FColumns: TListColumns; FImages: array[TListViewImageList] of TCustomImageList; + FImageChangeLinks: array[TListViewImageList] of TChangeLink; FFlags: TListViewFlags; FViewStyle: TViewStyle; FSortType: TSortType; FSortColumn: Integer; - FImageChangeLink : TChangeLink; FScrollBars: TScrollStyle; FViewOriginCache: TPoint; // scrolled originwhile handle is not created FSelected: TListItem; // temp copy of the selected item diff --git a/lcl/include/customlistview.inc b/lcl/include/customlistview.inc index 9c4b6ae78c..3110ef67c5 100644 --- a/lcl/include/customlistview.inc +++ b/lcl/include/customlistview.inc @@ -17,6 +17,8 @@ TCustomListView Constructor ------------------------------------------------------------------------------} constructor TCustomListView.Create(AOwner: TComponent); +var + lvil: TListViewImageList; begin inherited Create(AOwner); ControlStyle := ControlStyle - [csCaptureMouse]; @@ -28,8 +30,11 @@ begin FViewStyle := vsList; FSortType := stNone; - FImageChangeLink := TChangeLink.Create; - FImageChangeLink.OnChange := @ImageChanged; + for lvil := Low(TListViewImageList) to High(TListViewImageList) do + begin + FImageChangeLinks[lvil] := TChangeLink.Create; + FImageChangeLinks[lvil].OnChange := @ImageChanged; + end; FHoverTime := -1; TabStop := true; SetInitialBounds(0,0,100,90); @@ -530,13 +535,16 @@ end; { TCustomListView Destructor } {------------------------------------------------------------------------------} destructor TCustomListView.Destroy; +var + lvil: TListViewImageList; begin // Better destroy the wincontrol (=widget) first. So wo don't have to delete // all items/columns and we won't get notifications for each. FreeAndNil(FCanvas); inherited Destroy; FreeAndNil(FColumns); - FreeAndNil(FImageChangeLink); + for lvil := Low(TListViewImageList) to High(TListViewImageList) do + FreeAndNil(FImageChangeLinks[lvil]); FreeAndNil(FListItems); end; @@ -780,13 +788,13 @@ begin if FImages[lvil] = AValue then Exit; if FImages[lvil] <> nil - then FImages[lvil].UnregisterChanges(FImageChangeLink); + then FImages[lvil].UnregisterChanges(FImageChangeLinks[lvil]); FImages[lvil] := AValue; if FImages[lvil] <> nil then begin - FImages[lvil].RegisterChanges(FImageChangeLink); + FImages[lvil].RegisterChanges(FImageChangeLinks[lvil]); FImages[lvil].FreeNotification(self); end;