如何把主档和明细档的内容加载到一个Memo中显示的美观些?
明细档的内容字符个数不一样,所以显示不对称。
大家有什么的方法?

解决方案 »

  1.   

    自适应函数也很简单,就是一个字符串在一定长度内的显示位置(前后加等长空格就可以了).然后在MEMO添加行内容时应用该函数.
      

  2.   

    晚上给你作了一个样板,很粗,你可以再细化
    数据库为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;
      

  3.   

    谢谢老冯的精彩回答。
    如果是字母加汉字组合长度有点差距.
    比如:length('abcbefghijklmn') = 14
    length('我的未来不是梦') = 14
    长度相同,但在Memo中显示的长度有差距.
    有个求字符显示的宽度的函数,比如 w 比 i 宽些,有谁提醒一下.
      

  4.   

    比如:length('abcbefghijklmn') = 14
    length('我的未来不是梦') = 14
    长度相同,但在Memo中显示的长度有差距.------------------------------------------------在汉字字体方式下是对齐应该没有问题的.
      

  5.   

    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;
    ===========================================================谢谢各位,结账!