晚上给你作了一个样板,很粗,你可以再细化 数据库为ACCESS NORTHWIND, 主表: 雇员 明细表: 订单 (其中照片和备注字段不显示)TFormDBMemo = class(TForm) DBMemo: TMemo; DataSourceMaster: TDataSource; ADOTableMaster: TADOTable; DataSourceDetail: TDataSource; ADOTableDetail: TADOTable; Panel: TPanel; DBGridMaster: TDBGrid; DBGridDetail: TDBGrid; ButtonExport: TButton; procedure ButtonExportClick(Sender: TObject); private procedure ExportMaster; procedure ExportDetail; function AlignCenter(Str: string; Wid: Integer): string; public { Public declarations } end;var FormDBMemo: TFormDBMemo;implementation{$R *.dfm}{ TFormDBMemo } function Dash(Num: Integer): string; var Idx: Integer; begin Result := ''; for Idx := 1 to Num do Result := Result+'-'; end;function Space(Num: Integer): string; var Idx: Integer; begin Result := ''; for Idx := 1 to Num do Result := Result+' '; end;function TFormDBMemo.AlignCenter(Str: string; Wid: Integer): string; var iSpace: Integer; begin iSpace := (Wid - Length(Str)) div 2; if Length(Str) mod 2 = 0 then Result := '|'+Space(iSpace+1)+Str+Space(iSpace+1)+'|' else Result := '|'+Space(iSpace+1)+Str+Space(iSpace+2)+'|'; end;procedure TFormDBMemo.ExportMaster; var Row: Integer; Col: Integer; Rows: Integer; Cols: Integer; MaxWidth: Integer; sLine: string; sItem: string; begin MaxWidth := 0; Cols := DBGridMaster.Columns.Count; for Col := 0 to Pred(Cols) do begin sItem := DBGridMaster.Fields[Col].DisplayLabel; if Length(sItem) > MaxWidth then MaxWidth := Length(sItem) end; Rows := DBGridMaster.DataSource.DataSet.RecordCount; for Row := 0 to Pred(Rows) do begin for Col := 0 to Pred(Cols) do begin if DBGridMaster.DataSource.DataSet.Fields[Col].Value <> Null then if DBGridMaster.Fields[Col].DisplayLabel <> '照片' then if DBGridMaster.Fields[Col].DisplayLabel <> '备注' then begin sItem := Trim(DBGridMaster.DataSource.DataSet.FieldByName(DBGridMaster.Fields[Col].DisplayLabel).AsString); if Length(sItem) > MaxWidth then MaxWidth := Length(sItem); end; end; DBGridMaster.DataSource.DataSet.Next; end; sLine := ''; DBGridMaster.DataSource.DataSet.First; for Col := 0 to Pred(Cols) do begin sItem := Trim(DBGridMaster.Fields[Col].DisplayLabel); sLine := sLine+AlignCenter(sItem, MaxWidth); end; DBMemo.Lines.Add(Dash(length(sLine))); DBMemo.Lines.Add(sLine); Rows := DBGridMaster.DataSource.DataSet.RecordCount; for Row := 0 to Pred(Rows) do begin sLine := ''; for Col := 0 to Pred(Cols) do begin if (DBGridMaster.Fields[Col].DisplayLabel = '照片') or (DBGridMaster.Fields[Col].DisplayLabel = '备注') or (DBGridMaster.DataSource.DataSet.Fields[Col].Value = Null) then sItem := '' else sItem := Trim(DBGridMaster.DataSource.DataSet.FieldByName(DBGridMaster.Fields[Col].DisplayLabel).AsString); sLine := sLine+AlignCenter(sItem, MaxWidth); end; DBMemo.Lines.Add(Dash(length(sLine))); DBMemo.Lines.Add(sLine); DBMemo.Lines.Add(Dash(length(sLine))); ExportDetail; DBGridMaster.DataSource.DataSet.Next; end;end;procedure TFormDBMemo.ExportDetail; var Row: Integer; Col: Integer; Rows: Integer; Cols: Integer; MaxWidth: Integer; sLine: string; sItem: string; begin MaxWidth := 0; Cols := DBGridDetail.Columns.Count; for Col := 0 to Pred(Cols) do begin sItem := DBGridDetail.Fields[Col].DisplayLabel; if Length(sItem) > MaxWidth then MaxWidth := Length(sItem) end; Rows := DBGridDetail.DataSource.DataSet.RecordCount; for Row := 0 to Pred(Rows) do begin for Col := 0 to Pred(Cols) do begin if DBGridDetail.DataSource.DataSet.Fields[Col].Value <> Null then if DBGridDetail.Fields[Col].DisplayLabel <> '照片' then if DBGridDetail.Fields[Col].DisplayLabel <> '备注' then begin sItem := Trim(DBGridDetail.DataSource.DataSet.FieldByName(DBGridDetail.Fields[Col].DisplayLabel).AsString); if Length(sItem) > MaxWidth then MaxWidth := Length(sItem); end; end; DBGridDetail.DataSource.DataSet.Next; end; sLine := ''; DBGridDetail.DataSource.DataSet.First; for Col := 0 to Pred(Cols) do begin sItem := Trim(DBGridDetail.Fields[Col].DisplayLabel); sLine := sLine+AlignCenter(sItem, MaxWidth); end; DBMemo.Lines.Add(sLine); Rows := DBGridDetail.DataSource.DataSet.RecordCount; for Row := 0 to Pred(Rows) do begin sLine := ''; for Col := 0 to Pred(Cols) do begin if (DBGridDetail.Fields[Col].DisplayLabel = '照片') or (DBGridDetail.Fields[Col].DisplayLabel = '备注') or (DBGridDetail.DataSource.DataSet.Fields[Col].Value = Null) then sItem := '' else sItem := Trim(DBGridDetail.DataSource.DataSet.FieldByName(DBGridDetail.Fields[Col].DisplayLabel).AsString); sLine := sLine+AlignCenter(sItem, MaxWidth); end; DBMemo.Lines.Add(sLine); DBGridDetail.DataSource.DataSet.Next; end;end; procedure TFormDBMemo.ButtonExportClick(Sender: TObject); begin ExportMaster; end;
谢谢老冯的精彩回答。 如果是字母加汉字组合长度有点差距. 比如:length('abcbefghijklmn') = 14 length('我的未来不是梦') = 14 长度相同,但在Memo中显示的长度有差距. 有个求字符显示的宽度的函数,比如 w 比 i 宽些,有谁提醒一下.
function TFormDBMemo.AlignCenter(Str: string; Wid: Integer): string; var iSpace: Integer; begin iSpace := (Wid - Length(Str)) div 2; if Length(Str) mod 2 = 0 then Result := '|'+Space(iSpace+1)+Str+Space(iSpace+1)+'|' else Result := '|'+Space(iSpace+1)+Str+Space(iSpace+2)+'|'; end; ----------------------------------------------------------------------- 修改一下 function AlignCenter_1(Str: string; Wid: Integer): string; var iSpaceL,iSpaceR: Integer; begin iSpaceL := (Wid - Length(Str)) div 2; iSpaceR := (Wid - Length(Str)) - iSpaceL; Result := '|'+Space(iSpaceL+1)+Str+Space(iSpaceR+1); end; ===========================================================谢谢各位,结账!
数据库为ACCESS NORTHWIND,
主表: 雇员
明细表: 订单
(其中照片和备注字段不显示)TFormDBMemo = class(TForm)
DBMemo: TMemo;
DataSourceMaster: TDataSource;
ADOTableMaster: TADOTable;
DataSourceDetail: TDataSource;
ADOTableDetail: TADOTable;
Panel: TPanel;
DBGridMaster: TDBGrid;
DBGridDetail: TDBGrid;
ButtonExport: TButton;
procedure ButtonExportClick(Sender: TObject);
private
procedure ExportMaster;
procedure ExportDetail;
function AlignCenter(Str: string; Wid: Integer): string;
public
{ Public declarations }
end;var
FormDBMemo: TFormDBMemo;implementation{$R *.dfm}{ TFormDBMemo }
function Dash(Num: Integer): string;
var
Idx: Integer;
begin
Result := '';
for Idx := 1 to Num do
Result := Result+'-';
end;function Space(Num: Integer): string;
var
Idx: Integer;
begin
Result := '';
for Idx := 1 to Num do
Result := Result+' ';
end;function TFormDBMemo.AlignCenter(Str: string; Wid: Integer): string;
var
iSpace: Integer;
begin
iSpace := (Wid - Length(Str)) div 2;
if Length(Str) mod 2 = 0 then
Result := '|'+Space(iSpace+1)+Str+Space(iSpace+1)+'|'
else
Result := '|'+Space(iSpace+1)+Str+Space(iSpace+2)+'|';
end;procedure TFormDBMemo.ExportMaster;
var
Row: Integer;
Col: Integer;
Rows: Integer;
Cols: Integer;
MaxWidth: Integer;
sLine: string;
sItem: string;
begin
MaxWidth := 0;
Cols := DBGridMaster.Columns.Count;
for Col := 0 to Pred(Cols) do
begin
sItem := DBGridMaster.Fields[Col].DisplayLabel;
if Length(sItem) > MaxWidth then
MaxWidth := Length(sItem)
end; Rows := DBGridMaster.DataSource.DataSet.RecordCount;
for Row := 0 to Pred(Rows) do
begin
for Col := 0 to Pred(Cols) do
begin
if DBGridMaster.DataSource.DataSet.Fields[Col].Value <> Null then
if DBGridMaster.Fields[Col].DisplayLabel <> '照片' then
if DBGridMaster.Fields[Col].DisplayLabel <> '备注' then
begin
sItem := Trim(DBGridMaster.DataSource.DataSet.FieldByName(DBGridMaster.Fields[Col].DisplayLabel).AsString);
if Length(sItem) > MaxWidth then
MaxWidth := Length(sItem);
end;
end;
DBGridMaster.DataSource.DataSet.Next;
end; sLine := '';
DBGridMaster.DataSource.DataSet.First;
for Col := 0 to Pred(Cols) do
begin
sItem := Trim(DBGridMaster.Fields[Col].DisplayLabel);
sLine := sLine+AlignCenter(sItem, MaxWidth);
end;
DBMemo.Lines.Add(Dash(length(sLine)));
DBMemo.Lines.Add(sLine); Rows := DBGridMaster.DataSource.DataSet.RecordCount;
for Row := 0 to Pred(Rows) do
begin
sLine := '';
for Col := 0 to Pred(Cols) do
begin
if (DBGridMaster.Fields[Col].DisplayLabel = '照片') or
(DBGridMaster.Fields[Col].DisplayLabel = '备注') or
(DBGridMaster.DataSource.DataSet.Fields[Col].Value = Null) then
sItem := ''
else
sItem := Trim(DBGridMaster.DataSource.DataSet.FieldByName(DBGridMaster.Fields[Col].DisplayLabel).AsString);
sLine := sLine+AlignCenter(sItem, MaxWidth);
end;
DBMemo.Lines.Add(Dash(length(sLine)));
DBMemo.Lines.Add(sLine);
DBMemo.Lines.Add(Dash(length(sLine)));
ExportDetail;
DBGridMaster.DataSource.DataSet.Next;
end;end;procedure TFormDBMemo.ExportDetail;
var
Row: Integer;
Col: Integer;
Rows: Integer;
Cols: Integer;
MaxWidth: Integer;
sLine: string;
sItem: string;
begin
MaxWidth := 0;
Cols := DBGridDetail.Columns.Count;
for Col := 0 to Pred(Cols) do
begin
sItem := DBGridDetail.Fields[Col].DisplayLabel;
if Length(sItem) > MaxWidth then
MaxWidth := Length(sItem)
end; Rows := DBGridDetail.DataSource.DataSet.RecordCount;
for Row := 0 to Pred(Rows) do
begin
for Col := 0 to Pred(Cols) do
begin
if DBGridDetail.DataSource.DataSet.Fields[Col].Value <> Null then
if DBGridDetail.Fields[Col].DisplayLabel <> '照片' then
if DBGridDetail.Fields[Col].DisplayLabel <> '备注' then
begin
sItem := Trim(DBGridDetail.DataSource.DataSet.FieldByName(DBGridDetail.Fields[Col].DisplayLabel).AsString);
if Length(sItem) > MaxWidth then
MaxWidth := Length(sItem);
end;
end;
DBGridDetail.DataSource.DataSet.Next;
end; sLine := '';
DBGridDetail.DataSource.DataSet.First; for Col := 0 to Pred(Cols) do
begin
sItem := Trim(DBGridDetail.Fields[Col].DisplayLabel);
sLine := sLine+AlignCenter(sItem, MaxWidth);
end;
DBMemo.Lines.Add(sLine); Rows := DBGridDetail.DataSource.DataSet.RecordCount;
for Row := 0 to Pred(Rows) do
begin
sLine := '';
for Col := 0 to Pred(Cols) do
begin
if (DBGridDetail.Fields[Col].DisplayLabel = '照片') or
(DBGridDetail.Fields[Col].DisplayLabel = '备注') or
(DBGridDetail.DataSource.DataSet.Fields[Col].Value = Null) then
sItem := ''
else
sItem := Trim(DBGridDetail.DataSource.DataSet.FieldByName(DBGridDetail.Fields[Col].DisplayLabel).AsString);
sLine := sLine+AlignCenter(sItem, MaxWidth);
end;
DBMemo.Lines.Add(sLine);
DBGridDetail.DataSource.DataSet.Next;
end;end;
procedure TFormDBMemo.ButtonExportClick(Sender: TObject);
begin
ExportMaster;
end;
如果是字母加汉字组合长度有点差距.
比如:length('abcbefghijklmn') = 14
length('我的未来不是梦') = 14
长度相同,但在Memo中显示的长度有差距.
有个求字符显示的宽度的函数,比如 w 比 i 宽些,有谁提醒一下.
length('我的未来不是梦') = 14
长度相同,但在Memo中显示的长度有差距.------------------------------------------------在汉字字体方式下是对齐应该没有问题的.
var
iSpace: Integer;
begin
iSpace := (Wid - Length(Str)) div 2;
if Length(Str) mod 2 = 0 then
Result := '|'+Space(iSpace+1)+Str+Space(iSpace+1)+'|'
else
Result := '|'+Space(iSpace+1)+Str+Space(iSpace+2)+'|';
end;
-----------------------------------------------------------------------
修改一下
function AlignCenter_1(Str: string; Wid: Integer): string;
var iSpaceL,iSpaceR: Integer;
begin
iSpaceL := (Wid - Length(Str)) div 2;
iSpaceR := (Wid - Length(Str)) - iSpaceL;
Result := '|'+Space(iSpaceL+1)+Str+Space(iSpaceR+1);
end;
===========================================================谢谢各位,结账!