mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-12-04 04:37:35 +01:00
LCL: don't stream the Data property of a TreeNode, fixes issue #11749
git-svn-id: trunk@16040 -
This commit is contained in:
parent
f27f168af2
commit
840a0977ba
@ -1799,8 +1799,7 @@ type
|
||||
|
||||
TTreeNodeCompare = function(Node1, Node2: TTreeNode): integer of object;
|
||||
|
||||
PTreeNodeInfo = ^TTreeNodeInfo;
|
||||
TTreeNodeInfo = packed record
|
||||
TOldTreeNodeInfo = packed record
|
||||
ImageIndex: Integer;
|
||||
SelectedIndex: Integer;
|
||||
StateIndex: Integer;
|
||||
@ -1813,6 +1812,18 @@ type
|
||||
// here follows the text
|
||||
end;
|
||||
|
||||
TTreeNodeInfo = packed record
|
||||
ImageIndex: Integer;
|
||||
SelectedIndex: Integer;
|
||||
StateIndex: Integer;
|
||||
OverlayIndex: Integer;
|
||||
Count: Integer;
|
||||
Height: integer;
|
||||
Expanded: boolean;
|
||||
TextLen: integer;
|
||||
// here follows the text
|
||||
end;
|
||||
|
||||
// this is the delphi node stream record
|
||||
PDelphiNodeInfo = ^TDelphiNodeInfo;
|
||||
TDelphiNodeInfo = packed record
|
||||
@ -1877,8 +1888,7 @@ type
|
||||
function IsEqual(Node: TTreeNode): Boolean;
|
||||
function IsNodeVisible: Boolean;
|
||||
function IsNodeHeightFullVisible: Boolean;
|
||||
procedure ReadData(Stream: TStream; StreamVersion: integer;
|
||||
Info: PTreeNodeInfo);
|
||||
procedure ReadData(Stream: TStream; StreamVersion: integer);
|
||||
procedure ReadDelphiData(Stream: TStream; Info: PDelphiNodeInfo);
|
||||
procedure SetCut(AValue: Boolean);
|
||||
procedure SetData(AValue: Pointer);
|
||||
@ -1898,7 +1908,7 @@ type
|
||||
procedure SetText(const S: string);
|
||||
procedure Unbind;
|
||||
procedure UnbindFromMultiSelected;
|
||||
procedure WriteData(Stream: TStream; Info: PTreeNodeInfo);
|
||||
procedure WriteData(Stream: TStream);
|
||||
procedure WriteDelphiData(Stream: TStream; Info: PDelphiNodeInfo);
|
||||
public
|
||||
constructor Create(AnOwner: TTreeNodes);
|
||||
|
||||
@ -31,7 +31,8 @@
|
||||
{ $DEFINE TREEVIEW_DEBUG}
|
||||
|
||||
const
|
||||
TTreeNodeStreamVersion : word = 1;
|
||||
TTreeNodeWithPointerStreamVersion : word = 1;
|
||||
TTreeNodeStreamVersion : word = 2;
|
||||
TVAutoHeightString = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789|\()^';
|
||||
MinNodeCapacity = 10;
|
||||
|
||||
@ -1600,28 +1601,44 @@ begin
|
||||
Result := (Text = Node.Text) and (Data = Node.Data);
|
||||
end;
|
||||
|
||||
procedure TTreeNode.ReadData(Stream: TStream; StreamVersion: integer;
|
||||
Info: PTreeNodeInfo);
|
||||
procedure TTreeNode.ReadData(Stream: TStream; StreamVersion: integer);
|
||||
var
|
||||
I, ItemCount: Integer;
|
||||
NewExpanded: boolean;
|
||||
OldInfo: TOldTreeNodeInfo;
|
||||
Info: TTreeNodeInfo;
|
||||
begin
|
||||
if Owner<>nil then Owner.ClearCache;
|
||||
Stream.ReadBuffer(Info^, SizeOf(TTreeNodeInfo));
|
||||
ImageIndex := Info^.ImageIndex;
|
||||
SelectedIndex := Info^.SelectedIndex;
|
||||
StateIndex := Info^.StateIndex;
|
||||
OverlayIndex := Info^.OverlayIndex;
|
||||
Data := Info^.Data;
|
||||
Height := Info^.Height;
|
||||
NewExpanded := Info^.Expanded;
|
||||
SetLength(FText,Info^.TextLen);
|
||||
if StreamVersion=TTreeNodeWithPointerStreamVersion then
|
||||
begin
|
||||
Stream.ReadBuffer(OldInfo, SizeOf(TOldTreeNodeInfo));
|
||||
ImageIndex := OldInfo.ImageIndex;
|
||||
SelectedIndex := OldInfo.SelectedIndex;
|
||||
StateIndex := OldInfo.StateIndex;
|
||||
OverlayIndex := OldInfo.OverlayIndex;
|
||||
Data := OldInfo.Data;
|
||||
Height := OldInfo.Height;
|
||||
NewExpanded := OldInfo.Expanded;
|
||||
ItemCount := OldInfo.Count;
|
||||
SetLength(FText,OldInfo.TextLen)
|
||||
end
|
||||
else
|
||||
begin
|
||||
Stream.ReadBuffer(Info, SizeOf(TTreeNodeInfo));
|
||||
ImageIndex := Info.ImageIndex;
|
||||
SelectedIndex := Info.SelectedIndex;
|
||||
StateIndex := Info.StateIndex;
|
||||
OverlayIndex := Info.OverlayIndex;
|
||||
Height := Info.Height;
|
||||
NewExpanded := Info.Expanded;
|
||||
ItemCount := Info.Count;
|
||||
SetLength(FText,Info.TextLen);
|
||||
end;
|
||||
if FText<>'' then
|
||||
Stream.Read(FText[1],length(FText));
|
||||
if Owner<>nil then begin
|
||||
ItemCount := Info^.Count;
|
||||
for I := 0 to ItemCount - 1 do
|
||||
Owner.AddChild(Self, '').ReadData(Stream, StreamVersion, Info);
|
||||
Owner.AddChild(Self, '').ReadData(Stream, StreamVersion);
|
||||
end;
|
||||
Expanded := NewExpanded;
|
||||
end;
|
||||
@ -1646,23 +1663,24 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTreeNode.WriteData(Stream: TStream; Info: PTreeNodeInfo);
|
||||
var i: integer;
|
||||
procedure TTreeNode.WriteData(Stream: TStream);
|
||||
var
|
||||
i: integer;
|
||||
Info: TTreeNodeInfo;
|
||||
begin
|
||||
Info^.ImageIndex := ImageIndex;
|
||||
Info^.SelectedIndex := SelectedIndex;
|
||||
Info^.OverlayIndex := OverlayIndex;
|
||||
Info^.StateIndex := StateIndex;
|
||||
Info^.Data := Data;
|
||||
Info^.Height := FHeight;
|
||||
Info^.Count := Count;
|
||||
Info^.Expanded := Expanded;
|
||||
Info^.TextLen := Length(Text);
|
||||
Stream.WriteBuffer(Info^, SizeOf(TTreeNodeInfo));
|
||||
Info.ImageIndex := ImageIndex;
|
||||
Info.SelectedIndex := SelectedIndex;
|
||||
Info.OverlayIndex := OverlayIndex;
|
||||
Info.StateIndex := StateIndex;
|
||||
Info.Height := FHeight;
|
||||
Info.Count := Count;
|
||||
Info.Expanded := Expanded;
|
||||
Info.TextLen := Length(Text);
|
||||
Stream.WriteBuffer(Info, SizeOf(TTreeNodeInfo));
|
||||
if Text<>'' then
|
||||
Stream.Write(FText[1],length(Text));
|
||||
for i := 0 to Count - 1 do
|
||||
Items[i].WriteData(Stream, Info);
|
||||
Items[i].WriteData(Stream);
|
||||
end;
|
||||
|
||||
procedure TTreeNode.WriteDelphiData(Stream: TStream; Info: PDelphiNodeInfo);
|
||||
@ -2359,7 +2377,6 @@ end;
|
||||
procedure TTreeNodes.ReadData(Stream: TStream);
|
||||
var
|
||||
I, NewCount, MagicNumber: Integer;
|
||||
NodeInfo: TTreeNodeInfo;
|
||||
DelphiNodeInfo: TDelphiNodeInfo;
|
||||
StreamVersion: word;
|
||||
begin
|
||||
@ -2372,7 +2389,7 @@ begin
|
||||
// read top level node count
|
||||
Stream.ReadBuffer(NewCount, SizeOf(NewCount));
|
||||
for I := 0 to NewCount - 1 do
|
||||
Add(nil, '').ReadData(Stream, StreamVersion, @NodeInfo);
|
||||
Add(nil, '').ReadData(Stream, StreamVersion);
|
||||
end else begin
|
||||
// delphi stream
|
||||
NewCount:=MagicNumber;
|
||||
@ -2384,7 +2401,6 @@ end;
|
||||
procedure TTreeNodes.WriteData(Stream: TStream);
|
||||
var
|
||||
ANode: TTreeNode;
|
||||
NodeInfo: TTreeNodeInfo;
|
||||
MagicNumber: integer;
|
||||
begin
|
||||
// -7 for lcl stream
|
||||
@ -2397,7 +2413,7 @@ begin
|
||||
// write all nodes recursively
|
||||
ANode := GetFirstNode;
|
||||
while ANode <> nil do begin
|
||||
ANode.WriteData(Stream, @NodeInfo);
|
||||
ANode.WriteData(Stream);
|
||||
ANode := ANode.GetNextSibling;
|
||||
end;
|
||||
end;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user