全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1922
推到 Plurk!
推到 Facebook!

TQuickRep 如何將某一欄資料印2行

尚未結案
nick167
中階會員


發表:86
回覆:133
積分:53
註冊:2003-02-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-04 10:47:41 IP:61.228.xxx.xxx 未訂閱
DetailBand1 -> QRDBText1 (有40 bit) 如何將QRBText1 左20印第一行,右20有資料時印第二行, 例如:1.台灣中小企業股份有限 0800-000-123 0937167072 517 6000 公司台北敦化南路辦公 (當判斷右20字元有資料印出,無擇免空行) 2.美齊企業股份有限公司 0800-888-555 0937167472 518 6800 3.高明科技有限公司 0800-123-123 0917167172 519 7500 ........ 謝謝
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-04 11:02:09 IP:211.22.xxx.xxx 未訂閱
您好: 您可以用QRMEMO或QRRICHEDIT在站上搜尋即有相關範例 或者利用QRLABEL來秀,要記得設定相關元件的高度  
    else if (Length(temp1)>117) and (Length(temp1)<235) then
    begin
      QRBand6.Height:=40;
       .......
      QRShape9.Height:=40;
      QRLabel21.Enabled:= True;
      QRLabel20.Caption:= copy(temp1,1,117);
      QRLabel21.Caption:= copy(temp1,118,Length(temp1)-117);
 
~~應無所住而生其心~~
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-04 11:07:21 IP:210.65.xxx.xxx 未訂閱
Hi:    請參考 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=41104 -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
nick167
中階會員


發表:86
回覆:133
積分:53
註冊:2003-02-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-02-05 10:42:14 IP:61.228.xxx.xxx 未訂閱
用QRMEMO,QRRICHEDIT,QRLABEL 搜尋相關範例之後提供感言    1. 依 terrychen 建議:當第20位至屬中文字會亂碼,不知有方法可解    Tmp:=ADOQuery1.FieldByName('ma_company').AsString;    if Length(Tmp) > 21 then begin       DetailBand1.Height:=40;       QRLabel11.Enabled:=True;       QRLabel10.Caption:=Copy(tmp,1,20);       QRLabel11.Caption:=Copy(tmp,21,40);       end else       begin       DetailBand1.Height:=17;       QRLabel11.Enabled:=False;       QRLabel10.Caption:=Tmp;    end;    2.自己寫Function 結果失敗    Function SubLeft(ST:String;SL:integer):String; var Z,X:Integer;     Tmp,Q:String; begin if Length(ST) < SL then    ST:=ST + StringOfChar(' ',SL-Length(St)); Z:=1; while Z <= SL do begin      if Ord(ST[Z]) > 127 then  {     或 Q:=MidStr(st,z,1);         if Ord(Q[Z]) > 127 then  } 問題:因為 Ord 或 MidStr 如是 1234...ABCD..非中文字可以沒問題      如果資料有如 <我是A一個美國人> 長度15應取15次 MidStr或Ord在取中       文資料時是一個字取,非一碼一碼取8次,delphi有解嗎?        Z:=Z+1;   Z:=Z+1; end; if Z = SL+1 then    begin    Tmp:=LeftStr(ST,SL);    AD0:=Copy(ST,1,SL);    end; if Z <> SL+1 then    begin    Tmp:=LeftStr(ST,SL-1)+' ';    AD0:=Copy(ST,1,SL-1);    end;    Result:=Tmp; end;    3.使用 QRRichText1.AutoStretch:=True; 結果截行時中文沒有亂碼的問題   只是與下一列資料空出很大的行距,不知有解否?    謝謝terrychen,Fishman    
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-02-05 11:12:17 IP:210.65.xxx.xxx 未訂閱
Hi:    你將該 QRDBText 的 AutoSize 設為 False,然後將長度拉長至至少可容納20個字元以上,並在 OnPrint 事件,加上以下程式碼試試
procedure TForm1.QRDBText4Print(sender: TObject; var Value: String);
VAR
    I : Integer;
    OriStr : Array[0..1000] OF Char;
    V_Chinese : Boolean;
    function ApartString(InStr : String ;MaxLen : Integer) : String;
    var
        P: Integer;
        S,L : String;
        OriStr : Array[0..1000] OF Char;
        OutStr : String;
    begin
        P := 0;
        L := '';
        OutStr := '';
        StrPCopy(OriStr,InStr);
        WHILE P <= Length(InStr) - 1 DO
            BEGIN
                IF ORD(OriStr[P]) > 127 THEN
                    BEGIN
                        S := Copy(OriStr,P   1,2);
                        Inc(p)
                    END
                ELSE
                    BEGIN
                        S := Copy(OriStr,P   1,1);
                    END;
                Inc(p);
                IF Length(L   S) > MaxLen Then
                    BEGIN
                        OutStr := OutStr   L   #13;
                        L := S;
                    END
                ELSE
                    BEGIN
                        L := L   S;
                    END;
            END;
        OutStr := OutStr   L;
        ApartString := OutStr;
    end;
begin
    IF Not (Sender AS TQRDBText).AutoSize THEN
        BEGIN
            StrPCopy(OriStr,Value);
            V_Chinese := False;
            FOR I := 0 TO Length(Value) - 1 DO
                BEGIN
                    IF ORD(OriStr[I]) > 127 THEN
                        BEGIN
                            V_Chinese := True;
                            Break;
                        END;
                END;
            IF V_Chinese THEN
                Value := ApartString(Value,20)
            ELSE
                Value := Value;
        END;
end;
-------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
jslucky
一般會員


發表:4
回覆:8
積分:2
註冊:2002-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-02-05 17:45:56 IP:211.72.xxx.xxx 未訂閱
基本上中文都是以2個BATE為單位計算,所以只要算出到第20碼時含多少中文碼, 偶數就不拆,奇數就多拆一碼或少拆一碼,就可以了,這是最土,最簡單的方法, 請參考...... var chk_sw : boolean; i : integer; Tmp:=ADOQuery1.FieldByName('ma_company').AsString; chk_sw := True; for i := 1 to 20 do begin if ord(TMP[i]) > 127 Then chk_sw := not chk_sw; end; if chk_sw Then begin QRLabel10.Caption := copy(TMP,1,20); QRLabel11.Caption := copy(TMP,21,20); end else begin QRLabel10.Caption := copy(TMP,1,21); QRLabel11.Caption := copy(TMP,22,19); end;
nick167
中階會員


發表:86
回覆:133
積分:53
註冊:2003-02-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-02-06 09:12:49 IP:61.228.xxx.xxx 未訂閱
謝謝 Fishman 的幫忙正如所需 如果僅單純 使用 QRRichText1.AutoStretch:=True; 與下一列資料空出很大的距離,不知有解否? 還是無解 ! 謝謝各位 發表人 - nick167 於 2004/02/06 11:03:59
系統時間:2024-11-24 14:57:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!