rm_e_htm.pas

来自「report machine 2.3 功能强大」· PAS 代码 · 共 1,005 行 · 第 1/3 页

PAS
1,005
字号

{*****************************************}
{                                         }
{         Report Machine v2.0             }
{           Html export filter            }
{                                         }
{*****************************************}

unit RM_e_htm;

interface

{$I RM.INC}

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, ComCtrls, ExtCtrls, ExtDlgs, RM_Class,
  RM_e_main
{$IFDEF RXGIF}, RxGIF{$ENDIF}
{$IFDEF JPEG}, JPeg{$ENDIF};

const
  CLinkForeColor = $00FF0000; // BGR
  CLinkBackColor = $00FFFFFF; // BGR
  CLinkHoverForeColor = $00FFFFFF; // BGR
  CLinkHoverBackColor = $00FF0000; // BGR

type
 { TRMHTMExport }
  TRMHTMExport = class(TRMMainExportFilter)
  private
    FImgFileNames: TStringList;
    FRepFileNames: TStringList;

    FImageDir: string;
    FImageEncodeDir: string;
    FImageCreateDir: string;
    FAltText: string;
    FLinkTextFirst: string;
    FLinkTextNext: string;
    FLinkTextPrev: string;
    FLinkTextLast: string;
    FLinkFont: TFont;
    FLinkBackColor: TColor;
    FLinkHoverForeColor: TColor;
    FLinkHoverBackColor: TColor;
    FLinkImgSRCFirst: string;
    FLinkImgSRCNext: string;
    FLinkImgSRCPrev: string;
    FLinkImgSRCLast: string;
    FPageEndLines: Boolean;
    FSeparateFilePerPage: Boolean;
    FShowNavigator: Boolean;
    FUseTextLinks: Boolean;

    FSingleFile: Boolean;
    FOptimizeForIE: Boolean;
    FCSSClasses: TStringList;

    FBeforeSaveGraphic: TBeforeSaveGraphicEvent;
    FAfterSaveGraphic: TAfterSaveGraphicEvent;

    function GetImgFileCount: Integer;
    function GetRepFileCount: Integer;
    procedure SetLinkFont(const Value: TFont);
    function SaveBitmapAs(Bmp: TBitmap; ImgFormat: TRMEFImageFormat
{$IFDEF JPEG}; JPEGQuality: TJPEGQualityRange{$ENDIF}; const BaseName: string): string;
    function GetNativeText(const Text: string): string;
    function GetOffsetFromTop: Integer;
    procedure WriteToStream(AText: string);

    procedure WriteHeader;
    procedure WriteFooter;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure OnEndPage; override;
    procedure OnBeginDoc; override;
    property ImgFileCount: Integer read GetImgFileCount;
    property ImgFileNames: TStringList read FImgFileNames;
    property RepFileCount: Integer read GetRepFileCount;
    property RepFileNames: TStringList read FRepFileNames;
    function ShowModal: Word; override;
  published
    property ImageDir: string read FImageDir write FImageDir;
    property LinkTextFirst: string read FLinkTextFirst write FLinkTextFirst;
    property LinkTextNext: string read FLinkTextNext write FLinkTextNext;
    property LinkTextPrev: string read FLinkTextPrev write FLinkTextPrev;
    property LinkTextLast: string read FLinkTextLast write FLinkTextLast;
    property LinkBackColor: TColor read FLinkBackColor write FLinkBackColor default CLinkBackColor;
    property LinkHoverForeColor: TColor read FLinkHoverForeColor write FLinkHoverForeColor default CLinkHoverForeColor;
    property LinkHoverBackColor: TColor read FLinkHoverBackColor write FLinkHoverBackColor default CLinkHoverBackColor;
    property LinkImgSRCFirst: string read FLinkImgSRCFirst write FLinkImgSRCFirst;
    property LinkImgSRCNext: string read FLinkImgSRCNext write FLinkImgSRCNext;
    property LinkImgSRCPrev: string read FLinkImgSRCPrev write FLinkImgSRCPrev;
    property LinkImgSRCLast: string read FLinkImgSRCLast write FLinkImgSRCLast;
    property LinkFont: TFont read FLinkFont write SetLinkFont;
    property PageEndLines: Boolean read FPageEndLines write FPageEndLines default True;
    property SeparateFilePerPage: Boolean read FSeparateFilePerPage write FSeparateFilePerPage default True;
    property ShowNavigator: Boolean read FShowNavigator write FShowNavigator default True;
    property UseTextLinks: Boolean read FUseTextLinks write FUseTextLinks default True;
    property OptimizeForIE: Boolean read FOptimizeForIE write FOptimizeForIE default True;
    property SingleFile: Boolean read FSingleFile write FSingleFile default False;

    property BeforeSaveGraphic: TBeforeSaveGraphicEvent read FBeforeSaveGraphic write FBeforeSaveGraphic;
    property AfterSaveGraphic: TAfterSaveGraphicEvent read FAfterSaveGraphic write FAfterSaveGraphic;
  end;

 { TRMHTMExportForm }
  TRMHTMLExportForm = class(TForm)
    ColorDialog: TColorDialog;
    OpenPictureDialog: TOpenPictureDialog;
    FontDialog: TFontDialog;
    btnOK: TButton;
    btnCancel: TButton;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    lblImageFolder: TLabel;
    btnImages: TSpeedButton;
    chkExportFrames: TCheckBox;
    gbExportImages: TGroupBox;
    lblExportImageFormat: TLabel;
    lblJPEGQuality: TLabel;
    cbImageFormat: TComboBox;
    edJPEGQuality: TEdit;
    UpDown1: TUpDown;
    chkExportImages: TCheckBox;
    edImageDirectory: TEdit;
    TabSheet2: TTabSheet;
    chkSingleFile: TCheckBox;
    chkSepFilePerPage: TCheckBox;
    gbShowNavigator: TGroupBox;
    lblBackGroundColor: TLabel;
    lblHoverForeColor: TLabel;
    lblHoverBackColor: TLabel;
    shpBackgroundColor: TShape;
    shpHoverForeColor: TShape;
    shpHoverBackColor: TShape;
    gbUseLinks: TGroupBox;
    pcShowNavigator: TPageControl;
    tsUseTextLinks: TTabSheet;
    lblFirst: TLabel;
    lblLast: TLabel;
    lblNext: TLabel;
    lblPrevious: TLabel;
    lblLinkCaptions: TLabel;
    btnSetFont: TButton;
    edFirst: TEdit;
    edPrevious: TEdit;
    edNext: TEdit;
    edLast: TEdit;
    tsUseGraphicLinks: TTabSheet;
    lblUseGraphicLinksFirst: TLabel;
    lblUseGraphicLinksPrevious: TLabel;
    lblUseGraphicLinksNext: TLabel;
    lblUseGraphicLinksLast: TLabel;
    btnFirst: TSpeedButton;
    btnPrevious: TSpeedButton;
    btnNext: TSpeedButton;
    btnLast: TSpeedButton;
    lblImageSource: TLabel;
    edUseGraphicLinksFirst: TEdit;
    edUseGraphicLinksPrevious: TEdit;
    edUseGraphicLinksLast: TEdit;
    edUseGraphicLinksNext: TEdit;
    rbtnUseTextLinks: TRadioButton;
    rbtnUseGraphicLinks: TRadioButton;
    chkShowNavigator: TCheckBox;
    procedure btnOKClick(Sender: TObject);
    procedure btnImagesClick(Sender: TObject);
    procedure chkShowNavigatorClick(Sender: TObject);
    procedure shpHoverForeColorMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure shpHoverForeColorMouseUp(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure rbtnUseTextLinksClick(Sender: TObject);
    procedure rbtnUseGraphicLinksClick(Sender: TObject);
    procedure btnSetFontClick(Sender: TObject);
    procedure chkExportImagesClick(Sender: TObject);
    procedure cbImageFormatChange(Sender: TObject);
    procedure edJPEGQualityKeyPress(Sender: TObject; var Key: Char);
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure chkSingleFileClick(Sender: TObject);
  private
    FExportFilter: TRMExportFilter;
    MousePoint: TPoint;
    procedure Localize;
  protected
    property ExportFilter: TRMExportFilter read FExportFilter write FExportFilter;
  public
  end;

implementation

{$R *.DFM}

uses RM_CmpReg, RM_Const, RM_Utils, FileCtrl;

const
  CPageEndLineWidth = 2;
  CRLF = #13#10;

function RMForceDirs(Dir: string): Boolean;
begin
{$IFDEF Delphi5}
  Result := ForceDirectories(Dir);
{$ELSE}
  ForceDirectories(Dir);
  Result := DirectoryExists(Dir);
{$ENDIF}
end;

{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{TRMHTMExport}

constructor TRMHTMExport.Create(AOwner: TComponent);
begin
  inherited;
  RMRegisterExportFilter(Self, RMLoadStr(SHTMFile), '*.htm');

  FRepFileNames := TStringList.Create;
  FImgFileNames := TStringList.Create;

  FImageDir := '';
  FAltText := '';
  FLinkTextFirst := RMLoadStr(rmRes + 1796);
  FLinkTextPrev := RMLoadStr(rmRes + 1795);
  FLinkTextNext := RMLoadStr(rmRes + 1794);
  FLinkTextLast := RMLoadStr(rmRes + 1793);
  FLinkFont := TFont.Create;

  FLinkFont.Size := 18;
  FLinkFont.Color := CLinkForeColor;
  FLinkBackColor := CLinkBackColor;
  FLinkHoverForeColor := CLinkHoverForeColor;
  FLinkHoverBackColor := CLinkHoverBackColor;
  FLinkImgSRCFirst := '';
  FLinkImgSRCNext := '';
  FLinkImgSRCPrev := '';
  FLinkImgSRCLast := '';
  FPageEndLines := True;
  FSeparateFilePerPage := True;
  FShowNavigator := True;
  FUseTextLinks := True;
  FSingleFile := False;

  FCSSClasses :=  TStringList.Create;
  FOptimizeForIE := True;
end;

destructor TRMHTMExport.Destroy;
begin
  FRepFileNames.Free;
  FImgFileNames.Free;
  FLinkFont.Free;
  FCssClasses.Free;
  inherited Destroy;
end;

function TRMHTMExport.GetImgFileCount: Integer;
begin
  Result := FImgFileNames.Count;
end;

function TRMHTMExport.GetRepFileCount: Integer;
begin
  Result := FRepFileNames.Count;
end;

procedure TRMHTMExport.SetLinkFont(const Value: TFont);
begin
  FLinkFont.Assign(Value);
end;

procedure TRMHTMExport.OnBeginDoc;
var
  K: Integer;
  TempDir: string;
begin
  inherited;
  FImgFileNames.Clear;
  FRepFileNames.Clear;

  FRepFileNames.Add(FileName);
  if SeparateFilePerPage or (CurReport.EMFPages.Count <> 1) then
  begin
    for K := 1 to (CurReport.EMFPages.Count - 1) do
      FRepFileNames.Add(ExtractFilePath(FileName) + RMMakeFileName(FileName, 'htm', K + 1));
  end;

  FImageEncodeDir := Trim(ImageDir);
  FImageCreateDir := ExtractFilePath(FileName);
  if FImageEncodeDir <> '' then
  begin
    TempDir := GetCurrentDir;
    SetCurrentDir(FImageCreateDir);
    FImageCreateDir := RMAppendTrailingBackslash(ExpandFileName(FImageEncodeDir));
    if not DirectoryExists(FImageCreateDir) then
      RMForceDirs(FImageCreateDir);
    FImageEncodeDir := RMReplaceString(RMAppendTrailingBackslash(FImageEncodeDir), '\', '/');
    SetCurrentDir(TempDir);
  end;
end;

const
  Bold: array[Boolean] of string = ('', ' bold');
  Italic: array[Boolean] of string = ('', ' italic');

  ANSICodePageIDs: array[0..13] of record
    ISOCode: string;
    WinCode: Integer;
  end = (
    (ISOCode: 'ISO-8859-11'; WinCode: 874), {Thai}
    (ISOCode: 'Windows-932'; WinCode: 932), {Japanese}
    (ISOCode: 'gb2312-80'; WinCode: 936), {Chinese (PRC, Singapore)}
    (ISOCode: 'Windows-949'; WinCode: 949), {Korean}
    (ISOCode: 'csbig5'; WinCode: 950), {Chinese (Taiwan, Hong Kong)}
    (ISOCode: 'ISO-10646'; WinCode: 1200), {Unicode (BMP of ISO 10646)}
    (ISOCode: 'ISO-8859-2'; WinCode: 1250), {Eastern European}
    (ISOCode: 'ISO-8859-5'; WinCode: 1251), {Latin/Cyrillic}
    (ISOCode: 'ISO-8859-1'; WinCode: 1252), {Latin 1 (US, Western Europe)}
    (ISOCode: 'ISO-8859-7'; WinCode: 1253), {Greek}
    (ISOCode: 'ISO-8859-9'; WinCode: 1254), {Turkish}
    (ISOCode: 'ISO-8859-8'; WinCode: 1255), {Hebrew}
    (ISOCode: 'ISO-8859-6'; WinCode: 1256), {Latin/Arabic}
    (ISOCode: 'ISO-8859-13'; WinCode: 1257) {Baltic}
    );

procedure TRMHTMExport.WriteHeader; // html文件头
var
  S: string;

  function GetISOCharSet(WinCP: Integer): string;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?