⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rvofficecnv.pas

📁 richview1.7 full.source
💻 PAS
📖 第 1 页 / 共 2 页
字号:
	cbSizeVer: Byte;
	opcodeVer: Byte;
	verMajor: SmallInt;
	verMinor: SmallInt;

        cbSizeCharset: Byte;
        opcodeCharset: Byte;
        Charset:       Byte;

     end;
const AppInfo: TAppInfo =
    (
	cbStruct: sizeof(TAppInfo);

	cbSizeVer: 1+1+2+2;
	opcodeVer: $01;
	verMajor: 10;
	verMinor: 0;

        cbSizeCharset: 1+1+1;
        opcodeCharset: $03;
        Charset:       DEFAULT_CHARSET;
    );
{------------------------------------------------------------------------------}
function GetFileNameHandle(const FileName: String): HGLOBAL;
var pc: PChar;
begin
  Result := GlobalAlloc(GHND, Length(FileName)+1);
  pc := GlobalLock(Result);
  CharToOEM(PChar(FileName), pc);
  GlobalUnlock(Result);
end;
{------------------------------------------------------------------------------}
procedure TRVOfficeCnvList.ImportRTF(const FileName: String;
  Index: Integer);
var hLib : HMODULE;
    ExeName: String;
    InitConverter32:TInitConverter32;
    UninitConverter:TUninitConverter;
    ForeignToRtf32: TForeignToRtf32;
    RegisterApp: TRegisterApp;
    hFileName,hPref: HGLOBAL;
begin
   FStream.Clear;
   Converters := Self;
   SetLength(ExeName, Length(Application.ExeName));
   CharToOEM(PChar(Application.ExeName), PChar(ExeName));
   hFileName     :=  GetFileNameHandle(FileName);
   hBuffer := GlobalAlloc(GHND, 4096);
   hLib := LoadLibrary(PChar(Items[Index].Path));
   if hLib=0 then begin
     FOwner.FErrorCode := rvceCnvLoadError;
     abort;
   end;
   try
      InitConverter32 := GetProcAddress(hLib, 'InitConverter32');
      if not Assigned(InitConverter32) then begin
        FOwner.FErrorCode := rvceFuncError;
        abort;
      end;
      if InitConverter32(Application.Handle, PChar(ExeName))=0 then begin
        FOwner.FErrorCode := rvceInitError;
        abort;
      end;
      RegisterApp := GetProcAddress(hLib, 'RegisterApp');
      if Assigned(RegisterApp) then begin
        hPref := RegisterApp(0,@AppInfo);
        if hPref<>0 then
          GlobalFree(hPref);
      end;
      try
        ForeignToRtf32 := GetProcAddress(hLib, 'ForeignToRtf32');
        if not Assigned(ForeignToRtf32) then begin
          FOwner.FErrorCode := rvceFuncError;
          abort;
        end;
        FOwner.FErrorCode := ForeignToRtf32(hFileName,nil,hBuffer,0,0,ForeignToRtf32Callback);
        if FOwner.FErrorCode<>0 then
          abort;
      finally
        UninitConverter := GetProcAddress(hLib, 'UninitConverter');
        if Assigned(UninitConverter) then
          UninitConverter;
      end;
   finally
     FreeLibrary(hLib);
     GlobalFree(hBuffer);
     GlobalFree(hFileName);
   end;
end;
{------------------------------------------------------------------------------}
procedure TRVOfficeCnvList.ExportRTF(const FileName: String;
  Index: Integer);
var hLib : HMODULE;
    ExeName: String;
    InitConverter32:TInitConverter32;
    UninitConverter:TUninitConverter;
    RtfToForeign32: TRtfToForeign32;
    RegisterApp: TRegisterApp;
    hFileName, hPref: HGLOBAL;
begin
   Converters := Self;
   FStart := FStream.Position;
   FSize  := FStream.Size-FStart;
   if FSize=0 then
     exit;
   FStep := 4096;
   if FStep>FSize then
     FStep := FSize;
   if Assigned(Converters.FOnConverting) then
     Converters.FOnConverting(Self, 0);
   SetLength(ExeName, Length(Application.ExeName));
   CharToOEM(PChar(Application.ExeName), PChar(ExeName));
   hFileName     :=  GetFileNameHandle(FileName);
   hBuffer := GlobalAlloc(GHND, FStep);
   hLib := LoadLibrary(PChar(Items[Index].Path));
   if hLib=0 then begin
     FOwner.FErrorCode := rvceCnvLoadError;
     abort;
   end;
   try
      InitConverter32 := GetProcAddress(hLib, 'InitConverter32');
      if not Assigned(InitConverter32) then begin
        FOwner.FErrorCode := rvceFuncError;
        abort;
      end;
      if InitConverter32(Application.Handle, PChar(ExeName))=0 then begin
        FOwner.FErrorCode := rvceInitError;
        abort;
      end;
      RegisterApp := GetProcAddress(hLib, 'RegisterApp');
      if Assigned(RegisterApp) then begin
        hPref := RegisterApp(0,@AppInfo);
        if hPref<>0 then
          GlobalFree(hPref);
      end;
      try
        RtfToForeign32 := GetProcAddress(hLib, 'RtfToForeign32');
        if not Assigned(RtfToForeign32) then begin
          FOwner.FErrorCode := rvceFuncError;
          abort;
        end;
        FOwner.FErrorCode := RtfToForeign32(hFileName, nil, hBuffer,0,RtfToForeign32Callback);
        if FOwner.FErrorCode<>0 then
          abort;
      finally
        UninitConverter := GetProcAddress(hLib, 'UninitConverter');
        if Assigned(UninitConverter) then
          UninitConverter;
      end;
   finally
     FreeLibrary(hLib);
     GlobalFree(hBuffer);
     GlobalFree(hFileName);
   end;
end;
{============================ TRVOfficeConverter ==============================}
constructor TRVOfficeConverter.Create(AOwner: TComponent);
begin
  inherited;
  FStream := TMemoryStream.Create;
end;
{------------------------------------------------------------------------------}
destructor TRVOfficeConverter.Destroy;
begin
  FExportConverters.Free;
  FImportConverters.Free;
  FStream.Free;
  inherited;
end;
{------------------------------------------------------------------------------}
function TRVOfficeConverter.GetExportConverters: TRVOfficeCnvList;
begin
   if FExportConverters=nil then
     FExportConverters := TRVOfficeCnvList.Create('SOFTWARE\Microsoft\Shared Tools\Text Converters\Export', Self,
       ExcludeHTMLExportConverter);
   Result := FExportConverters;
end;
{------------------------------------------------------------------------------}
function TRVOfficeConverter.GetImportConverters: TRVOfficeCnvList;
begin
   if FImportConverters=nil then
     FImportConverters := TRVOfficeCnvList.Create('SOFTWARE\Microsoft\Shared Tools\Text Converters\Import', Self,
       ExcludeHTMLImportConverter);
   Result := FImportConverters;
end;
{------------------------------------------------------------------------------}
function TRVOfficeConverter.GetImportFilter: String;
begin
  Result := ImportConverters.GetFilter(ExtensionsInFilter);
end;
{------------------------------------------------------------------------------}
function TRVOfficeConverter.GetExportFilter: String;
begin
  Result := ExportConverters.GetFilter(ExtensionsInFilter);
end;
{------------------------------------------------------------------------------}
function TRVOfficeConverter.ImportRTF(const FileName: String;
  ConverterIndex: Integer): Boolean;
begin
  FErrorCode := 0;
  ImportConverters.FStream := Stream;
  FImportConverters.FOnConverting := OnConverting;
  try
    FImportConverters.ImportRTF(FileName, ConverterIndex);
    Result := True;
  except
    Result := False;
  end;
end;
{------------------------------------------------------------------------------}
function TRVOfficeConverter.ExportRTF(const FileName: String;
  ConverterIndex: Integer): Boolean;
begin
  FErrorCode := 0;
  ExportConverters.FStream := Stream;
  FExportConverters.FOnConverting := OnConverting;
  try
    FExportConverters.ExportRTF(FileName, ConverterIndex);
    Result := True;
  except
    Result := False;
  end;
end;
{------------------------------------------------------------------------------}
function TRVOfficeConverter.ExportRV(const FileName: String; rv: TCustomRichView;
  ConverterIndex: Integer): Boolean;
begin
  FErrorCode := 0;
  Stream.Clear;
  Result := rv.SaveRTFToStream(Stream,False);
  if Result then begin
    FStream.Position := 0;
    Result := ExportRTF(FileName, ConverterIndex);
  end;
  Stream.Clear;
end;
{------------------------------------------------------------------------------}
function TRVOfficeConverter.ImportRV(const FileName: String; rv: TCustomRichView;
  ConverterIndex: Integer): Boolean;
begin
  FErrorCode := 0;
  Result := ImportRTF(FileName, ConverterIndex);
  FStream.Position := 0;
  Result := rv.LoadRTFFromStream(Stream) and Result;
  Stream.Clear;
end;
{------------------------------------------------------------------------------}

end.

⌨️ 快捷键说明

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