lazcontrols: fixed crash on freeing TFileNameItem

git-svn-id: trunk@43341 -
This commit is contained in:
mattias 2013-10-30 10:20:24 +00:00
parent 6130157a41
commit 766298e0ef
2 changed files with 24 additions and 9 deletions

View File

@ -45,7 +45,9 @@ type
procedure ApplyFilter; procedure ApplyFilter;
procedure TVDeleteUnneededNodes(p: integer); procedure TVDeleteUnneededNodes(p: integer);
procedure TVClearUnneededAndCreateHierachy(Filename: string); procedure TVClearUnneededAndCreateHierachy(Filename: string);
protected
procedure FreeNodeData(ANode : TTreeNode); procedure FreeNodeData(ANode : TTreeNode);
private
procedure RemoveChildrenData(ARootNode : TTreeNode); procedure RemoveChildrenData(ARootNode : TTreeNode);
public public
constructor Create(AOwner: TTreeFilterEdit; ARootNode: TTreeNode); constructor Create(AOwner: TTreeFilterEdit; ARootNode: TTreeNode);
@ -104,7 +106,8 @@ type
TTFENodeData = class TTFENodeData = class
public public
Node : TObject; Node,
Branch : TObject;
end; end;
{ TFileNameItem } { TFileNameItem }
@ -224,14 +227,17 @@ begin
TVNode:=fOwner.fFilteredTreeview.Items.AddChild(fRootNode,FileN); TVNode:=fOwner.fFilteredTreeview.Items.AddChild(fRootNode,FileN);
// Save the long filename to Node.Data // Save the long filename to Node.Data
AObject := TObject(fNodeTextToDataMap[FileN]); AObject := TObject(fNodeTextToDataMap[FileN]);
If Assigned(AObject) And AObject.InheritsFrom(TTFENodeData) then If Assigned(AObject) And AObject.InheritsFrom(TTFENodeData) then Begin
TTFENodeData(AObject).Node := TVNode; TTFENodeData(AObject).Node := TVNode;
TTFENodeData(AObject).Branch := Self;
end;
if fNodeTextToFullFilenameMap.Count > 0 then begin if fNodeTextToFullFilenameMap.Count > 0 then begin
s:=FileN; s:=FileN;
if fNodeTextToFullFilenameMap.Contains(FileN) then if fNodeTextToFullFilenameMap.Contains(FileN) then
s:=fNodeTextToFullFilenameMap[FileN]; // Full file name. s:=fNodeTextToFullFilenameMap[FileN]; // Full file name.
AObject := TFileNameItem.Create(s, AObject); AObject := TFileNameItem.Create(s, AObject);
TTFENodeData(AObject).Node := TVNode; TTFENodeData(AObject).Node := TVNode;
TTFENodeData(AObject).Branch := Self;
end; end;
TVNode.Data:=AObject; TVNode.Data:=AObject;
// Get ImageIndex for Node // Get ImageIndex for Node
@ -330,8 +336,10 @@ Begin
AObject := NIL; AObject := NIL;
If Assigned(ANode) And Assigned(ANode.Data) Then Begin If Assigned(ANode) And Assigned(ANode.Data) Then Begin
AObject := TObject(ANode.Data); AObject := TObject(ANode.Data);
If Assigned(AObject) And AObject.InheritsFrom(TTFENodeData) Then If Assigned(AObject) And AObject.InheritsFrom(TTFENodeData) Then Begin
TTFENodeData(AObject).Node := NIL; TTFENodeData(AObject).Node := NIL;
TTFENodeData(AObject).Branch := NIL;
end;
If Assigned(AObject) And (AObject is TFileNameItem) Then If Assigned(AObject) And (AObject is TFileNameItem) Then
AObject.Free; AObject.Free;
ANode.Data := NIL; ANode.Data := NIL;

View File

@ -1083,6 +1083,9 @@ begin
PackageEditors.ViewPkgToDos(LazPackage); PackageEditors.ViewPkgToDos(LazPackage);
end; end;
Type
TTreeFilterBranchAccess = class(TTreeFilterBranch);
procedure TPackageEditorForm.FreeNodeData(Typ: TPENodeType); procedure TPackageEditorForm.FreeNodeData(Typ: TPENodeType);
var var
NodeData: TPENodeData; NodeData: TPENodeData;
@ -1092,6 +1095,8 @@ begin
while NodeData<>nil do begin while NodeData<>nil do begin
n:=NodeData; n:=NodeData;
NodeData:=NodeData.Next; NodeData:=NodeData.Next;
if Assigned(n.Branch) Then
TTreeFilterBranchAccess(n.Branch).FreeNodeData(TTreeNode(n.Node));
n.Free; n.Free;
end; end;
FFirstNodeData[Typ]:=nil; FFirstNodeData[Typ]:=nil;
@ -1773,8 +1778,8 @@ begin
// files belonging to package // files belonging to package
FilesBranch:=FilterEdit.GetBranch(FFilesNode); FilesBranch:=FilterEdit.GetBranch(FFilesNode);
FilesBranch.Clear;
FreeNodeData(penFile); FreeNodeData(penFile);
FilesBranch.Clear;
FilterEdit.SelectedPart:=FNextSelectedPart; FilterEdit.SelectedPart:=FNextSelectedPart;
FilterEdit.ShowDirHierarchy:=ShowDirectoryHierarchy; FilterEdit.ShowDirHierarchy:=ShowDirectoryHierarchy;
FilterEdit.SortData:=SortAlphabetically; FilterEdit.SortData:=SortAlphabetically;
@ -1798,6 +1803,7 @@ begin
FRemovedFilesNode.SelectedIndex:=FRemovedFilesNode.ImageIndex; FRemovedFilesNode.SelectedIndex:=FRemovedFilesNode.ImageIndex;
end; end;
RemovedBranch:=FilterEdit.GetBranch(FRemovedFilesNode); RemovedBranch:=FilterEdit.GetBranch(FRemovedFilesNode);
RemovedBranch.Clear;
for i:=0 to LazPackage.RemovedFilesCount-1 do begin for i:=0 to LazPackage.RemovedFilesCount-1 do begin
CurFile:=LazPackage.RemovedFiles[i]; CurFile:=LazPackage.RemovedFiles[i];
NodeData:=CreateNodeData(penFile,CurFile.Filename,true); NodeData:=CreateNodeData(penFile,CurFile.Filename,true);
@ -1824,8 +1830,8 @@ begin
// required packages // required packages
RequiredBranch:=FilterEdit.GetBranch(FRequiredPackagesNode); RequiredBranch:=FilterEdit.GetBranch(FRequiredPackagesNode);
RequiredBranch.Clear;
FreeNodeData(penDependency); FreeNodeData(penDependency);
RequiredBranch.Clear;
FilterEdit.SelectedPart:=FNextSelectedPart; FilterEdit.SelectedPart:=FNextSelectedPart;
CurDependency:=LazPackage.FirstRequiredDependency; CurDependency:=LazPackage.FirstRequiredDependency;
while CurDependency<>nil do begin while CurDependency<>nil do begin
@ -1851,6 +1857,7 @@ begin
FRemovedRequiredNode.SelectedIndex:=FRemovedRequiredNode.ImageIndex; FRemovedRequiredNode.SelectedIndex:=FRemovedRequiredNode.ImageIndex;
end; end;
RemovedBranch:=FilterEdit.GetBranch(FRemovedRequiredNode); RemovedBranch:=FilterEdit.GetBranch(FRemovedRequiredNode);
RemovedBranch.Clear;
while CurDependency<>nil do begin while CurDependency<>nil do begin
NodeData:=CreateNodeData(penDependency,CurDependency.PackageName,true); NodeData:=CreateNodeData(penDependency,CurDependency.PackageName,true);
RemovedBranch.AddNodeData(CurDependency.AsString, NodeData); RemovedBranch.AddNodeData(CurDependency.AsString, NodeData);
@ -2045,9 +2052,9 @@ begin
Result:=nil; Result:=nil;
if (TVNode=nil) then exit; if (TVNode=nil) then exit;
o:=TObject(TVNode.Data); o:=TObject(TVNode.Data);
if o is TFileNameItem then if Assigned(o) and (o is TFileNameItem) then
o:=TObject(TFileNameItem(o).Data); o:=TObject(TFileNameItem(o).Data);
if o is TPENodeData then if Assigned(o) and (o is TPENodeData) then
Result:=TPENodeData(o); Result:=TPENodeData(o);
end; end;
@ -2399,14 +2406,14 @@ destructor TPackageEditorForm.Destroy;
var var
nt: TPENodeType; nt: TPENodeType;
begin begin
for nt:=Low(TPENodeType) to High(TPENodeType) do
FreeNodeData(nt);
if PackageEditorMenuRoot.MenuItem=FilesPopupMenu.Items then if PackageEditorMenuRoot.MenuItem=FilesPopupMenu.Items then
PackageEditorMenuRoot.MenuItem:=nil; PackageEditorMenuRoot.MenuItem:=nil;
PackageEditors.DoFreeEditor(LazPackage); PackageEditors.DoFreeEditor(LazPackage);
FLazPackage:=nil; FLazPackage:=nil;
FreeAndNil(FPlugins); FreeAndNil(FPlugins);
inherited Destroy; inherited Destroy;
for nt:=Low(TPENodeType) to High(TPENodeType) do
FreeNodeData(nt);
end; end;
{ TPackageEditors } { TPackageEditors }