情况如下:财务报表,要求及其严格。要求字符串长度超过(定数)自动换行
。而且在Detail带末的横线不画。对应数据对齐换行后。
例如:
  ----------------------------------------------------------
  姓名           年龄                 性别       职业
-------------------------------------------------------------
  王平          20                   男         工程师
-------------------------------------------------------------
 乌鲁木齐家而林
 不按时地方立刻
 撒反            24                  男         工程师
-------------------------------------------------------------
  路平  ......                          ......
-------------------------------------------------------------......

解决方案 »

  1.   

    用WrapText() 这个fun有一点小问题(不能换行中文),可以自己修改一下,很容易改的。
      

  2.   

    这fun是可以用的,我就是用的这个格式化可能要换行的列
    加入 #13#10
    function WrapTexts(const Line, BreakStr: string; const BreakChars: TSysCharSet;
      MaxCol: Integer): string;
    const
      QuoteChars = ['''', '"'];
    var
      Col, Pos: Integer;
      LinePos, LineLen: Integer;
      BreakLen, BreakPos: Integer;
      QuoteChar, CurChar: Char;
      ExistingBreak: Boolean;
      L: Integer;
    begin
      Col := 1;
      Pos := 1;
      LinePos := 1;
      BreakPos := 0;
      QuoteChar := ' ';
      ExistingBreak := False;
      LineLen := Length(Line);
      BreakLen := Length(BreakStr);
      Result := '';
      while Pos <= LineLen do
      begin
        CurChar := Line[Pos];
        if CurChar in LeadBytes then
        begin
          L := CharLength(Line, Pos) - 1;
          Inc(Pos, L);
          Inc(Col, L);
          if Col>=MaxCol then
            BreakPos:=Pos;
        end
        else
        begin
          if CurChar = BreakStr[1] then
          begin
            if QuoteChar = ' ' then
            begin
              ExistingBreak := CompareText(BreakStr, Copy(Line, Pos, BreakLen)) = 0;
              if ExistingBreak then
              begin
                Inc(Pos, BreakLen-1);
                BreakPos := Pos;
              end;
            end
          end
          else if CurChar in BreakChars then
          begin
            if QuoteChar = ' ' then BreakPos := Pos
          end
          else if CurChar in QuoteChars then
          begin
            if CurChar = QuoteChar then
              QuoteChar := ' '
            else if QuoteChar = ' ' then
              QuoteChar := CurChar;
          end;
        end;
        Inc(Pos);
        Inc(Col);
        if not (QuoteChar in QuoteChars) and (ExistingBreak or
          ((Col > MaxCol) and (BreakPos > LinePos))) then
        begin
          Col := Pos - BreakPos;
          Result := Result + Copy(Line, LinePos, BreakPos - LinePos + 1);
          if not (CurChar in QuoteChars) then
            while Pos <= LineLen do
            begin
              if Line[Pos] in BreakChars then
                Inc(Pos)
              else if Copy(Line, Pos, Length(sLineBreak)) = sLineBreak then
                Inc(Pos, Length(sLineBreak))
              else
                break;
            end;
          if not ExistingBreak and (Pos < LineLen) then
            Result := Result + BreakStr;
          Inc(BreakPos);
          LinePos := BreakPos;
          ExistingBreak := False;
        end;
      end;
      Result := Result + Copy(Line, LinePos, MaxInt);
    end;
      

  3.   

    那么这个WrapTexts函数应该在什么事件里面触发呢??
    我应该在QuickRep中哪里做这种判断呢?OnfirstPage??
    或者是其他的什么地方还是什么公式中??
    请高手指点,分数不是问题。
      

  4.   

    我需要换行的东西,是用的dbtext连在数据库中取数,放在detail带中的
    ,然后格子是画的假的。现在的问题是如果数据不换行的话,将会冒出格子
    ,如果换行的话,我需要怎么写这个判断条件呢?您刚才给出的是返回换行后的字符串,我该如何付给那个dbtext呢?
      

  5.   

    不用dbtext,用dbMemo就可以多行了
      

  6.   

    打印前先遍历整个DataSet将数据格式化后再付值给QuickRep呀,dbtext该怎么付就怎么付
      

  7.   

    dbMemo 的多行,不能换单詞的,如果是一个单詞会被从中截断的,而我这函数可以像WORD一样换行
      

  8.   

    还是不是很理解,我们在Detail带中用Dbtext
    把quickrep 连到Table 或者Query 中
    数据是自动显示的啊。