有一字符串内容如下:
' |&ACNO          &|&ITM  &|&NAM                            &|'
问题如下:
请问怎样分别用变量:ACNO,ITM,NAM的值来替代这个字符串中相应的部分,而且
宽度同两个&之间的宽度,不足的补空格。

解决方案 »

  1.   

    用 stringreplace,如:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      str: string;
      ACNO, ITM, NAM: string;
    begin
      str := ' |&ACNO          &|&ITM  &|&NAM                            &|';
      ACNO := 'test1';
      ITM := 'test2';
      NAM := 'test3';
      str := StringReplace(str, 'ACNO', ACNO, [rfIgnoreCase]);
      str := StringReplace(str, 'ITM', ITM, [rfIgnoreCase]);
      str := StringReplace(str, 'NAM', NAM, [rfIgnoreCase]);
      Caption := str;
    end;
      

  2.   

    Format函数不是更简单!var
      ACNO,ITM,NAM:String;
    begin
      Format(' |&%s          &|&%s  &|&%s                            &|',[ACNO,ITM,NAM]);
    end;
      

  3.   

    楼上的没明白我的意思
    ‘|&ACNO          &|&ITM  &|&NAM                            &|’在应用中是固定不变的,怎能变成‘|&%s          &|&%s  &|&%s                            &|’呢?
      

  4.   

    to FS:
    ft死,我不知道delphi里也有format,项目中用到,偶自己写了一个,第二个参数还是TStringlist,谁用都说不好用,害偶挨了不少骂的说。to 楼主:
    说明你的要求,短了补空格,长了呢?截断?
      

  5.   

    真是奇怪了,放着Format不用,非要自己写?这个楼主也是有意思,你到底知道不知道Format函数的用法啊!Format说白了就是高级替换!
      

  6.   

    这个楼主大哥啊,你去看看Format函数的说明在发表言论好不好啊!
      

  7.   

    to FrameSniper 你根本就没弄明白我的意思
    ‘|&ACNO          &|&ITM  &|&NAM                            &|’是应用中格式文件中
    的内容,而格式文件预先定好不能改变的,我的要求是根据格式文件结合变量值生成结果。
    to killaoli 长了截断
      

  8.   

    To 楼主  你让我和你说什么好啊,你到底知道不知道Format函数的用法?为什么不去帮助里看看Format函数到底如何用?我这里没有转变,只是要把这个串通过Format来进行转变,仅次而已!
      

  9.   

    to FS:
    这就是你不对了,是你没明白人家题的意思,format就是再高级替换,它也只认识替换符,就是说只认识‘|&%s          &|&%s  &|&%s                            &|’,但它不认识‘|&ACNO          &|&ITM  &|&NAM                            &|’。也许楼主的问题能按你说的解决,但如他所说就有那么一个固定的串‘|&ACNO          &|&ITM  &|&NAM                            &|’,你能用format做吗?闻道有先后,术业有专攻,何必语含讥讽,打那么多叹号...
      

  10.   

    to  FrameSniper你的理解能力有问题还穷急,看来你根本不能解决问题
      

  11.   

    To FS
      HOHO,打几个叹号就叫讥讽,你想象能力也太丰富了吧!To 楼主
      我知道你那是一个固定的字符串!但如果你想做到用变量替换字符串中对应内容最简单的方法就是使用Format函数,但如果使用Format函数你就必须改变字符串的内容,但你就不可以变通一下吗?(我前面那位都已经给了你StringReplace函数,没有必要我在说那么清楚了吧?)如下:
    const
      cSourceStr:= ' |&ACNO          &|&ITM  &|&NAM                            &|';
    var
      ACNO, ITM, NAM: String;
    begin
      cSourceStr:= StringReplace(cSourceStr,'ACNO','%s',[rfIgnoreCase]);
      //后两个同上
      Format(cSource,[ACNO,ITM,NAM]);
    end;
      

  12.   

    Shit,一着急害的偶FS自言自语了!好了,我已经说的很清楚了,两为自己考虑到底是谁不明白!
      

  13.   

    呵呵,先用stringreplace,再用format?那为什么不只用stringreplace搞定,难道不用format就不算好代码不成?我觉得FS有时间的话还不如考虑考虑人家那个宽度的怎么解决才是...
      

  14.   

    楼上这位,偶真是不明白你到底怎么理解的!你直接使用StringReplace可以解决宽度问题吗!StringReplace只负责简单的替换
    所以第一步也只能把对应字符替换成%s
    最后才能用Format来替换里面的具体位置上的%s,如果你这里要保证间隔一定,可以这样写
    (你使用StringReplace解决不了的宽度问题可以使用Format来解决)const
      cSourceStr:= ' |&ACNO          &|&ITM  &|&NAM                            &|';
    var
      ACNO, ITM, NAM: String;
      P:Integer;
    begin
      P:=Pos('ACNO',cSourceStr)
      cSourceStr:= StringReplace(cSourceStr,Copy(cSourceStr,P,7),'%-7s',[rfIgnoreCase]);
      //后两个同上,三个宽度分别假设为7、5、12,偶现在手头没有Delphi无法调试!
      //这里具体赋变量的值,但不要超过长度,否则就截取了
      Format(cSourceStr,[ACNO,ITM,NAM]);
    end;明白,KillLaoLi?
      

  15.   

    晕死,找这个帖子半天才找到!
    好了,楼上两位,偶写了个小程序测试了一下,昨晚的代码有个小错误(给常量赋值了……^0^)....下面是单元文件内容,窗体上只放一个按钮,这个楼主的问题全部可以解决(自己试一下!):unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationfunction ReplaceSubStrWithVar(aACNO,aITM,aNAM:String):String;
    var
      cSourceStr:String;
      P:Integer;
    begin
      cSourceStr:=' |&ACNO          &|&ITM  &|&NAM                            &|';
      P:=Pos('ACNO',cSourceStr);
      cSourceStr:= StringReplace(cSourceStr,Copy(cSourceStr,P,14),'%-14s',[rfIgnoreCase]);
      P:=Pos('ITM',cSourceStr);
      cSourceStr:= StringReplace(cSourceStr,Copy(cSourceStr,P,5),'%-5s',[rfIgnoreCase]);
      P:=Pos('NAM',cSourceStr);
      cSourceStr:= StringReplace(cSourceStr,Copy(cSourceStr,P,31),'%-31s',[rfIgnoreCase]);
      Result:=Format(cSourceStr,[aACNO,aITM,aNAM]);
    end;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowMessage(ReplaceSubStrWithVar('12345','12','1234'));
    end;end.
      

  16.   

    StringReplace(str, 'NAM', NAM, [rfIgnoreCase]);就可以了str值原来的字符串,'NAM'为你要替换字符串,NAM为替换的字符串,
    [rfIgnoreCase]表示忽略大小写
      

  17.   

    StringReplace替换后长度会改变的!但现在要求是长度不改变前提下的替换!
      

  18.   

    cSourceStr:=' |&ACNO          &|&ITM  &|&NAM                            &|';
    Result:=Format(cSourceStr,[aACNO,aITM,aNAM]);
    可以在上面我写的那个程序的上面这两行后用ShowMessage来显示一下长度,证明长度不改变(其实没有必要证明)好了,这种问题不用研究这么长时间了
      

  19.   

    CSDN - 专家门诊 - Delphi 基础类问题  
     回复 | 推荐 | 收藏 | 专题 | 公告 | 管理 | 保存 | 回复通知 | 关闭窗口   
     
     
    主  题:  关于字符串替代的问题,高分相送! 
    作  者:  fht (问号)  
    等  级:    
    信 誉 值:  96 
    所属论坛:  Delphi 基础类 
    问题点数:  100 
    回复次数:  20 
    发表时间:  2003-09-24 22:47:27 
       
     
       
    有一字符串内容如下:
    ' |&ACNO          &|&ITM  &|&NAM                            &|'
    问题如下:
    请问怎样分别用变量:ACNO,ITM,NAM的值来替代这个字符串中相应的部分,而且
    宽度同两个&之间的宽度,不足的补空格。  
     
     
     回复人: killlaoli(菜鸟) ( ) 信誉:111  2003-09-24 23:09:00  得分:0 
     
     
      用 stringreplace,如:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      str: string;
      ACNO, ITM, NAM: string;
    begin
      str := ' |&ACNO          &|&ITM  &|&NAM                            &|';
      ACNO := 'test1';
      ITM := 'test2';
      NAM := 'test3';
      str := StringReplace(str, 'ACNO', ACNO, [rfIgnoreCase]);
      str := StringReplace(str, 'ITM', ITM, [rfIgnoreCase]);
      str := StringReplace(str, 'NAM', NAM, [rfIgnoreCase]);
      Caption := str;
    end;
      
     
      

  20.   

    fs的代码已经测试,能满足楼主要求,
    to killlaoli(菜鸟) 
     
     
      呵呵,先用stringreplace,再用format?那为什么不只用stringreplace搞定,难道不用format就不算好代码不成?我觉得FS有时间的话还不如考虑考虑人家那个宽度的怎么解决才是...能实现功能就行了,干吗非要钻到一个角里考虑问题,干吗非要用stringreplace,就算写出来了,考虑代码的复杂性没?