请来帮我看看为什么我的这个function不能实现在字符串前添加n个TAB值?
function Tf_power.TabNum(parent_name:string):string;
var
  counter,i:integer;
  s,p_name,r_name:string;
begin
  s:='  ';       //给s赋值为TAB值
  r_name:='';
  counter:=0;
  p_name:=parent_name;     //
  while pos('.',p_name)<>0 do //判断父节点中是否还含有'.'字符
  begin
    i:=pos('.',p_name);   //如果还含有'.',就将'.'的位置赋给变量i
    delete(p_name,1,i); //然后删去'.'前的字(包括'.'字符),并赋值给p_name
    counter:=counter+1;      //记数器累加
  end;
  for i:=1 to counter do   //循环累加TAB值
    r_name:=s+r_name;    // 在r_name前添加TAB值
  TabNum:=r_name;      //将r_name值赋给TabNum,并返回调用点
end;

解决方案 »

  1.   

    你r_name里的东西好像一直就是空格,经过循环后就是空格加TAB,返回的值好像除了空格和TAB就什么也没有了
      

  2.   

    r_name:=s+r_name;
    你这里是不是应该是p_name呢?
    你的r_name始终没有赋值的呀!
      

  3.   

    对不起,刚才说错了r_name里是空,返回值是counter个s;
    Edit1.Text:=TabNum('abc.123.vby.yyy')+'abc.123.vby.yyy';这样可以看出效果来
      

  4.   

    是呀,我就是产生TAB空格的呀,然后在返回给调用的地方,把空格加到需要的地方去,还有r_name不是空格,是空的字符串,s是一个TAB字符串,然后通过TabNum返回去的,再在其他的地方加上这些空格和需要的名称呀
      

  5.   

    问题出在你  s:='  '; 上,编译器把TAB解释成几个空格了.
    测试:
     s:='  ';       //给s赋值为TAB值
      b:= '  ';
      if b = s then
        showmessage('asdj');
      

  6.   

    是不是TAB的值与编译器有关,那我应该怎么才能实现统一的TAB值呢?不一定要空多少个格吧?
      

  7.   

    我给s赋的就是TAB值呀,我没有用空格代替呀
      

  8.   

    你这样试试看:
    for i:=1 to counter do   //循环累加TAB值
        r_name:= #9 + r_name;    // 在r_name前添加TAB值
      

  9.   

    虚拟键码     键值   说明
    VK_TAB      09     TAB key
    对用#9或VK_TAB试一下
      

  10.   

    我试过了,还是不行,根本不能实现空TAB值,但是如果我把r_name:=#32的话,就只有第一个父节点,但第二个父节点也被放在第一个父节点里面了,是不是我的循环出现了问题呀?
      

  11.   

    没有人解答吗?我把全部源码贴上
    procedure Tf_power.FormShow(Sender: TObject);
    begin
       writetext;
      //buildtreedata;
    end;
    procedure Tf_power.WriteText;
    var
      f:textfile;
      ss1:string;
    begin
      with dm_data.ClientDataSet_user do
      begin
        Active:=false;
        Active:=true;
      end;
      Assignfile(f,'c:\111.txt');
      Rewrite(f);
      ss1:=TabNum(dm_data.ClientDataSet_user.Fields[2].AsString);    //调用后的函数返回给ss1
      while not dm_data.ClientDataSet_user.Eof do
      begin
        WriteLn(f,ss1+'('+dm_data.ClientDataSet_user.Fields[0].AsString+')'+dm_data.ClientDataSet_user.Fields[2].AsString); //在文本中添加节点编码和节点名称
        dm_data.ClientDataSet_user.Next;   //将Clientdataset的指针下移
      end;
      Closefile(f);   //关闭文本文件
      tv_user.LoadFromFile('c:\111.txt');
    end;
    function Tf_power.TabNum(parent_name:string):string;
    var
      counter,i:integer;
      p_name,r_name:string;
    begin
      //s:=#9;       //给s赋值为TAB值
      r_name:=#32;
      counter:=0;
      p_name:=parent_name;
      while (pos('.',p_name)<>0) do //判断父节点中是否还含有'.'字符
      begin
        i:=pos('.',p_name);   //如果还含有'.',就将'.'的位置赋给变量i
        delete(p_name,1,i);   //然后删去'.'前的字(包括'.'字符),并赋值给p_name
        counter:=counter+1;      //记数器累加
      end;
      for i:=0 to counter-1 do   //循环累加TAB值
        r_name:=#9+r_name;    // 在r_name前添加TAB值
      TabNum:=r_name;      //将r_name值赋给TabNum,并返回调用点
    end;
    请大家帮忙看看
      

  12.   

    把你生成的 Text文件贴一下看看,可能少回车或换行
      

  13.   

    (01)aaa                           
    (0101)aaa.ccc                           
    (0102)aaa.ddd                           
    (010201)aaa.ddd.fff                           
    (02)bbb                           
    (0201)bbb.eee  
    文本文件内的内容
      

  14.   

    Tree:
    qqqq
        1111
        2222
    eeee
        3333
    对应的存储如下:
    qqqq#13#10#091111#13#10#092222#13#10eeee#13#10#093333
      

  15.   

    是不是因为我没有在writetext中添加#13回车的缘故呀?
      

  16.   

    给s付值为TAB值因该是:s := #9;
      

  17.   

    for i:=0 to counter-1 do   //循环累加TAB值
        r_name:= #13#10#9 + r_name;    // 在r_name前添加TAB值
      

  18.   

    我解决了,请大家给指教一下,谢谢大家!我贴上我的代码
    procedure Tf_power.WriteText;
    var
      f:textfile;
      ss1:string;
    begin
      with dm_data.ClientDataSet_user do
      begin
        Active:=false;
        Active:=true;
      end;
      Assignfile(f,'c:\111.txt');
      Rewrite(f);
     // ss1:=TabNum(dm_data.ClientDataSet_user.Fields[2].AsString);//,dm_data.ClientDataSet_user.Fields[0].AsString);    
      while not dm_data.ClientDataSet_user.Eof do
      begin
        ss1:=TabNum(dm_data.ClientDataSet_user.Fields[2].asstring); //调用后的函数返回给ss1
        WriteLn(f,ss1+'('+dm_data.ClientDataSet_user.Fields[0].AsString+')'+dm_data.ClientDataSet_user.Fields[2].AsString); //在文本中添加节点编码和节点名称
        dm_data.ClientDataSet_user.Next;   //将Clientdataset的指针下移
      end;
      Closefile(f);     //关闭文本文件
      tv_user.LoadFromFile('c:\111.txt');
    end;function Tf_power.TabNum(user_name:string):string;
    var
      i:integer;
      p_name,r_name:string;
    begin
      r_name:='';
      counter:=0;
      p_name:=user_name;
       while (pos('.',p_name)<>0) do    //判断父节点中是否还含有'.'字符
       begin
          i:=pos('.',p_name);         //如果还含有'.',就将'.'的位置赋给变量i
          delete(p_name,1,i);         //然后删去'.'前的字(包括'.'字符),并赋值给p_name
          r_name:=#9+r_name;        // 在r_name前添加TAB值
        end;
      TabNum:=r_name;  //将s_name值赋给TabNum,并返回调用点
    end;
      

  19.   

    sorry,忘记了,应该去掉counter:=0 这一句,失误失误,惭愧……