TQuickRep 如何將某一欄資料印2行 |
尚未結案
|
nick167
中階會員 發表:86 回覆:133 積分:53 註冊:2003-02-12 發送簡訊給我 |
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 發送簡訊給我 |
您好:
您可以用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 發送簡訊給我 |
Hi: 請參考
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=41104
--------------------------------
小弟才疏學淺,若有謬誤請不吝指教
--------------------------------
------
Fishman |
nick167
中階會員 發表:86 回覆:133 積分:53 註冊:2003-02-12 發送簡訊給我 |
用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 發送簡訊給我 |
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 發送簡訊給我 |
基本上中文都是以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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |