2

我正在尝试将从文件中读取的一些文本嵌入到 Inno 安装程序中。理想情况下,这将发生在预处理器 (ISPP) 中,因此无法修改文本。我能够阅读文本,但无法显示任何换行符:

#define FileHandle
#define FileLine
#define ReadmeText ""

#for {FileHandle = FileOpen("README.txt"); FileHandle && !FileEof(FileHandle); FileLine = FileRead(FileHandle)} ReadmeText = ReadmeText + FileLine

#if FileHandle
   #expr FileClose(FileHandle)
#endif

我尝试在附加每一行时插入特殊字符,但似乎没有一个在预处理器中起作用(例如,'\n'、'%n'、'#13')。

我正在将文本添加到TMemo当前使用的字段中:

Memo.Text := '{#ReadmeText}';

如果我可以将文件解析为行数组,则可以使用该Memo.Lines.AddLine()函数,但我不确定是否可以在预处理器中创建一个可变大小的数组,然后在 Pascal 中使用它脚本。

4

1 回答 1

3

我认为这可以解决问题:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Code]

procedure InitializeWizard;
var
  Memo: TNewMemo;
  Form: TSetupForm;
begin
  Form := CreateCustomForm;
  try  
    Form.Position := poScreenCenter;
    Memo := TNewMemo.Create(Form);
    Memo.Parent := Form;
    Memo.Align := alClient;
    #define FileLine
    #define FileHandle
    #sub ProcessFileLine
      #emit '    Memo.Lines.Add(''' + FileLine + ''');'
    #endsub
    #for {FileHandle = FileOpen("Readme.txt"); \
      FileHandle && !FileEof(FileHandle); FileLine = FileRead(FileHandle)} \
      ProcessFileLine
    #if FileHandle
      #expr FileClose(FileHandle)
    #endif
    Form.ShowModal;
  finally
    Form.Free;
  end;
end;

#expr SaveToFile("c:\PreprocessedScript.iss")

或者通过这种方式,您可以创建和填充数组:

#define FilesSource "Readme.txt"
#define FileLine
#define FileIndex
#define FileCount
#define FileHandle
#dim FileList[65536]
#sub ProcessFileLine
  #expr FileList[FileCount] = FileLine
  #expr FileCount = ++FileCount
#endsub
#for {FileHandle = FileOpen(FilesSource); \
  FileHandle && !FileEof(FileHandle); \
  FileLine = FileRead(FileHandle)} \
  ProcessFileLine
#if FileHandle
  #expr FileClose(FileHandle)
#endif

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Code]

procedure InitializeWizard;
var
  Memo: TNewMemo;
  Form: TSetupForm;
begin
  Form := CreateCustomForm;
  try  
    Form.Position := poScreenCenter;
    Memo := TNewMemo.Create(Form);
    Memo.Parent := Form;
    Memo.Align := alClient;
    #sub AddFileItemCode
      #emit '    Memo.Lines.Add(''' + FileList[FileIndex] + ''');'
    #endsub
    #for {FileIndex = 0; FileIndex < FileCount; FileIndex++} AddFileItemCode
    Form.ShowModal;
  finally
    Form.Free;
  end;
end;

#expr SaveToFile("c:\PreprocessedScript.iss")
于 2013-09-11T14:31:22.763 回答