LCL: don't stream the Data property of a TreeNode, fixes issue #11749

git-svn-id: trunk@16040 -
This commit is contained in:
vincents 2008-08-12 14:27:25 +00:00
parent f27f168af2
commit 840a0977ba
2 changed files with 62 additions and 36 deletions

View File

@ -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);

View File

@ -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;