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