mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-13 14:09:16 +02:00
lazcontrols: fixed crash on freeing TFileNameItem
git-svn-id: trunk@43341 -
This commit is contained in:
parent
6130157a41
commit
766298e0ef
@ -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;
|
||||||
|
@ -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 }
|
||||||
|
Loading…
Reference in New Issue
Block a user