这是我以前做过的,与你相似,可能对你有用 ,实现原理,
报表 DataSet 属性为空,使用报表的 OnNeedDate 事件,
关键是是使用了一个函数 ByteType 以下代码,你可以参考
如果改变字体大小就能容下的话,就不用换行,
procedure TForm1.Button1Click(Sender: TObject);
begin
QuickRep1.Preview;
end;
procedure TForm1.QuickRep1NeedData(Sender: TObject;
var MoreData: Boolean);
var
iLen: integer;
strField , strTemp : string;
Flag : boolean;
begin
MoreData := True;
strField := Trim(ADODataSet1.FieldByName('matName').AsString);
iLen := length(strField);
if iLen > 64 then
// 如果长度大于 64,分行显示
begin
Flag := False;
if ByteType(strField,48) = mbLeadByte then
// 如果正好在一个汉字上,向后退一位,
begin
strTemp := copy(strField,1,47);
Flag := True;
end
else
begin
strTemp := copy(strField,1,48);
Flag := False;
end;
qrlMatName.Top := -1;
qrlMatName.Font.Size := 9;
qrlMatName.Caption := strTemp ;
if Flag then
QrlTemp.Caption := Copy(strField,48,iLen-47)
else
QrlTemp.Caption := Copy(strField,49,iLen-48)
end
else
if iLen > 48 then
begin
strTemp := Copy(strField,1,iLen);
qrlMatName.Top := 10;
qrlMatName.Caption := strTemp ;
qrlMatName.Font.Size := 9;
QrlTemp.Caption := '';
end
else
begin
qrlMatName.Top := 10;
qrlMatName.Caption := strField;
qrlMatName.Font.Size := 10;
QrlTemp.Caption := '';
end;
ADODataSet1.Next;
if ADODataSet1.Eof then
MoreData := False;
end;
procedure TForm1.QuickRep1BeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
begin
ADODataSet1.First;
end;