小弟在做个打印程序时碰到了这样一个问题,我要求的格式要对齐,但结果出现如下情况 商品名称         格价    数量
300ml五粮液    300.00   1
1000ml印度神     200.00   1
对了,我是用writeln来直接写打印机端口的,而且名称是用了copy只取12个字符,但当出现字符中含有奇数的半角字符时,就出现上述的情况,请问有什么办法可令到上面的格式能对齐???

解决方案 »

  1.   

    这个问题,你最好是自己用程序控制。 每一行都为偶数。
    就不存在你说的问题。
    length(str),取得长度。如果不是偶就用空格补。
      

  2.   

    我不想法也是这样,但好象行不通我是这样做的s1:=copy('300ml五粮液酒',0,12);那么s1得出来就是   '300ml五粮液'当再用  length(s1)时,返回的结果是 12你说怎么办???????
      

  3.   

    字段先trim(field)把空格去了。
      

  4.   

    定义为 : WideString ; 可以吗 ?
      

  5.   

    我试了各位的建议,程序修改如下,但还是对不齐var s1,s2:widestring;AssignFile(F, 'LPT1');
    Rewrite(F);
    for kkk=1 to 10 do
    begin
      s1:= copy(dmctxs.advstringgrid1.cells[2,kkk],0,16);
      s2:= copy(dmctxs.advstringgrid1.cells[3,kkk],0,8);
      writeln(f,''+s1+'  '+s2+'');
    end;
      

  6.   

    出现半个字符?用s1:=copy('300ml五粮液酒',0,13)不就没有了,当然用WideString很方便,s1:= copy('300ml五粮液酒',0,9)对不对齐和这上面的没关系,原因还用说吗?你的贴子中的内容怎么打的?第一部分字符串结束相同,中间的空格又相同,这可能对齐?找些Pascal的资料好好看看啦
    writeln(S1:20,S2:10);//不用加空格,定义下域宽即可
      

  7.   

    对于楼上的这一位仁兄,你所说的我就看不明了,对于用writeln(S1:20,S2:10);也是会出现同样的问题。我倒是对于各位一致都说用widestring很感兴趣,有哪位能具体些说说吗?我上面的代码是不是用得不对???
      

  8.   

    function GetStr(s: String): String;
    var
      i,k: Integer;
    begin
      if Length(s) <= 12 then
      begin
        Result := s;
        Exit;
      end;
      k := 0;
      for i:=1 to 12 do if s[i] >= #80 then Inc(k);
      if Odd(k) then Result := Copy(s,1,11)
      else Result := Copy(s,1,12);
    end;
      

  9.   

    var s1,s2:widestring;i:integer;AssignFile(F, 'LPT1');
    Rewrite(F);
    for kkk=1 to 10 do
    begin
      s1:= copy(dmctxs.advstringgrid1.cells[2,kkk],0,16);
      for i:=1 to 16-length(s1) do
        s1:=s1+' ';
      s2:= copy(dmctxs.advstringgrid1.cells[3,kkk],0,8);
      for i:=1 to 16-length(s2) do
        s2:=s2+' ';
      writeln(f,''+s1+'  '+s2+'');
    end;
      

  10.   

    我是这样处理的:
    你用pos()找到,你要拷贝的位置,
    然后用copy()就可以了
      

  11.   

    楼上的各位,对于你们的热心帮助,我不胜感激,但在这我说两句,xiaocha(小查) 仁兄的思路与我不谋而合,就是首先判断所取的字符串中半角字符的奇偶数,然后在确定是否在后面补空格。但我觉得这方法会不会是太笨了点呢?heaseef(烂星星)仁兄所提的
    s1:= copy(dmctxs.advstringgrid1.cells[2,kkk],0,16);
    for i:=1 to 16-length(s1) do
    也行不通的,之前我已试过,问题在哪呢?就是length(s1) 所得到的值还是16darkhorsedba(老牛)的建议,我就头痛了,因为我也不知道要拷贝的位置在哪?不知我所说的是否恰当,欢迎大家来讨论 
      

  12.   

    while lenght(str)<17(一定为奇数) do str:=str+#9 或者' ',
      

  13.   

    writeLn(Format('%-14s%8.2f%6d', [name, price, count]));
      

  14.   

    IsDBCSLeadByte(byte(str[i]))判断当前的字符是不是汉字的起始
      

  15.   

    delphi里有一个函数可以判断当前取得一人字节是全角字符的第几个字符,具体哪一个函数我记不清了。我以前用过,不知道是不是 naughtyboy(一切都是为了明天)提到的这个函数,楼主可以测一下。
    这是最好用。
      

  16.   

    SysUtils单元有一个ByteType函数,搂住看看合不合用?
      

  17.   

    问题已解决,主要是用了IsDBCSLeadByte函数来避免截取半个汉字(需要遍历字符串).