LoadStringFromFile到已编译的脚本中(因此在没有该文件的系统上可用)?

时间:2014-10-11 14:40:57

标签: file external inno-setup

在另一个问题中,我询问了如何将一个RTF文件导入InnoSetup以用于自定义向导页面:

Import external RTF file for TRichEditViewer?

不幸的是,我只能弄清楚如何使用答案,以便在用户系统上存在该文件时加载外部文件,在这种情况下,它不存在于用户的系统中;这是我创建的用于显示安装程序的文件。

我无法弄清楚如何加载外部文件,以便将其保存在已编译的安装程序脚本中,并在其他人的系统中可见。

这是我放在一起的代码。我已经尝试创建用于加载字符串的单独过程,但是无法弄清楚如何使其工作。我将不胜感激任何帮助:

procedure CreateTheWizardPages;

var
#ifndef UNICODE
  rtfstr: string;
#else
  rtfstr: AnsiString;
#endif

var
     Page: TWizardPage;
     RichEditViewer: TRichEditViewer;
     vDosFolder: String; 
begin

  LoadStringFromFile('c:\dropbox\vdosinst\custom.rtf', rtfstr);

  if RegQueryStringValue(HKEY_CURRENT_USER, 'Software\WPDOS.org','vDosDir', vDosFolder) then 
     begin

    if ((DirExists(vDosFolder + '\62Config')) OR (DirExists(vDosFolder + '\61Config')) OR (DirExists(vDosFolder + '\51Config'))) then
      begin

    Page := CreateCustomPage(wpInfoBefore, 'How to install vDosWP-VDM with an existing vDosWP system', 'Read this message for important information!'); 

    RichEditViewer := TRichEditViewer.Create(Page);
    RichEditViewer.Width := Page.SurfaceWidth;
    RichEditViewer.Height := Page.SurfaceHeight;
    RichEditViewer.Parent := Page.Surface;
    RichEditViewer.ScrollBars := ssVertical;
    RichEditViewer.UseRichEdit := True;
    RichEditViewer.RTFText := rtfstr;
    RichEditViewer.ReadOnly := True;

    end;
  end; 
end;

procedure InitializeWizard();         // ISSI_ added to string
begin
  CreateTheWizardPages;
end;

1 个答案:

答案 0 :(得分:2)

您可以在代码块之前添加此编译时宏:

#pragma parseroption -p- 


#define FileHandle
#define FileLine
#define FileName
#define Result
#sub ProcessFileLine
  #define FileLine = FileRead(FileHandle) 
  #if Len(Result) > 0 && !FileEof(FileHandle)
    #expr Result = Result + "#10#13 +  \n"
  #endif
  #if FileLine != '\0'
    #expr Result = Result + "'" + FileLine + "'"
  #endif
#endsub
#sub ProcessFile
  #for {FileHandle = FileOpen(FileName); \
    FileHandle && !FileEof(FileHandle); ""} \
    ProcessFileLine
  #if FileHandle
    #expr FileClose(FileHandle)
  #endif   
#endsub

#define ReadFileAsStr(str AFileName) \
  Result = '', FileName = AFileName, ProcessFile, Result

此宏将文件内容输出为字符串常量。这适用于大多数RTF文件,但RTF中的某些字符可能会破坏此代码。 要解决此问题,您需要转发'",并且可能是ProcessFileLine sub中的其他一些字符。

然后你可以用这种方式在[Code]块中使用这个宏:

RichEditViewer.RTFText := {#emit ReadFileAsStr("custom.rtf")};