mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-02 03:36:10 +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 TVDeleteUnneededNodes(p: integer);
|
||||
procedure TVClearUnneededAndCreateHierachy(Filename: string);
|
||||
protected
|
||||
procedure FreeNodeData(ANode : TTreeNode);
|
||||
private
|
||||
procedure RemoveChildrenData(ARootNode : TTreeNode);
|
||||
public
|
||||
constructor Create(AOwner: TTreeFilterEdit; ARootNode: TTreeNode);
|
||||
@ -104,7 +106,8 @@ type
|
||||
|
||||
TTFENodeData = class
|
||||
public
|
||||
Node : TObject;
|
||||
Node,
|
||||
Branch : TObject;
|
||||
end;
|
||||
|
||||
{ TFileNameItem }
|
||||
@ -224,14 +227,17 @@ begin
|
||||
TVNode:=fOwner.fFilteredTreeview.Items.AddChild(fRootNode,FileN);
|
||||
// Save the long filename to Node.Data
|
||||
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).Branch := Self;
|
||||
end;
|
||||
if fNodeTextToFullFilenameMap.Count > 0 then begin
|
||||
s:=FileN;
|
||||
if fNodeTextToFullFilenameMap.Contains(FileN) then
|
||||
s:=fNodeTextToFullFilenameMap[FileN]; // Full file name.
|
||||
AObject := TFileNameItem.Create(s, AObject);
|
||||
TTFENodeData(AObject).Node := TVNode;
|
||||
TTFENodeData(AObject).Branch := Self;
|
||||
end;
|
||||
TVNode.Data:=AObject;
|
||||
// Get ImageIndex for Node
|
||||
@ -330,8 +336,10 @@ Begin
|
||||
AObject := NIL;
|
||||
If Assigned(ANode) And Assigned(ANode.Data) Then Begin
|
||||
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).Branch := NIL;
|
||||
end;
|
||||
If Assigned(AObject) And (AObject is TFileNameItem) Then
|
||||
AObject.Free;
|
||||
ANode.Data := NIL;
|
||||
|
@ -1083,6 +1083,9 @@ begin
|
||||
PackageEditors.ViewPkgToDos(LazPackage);
|
||||
end;
|
||||
|
||||
Type
|
||||
TTreeFilterBranchAccess = class(TTreeFilterBranch);
|
||||
|
||||
procedure TPackageEditorForm.FreeNodeData(Typ: TPENodeType);
|
||||
var
|
||||
NodeData: TPENodeData;
|
||||
@ -1092,6 +1095,8 @@ begin
|
||||
while NodeData<>nil do begin
|
||||
n:=NodeData;
|
||||
NodeData:=NodeData.Next;
|
||||
if Assigned(n.Branch) Then
|
||||
TTreeFilterBranchAccess(n.Branch).FreeNodeData(TTreeNode(n.Node));
|
||||
n.Free;
|
||||
end;
|
||||
FFirstNodeData[Typ]:=nil;
|
||||
@ -1773,8 +1778,8 @@ begin
|
||||
|
||||
// files belonging to package
|
||||
FilesBranch:=FilterEdit.GetBranch(FFilesNode);
|
||||
FilesBranch.Clear;
|
||||
FreeNodeData(penFile);
|
||||
FilesBranch.Clear;
|
||||
FilterEdit.SelectedPart:=FNextSelectedPart;
|
||||
FilterEdit.ShowDirHierarchy:=ShowDirectoryHierarchy;
|
||||
FilterEdit.SortData:=SortAlphabetically;
|
||||
@ -1798,6 +1803,7 @@ begin
|
||||
FRemovedFilesNode.SelectedIndex:=FRemovedFilesNode.ImageIndex;
|
||||
end;
|
||||
RemovedBranch:=FilterEdit.GetBranch(FRemovedFilesNode);
|
||||
RemovedBranch.Clear;
|
||||
for i:=0 to LazPackage.RemovedFilesCount-1 do begin
|
||||
CurFile:=LazPackage.RemovedFiles[i];
|
||||
NodeData:=CreateNodeData(penFile,CurFile.Filename,true);
|
||||
@ -1824,8 +1830,8 @@ begin
|
||||
|
||||
// required packages
|
||||
RequiredBranch:=FilterEdit.GetBranch(FRequiredPackagesNode);
|
||||
RequiredBranch.Clear;
|
||||
FreeNodeData(penDependency);
|
||||
RequiredBranch.Clear;
|
||||
FilterEdit.SelectedPart:=FNextSelectedPart;
|
||||
CurDependency:=LazPackage.FirstRequiredDependency;
|
||||
while CurDependency<>nil do begin
|
||||
@ -1851,6 +1857,7 @@ begin
|
||||
FRemovedRequiredNode.SelectedIndex:=FRemovedRequiredNode.ImageIndex;
|
||||
end;
|
||||
RemovedBranch:=FilterEdit.GetBranch(FRemovedRequiredNode);
|
||||
RemovedBranch.Clear;
|
||||
while CurDependency<>nil do begin
|
||||
NodeData:=CreateNodeData(penDependency,CurDependency.PackageName,true);
|
||||
RemovedBranch.AddNodeData(CurDependency.AsString, NodeData);
|
||||
@ -2045,9 +2052,9 @@ begin
|
||||
Result:=nil;
|
||||
if (TVNode=nil) then exit;
|
||||
o:=TObject(TVNode.Data);
|
||||
if o is TFileNameItem then
|
||||
if Assigned(o) and (o is TFileNameItem) then
|
||||
o:=TObject(TFileNameItem(o).Data);
|
||||
if o is TPENodeData then
|
||||
if Assigned(o) and (o is TPENodeData) then
|
||||
Result:=TPENodeData(o);
|
||||
end;
|
||||
|
||||
@ -2399,14 +2406,14 @@ destructor TPackageEditorForm.Destroy;
|
||||
var
|
||||
nt: TPENodeType;
|
||||
begin
|
||||
for nt:=Low(TPENodeType) to High(TPENodeType) do
|
||||
FreeNodeData(nt);
|
||||
if PackageEditorMenuRoot.MenuItem=FilesPopupMenu.Items then
|
||||
PackageEditorMenuRoot.MenuItem:=nil;
|
||||
PackageEditors.DoFreeEditor(LazPackage);
|
||||
FLazPackage:=nil;
|
||||
FreeAndNil(FPlugins);
|
||||
inherited Destroy;
|
||||
for nt:=Low(TPENodeType) to High(TPENodeType) do
|
||||
FreeNodeData(nt);
|
||||
end;
|
||||
|
||||
{ TPackageEditors }
|
||||
|
Loading…
Reference in New Issue
Block a user