Импортировать внешний файл RTF для TRichEditViewer?

Я использую TRichEditViewer на пользовательской странице в сценарии Inno Setup. Можно ли прочитать внешний файл RTF в переменную и использовать эту переменную в качестве содержимого средства просмотра? Или я должен сохранить фактический код RTF в сценарии?

Любая помощь принята с благодарностью.


person emendelson    schedule 06.10.2014    source источник
comment
Ваш дополнительный вопрос: LoadStringFromFile в скомпилированный скрипт (поэтому доступный в системе, в которой нет файла)?   -  person Martin Prikryl    schedule 01.11.2017


Ответы (2)


Вы должны иметь возможность использовать LoadStringFromFile для чтения файла RTF в строку. Из документации Inno:

Прототип:

функция LoadStringFromFile(const FileName: String; var S: AnsiString): Boolean;

Описание:

Загружает указанный двоичный файл или текстовый файл, отличный от Юникода, в указанную строку. Возвращает True в случае успеха, False в противном случае.

Вы должны иметь возможность определить переменную типа string для ANSI Inno Setup или переменную типа AnsiString для Unicode Inno Setup, используя что-то вроде:

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

Затем в коде:

LoadStringFromFile('filenamehere.rtf', rtfstr);

А затем используйте код, аналогичный приведенному ниже. В этом примере предположим, что oRichViewer является объектом TRichEditViewer:

oRichViewer.UseRichEdit := True;
oRichViewer.RTFText := rtfstr;

Это должно иметь эффект помещения rtfstr, который мы загрузили из файла ранее, в TRichEditViewer.

person Michael Petch    schedule 06.10.2014
comment
Красиво ясно, и делает именно то, что я просил. Спасибо! - person emendelson; 06.10.2014
comment
Будет ли файл filenamehere.rtf загружаться во время компиляции? - person Eugene Mala; 01.11.2017

Если вы не хотите копировать файл .rtf во временную папку перед его отображением и хотите заполнить переменную содержимым RTF во время компиляции, вы можете использовать Препроцессор Inno Setup.

Сначала создадим макрос ReadFileAsStr:

#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

И используйте его:

var
  rtfstr := {#emit ReadFileAsStr("path_to.rtf")};

Это работает для большинства файлов RTF, но некоторые символы внутри RTF могут сломать этот код. Чтобы исправить это, вам нужно экранировать ' и, возможно, некоторые другие символы внутри ProcessFileLine sub.

person Eugene Mala    schedule 01.11.2017
comment
Возможно, вам следует начать ответ с объяснения, что это действительно не так, о чем просил ОП и почему вы выбрали это решение. - person Martin Prikryl; 01.11.2017
comment
Я думаю, что мой ответ делает именно то, о чем просил ОП. И это альтернативное решение. Я добавил больше пояснений к своему ответу. - person Eugene Mala; 01.11.2017