fctreenode本身有stringdata和stringdata2,我想再加几个如stringdata3、stringdata4、stringdata5、stringdata6,改了TfcTreeNode 类如下:
  TfcTreeNode = class(TPersistent)
  private
     FMultiSelected: boolean;
     FCheckboxType: TfcTreeViewCheckboxType;
     FChecked: boolean;     FOwner: TfcTreeNodes;
     FText: string;     FStringData1: string;     FStringData2: string;
     FStringData3: string;
     FStringData4: string;
     FStringData5: string;
     FStringData6: String;
在程序运行中可以正常访问到StringData3到stringdata6,但是用delphi设计窗体时添加节点总是数据部正确,writedata的代码如下:
procedure TfcTreeNode.WriteData(Stream: TStream; Info: PfcNodeInfo);
var
  Size, L, ItemCount: Integer;
  Node: TfcTreeNode;
  //sl : TStringList ;
begin
  L := Length(Text);
  if L > 255 then L := 255;  Size := GetSizeOfNodeInfo + L - 255;//  Size := SizeOf(TfcNodeInfo) + L - 255;
  FillChar(Info^, SizeOf(TfcNodeInfo), 0);
  {$warnings off}
  Info^.Text := Text;
  {$warnings on}
  Info^.ImageIndex := ImageIndex;
  Info^.SelectedIndex := SelectedIndex;
  Info^.OverlayIndex := OverlayIndex;
  Info^.StateIndex := StateIndex;
  Info^.Data := Data;
  ItemCount := Count;
  Info^.Count := ItemCount;
  Info^.CheckboxType:= CheckboxType;
  Info^.Checked:= ord(Checked) + $02 * Ord(Grayed);
  Info^.Expanded := Expanded;
  Info^.StringDataSize1:= length(StringData);  Info^.StringDataSize2:= length(StringData2);  Info^.StringDataSize3:= length(StringData3);  Info^.StringDataSize4:= length(StringData4);  Info^.StringDataSize5:= length(StringData5);  Info^.StringDataSize6:= length(StringData6);  Stream.WriteBuffer(Size, SizeOf(Size));
  Stream.WriteBuffer(Info^, Size);  { Support StringData properties }
  if Info^.StringDataSize1>0 then begin
     Stream.WriteBuffer(PChar(StringData)^, length(StringData));  end;  if Info^.StringDataSize2>0 then begin
     Stream.WriteBuffer(PChar(StringData2)^, length(StringData2));
  end;  if Info^.StringDataSize3>0 then begin
     Stream.WriteBuffer(PChar(StringData3)^, length(StringData3));
  end;  if Info^.StringDataSize4>0 then begin
     Stream.WriteBuffer(PChar(StringData4)^, length(StringData4));
  end;  if Info^.StringDataSize5>0 then begin
     Stream.WriteBuffer(PChar(StringData5)^, length(StringData5));
  end;  if Info^.StringDataSize6>0 then begin
     Stream.WriteBuffer(PChar(StringData6)^, length(StringData6));
  end;  Node := GetFirstChild;
  while Node <> nil do
  begin
    Node.WriteData(Stream, Info);
    Node := Node.GetNextSibling;
  end;//  for I := 0 to ItemCount - 1 do Item[I].WriteData(Stream, Info);
end;
readdata的代码如下:
procedure TfcTreeNode.ReadData(Stream: TStream; Info: PfcNodeInfo);
var
  I, Size, ItemCount: Integer;
  StrBuffer: PChar;
  Temp: Integer;
  UseExpanded:Boolean;
begin
  Owner.ClearCache;
  Stream.ReadBuffer(Size, SizeOf(Size));  { 7/6/99 - Save for fcTreeCombo streaming }
  {$ifdef fcDelphi4Up}
  ReadDataSize:= Size;
  {$endif}  { RSW - Advance if somehow size is greater than node size }
  Stream.ReadBuffer(Info^, fcmin(Size, SizeOf(Info^)));
  Temp := SizeOf(TfcNodeInfo) - (255 - Length(Info^.Text));  { Support StringData property }
  if Info^.StringDataSize1>0 then
  begin
     StrBuffer:= StrAlloc(Info^.StringDataSize1+1);
     StrBuffer[Info^.StringDataSize1]:= #0;
     Stream.ReadBuffer(StrBuffer^, Info^.StringDataSize1);
     StringData:= StrPas(StrBuffer);
     StrDispose(StrBuffer);
  end
  else StringData:= '';  { Support StringData property }
  if Info^.StringDataSize2>0 then
  begin
     StrBuffer:= StrAlloc(Info^.StringDataSize2+1);
     StrBuffer[Info^.StringDataSize2]:= #0;
     Stream.ReadBuffer(StrBuffer^, Info^.StringDataSize2);
     StringData2:= StrPas(StrBuffer);
     StrDispose(StrBuffer);
  end
  else StringData2:= '';
  { Support StringData property }
  if Info^.StringDataSize3>0 then
  begin
     StrBuffer:= StrAlloc(Info^.StringDataSize3+1);
     StrBuffer[Info^.StringDataSize3]:= #0;
     Stream.ReadBuffer(StrBuffer^, Info^.StringDataSize3);
     StringData3:= StrPas(StrBuffer);
     StrDispose(StrBuffer);
  end
  else StringData3:= '';
  { Support StringData property }
  if Info^.StringDataSize4>0 then
  begin
     StrBuffer:= StrAlloc(Info^.StringDataSize4+1);
     StrBuffer[Info^.StringDataSize4]:= #0;
     Stream.ReadBuffer(StrBuffer^, Info^.StringDataSize4);
     StringData4:= StrPas(StrBuffer);
     StrDispose(StrBuffer);
  end
  else StringData4:= '';
  { Support StringData property }
  if Info^.StringDataSize5>0 then
  begin
     StrBuffer:= StrAlloc(Info^.StringDataSize5+1);
     StrBuffer[Info^.StringDataSize5]:= #0;
     Stream.ReadBuffer(StrBuffer^, Info^.StringDataSize5);
     StringData5:= StrPas(StrBuffer);
     StrDispose(StrBuffer);
  end
  else StringData5:= '';
  { Support StringData property }
  if Info^.StringDataSize6>0 then
  begin
     StrBuffer:= StrAlloc(Info^.StringDataSize6+1);
     StrBuffer[Info^.StringDataSize6]:= #0;
     Stream.ReadBuffer(StrBuffer^, Info^.StringDataSize6);
     StringData6:= StrPas(StrBuffer);
     StrDispose(StrBuffer);
  end
  else StringData6:= '';  {$warnings off}
  Text := Info^.Text;
  {$warnings on}
  ImageIndex := Info^.ImageIndex;
  SelectedIndex := Info^.SelectedIndex;
  StateIndex := Info^.StateIndex;
  OverlayIndex := Info^.OverlayIndex;
  Data := Info^.Data;
  ItemCount := Info^.Count;
  CheckboxType:= Info^.CheckboxType;
  Checked:= (Info^.Checked and $01)<>0;  Grayed:= (Info^.Checked and $02)<>0;  UseExpanded:= Info^.Expanded;  for I := 0 to ItemCount - 1 do
    with Owner.AddChild(Self, '') do ReadData(Stream, Info);  // 1/31/2002-PYW-Added new property to respect expanded node settings.
  if (Owner.Owner<>nil) and (Owner.Owner.StreamExpandedNode) then
     Expanded := UseExpanded;  if TreeView.StreamVersion=1 then
     if Size > Temp then Stream.Position:= Stream.Position + (Size - Temp);
end;
哪位大哥给指点一下

解决方案 »

  1.   

    我给标准的Ttreenode加过stringdata,没想到有人也这么干!
    看来以后应该加入标准了。。fctreenode是什么控件包的?【在程序运行中可以正常访问到StringData3到stringdata6,但是用delphi设计窗体时添加节点总是数据部正确】
    不正确?怎么个不正确法不说其实,有一个stringdata就足够了,因为string支持2G,你完全可以把n个字符串编码为一个string啊
    取的时候,再解码一下就行了
      

  2.   

    多弄几个stringdata便于直接操作
    我那几个并都是新手,所以操作不能太复杂
    设计窗体上有个filer的东西,将窗体属性保存到dfm文件中
    就是保存到窗体和读取出来出错误
      

  3.   

    fctreenode是控件包1stclass中的一个类,很多人都用过
      

  4.   

    要在dfm里保存这些,需要把它们加到属性里,而不仅仅是私有里
      

  5.   

    它自己的2个stringdata不会报错?
      

  6.   

    不会,我是按照哪里有stringdata2就在下面加的stringdata3-stringdata6,编译完的程序可以运行,也可以访问,使用正常,就是在delphi的ide中fctreeview存入和取出dfm中的stringdata出错,也没错误提示,就是取出的数据部正确
      

  7.   

    你看看stringdata1/2有没有属性的支持一般,data、stringdataX之类的,只是运行时存储附加信息用的,设计时(存入dfm)没必要支持