1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

Вопрос Inno Setup. Работа с файлами

Тема в разделе "Inno Setup", создана пользователем jason, 5 сен 2016.

  1. Пользователь

    Регистрация:
    5 сен 2016
    Сообщения:
    9
    Симпатии:
    2
    Пол:
    Мужской
    Необходимо в скопированном файле File.txt найти значение "FromStr" и поменять его на "ToStr" Нагуглил следующий код, но почему-то он не работает, пробовал экспериментировать читать мануал, но похоже программист из меня не очень,. Пожалуйста помогите найти ошибку. Дистрибутив inno setup v5.5.8-unicode.exe, ос windows 7

    Код (Text):
    1. [Setup]
    2. AppName=My Program
    3. AppVerName=My Program v.1.2
    4. DefaultDirName={pf}\My Program
    5.  
    6. [Files]
    7. Source: "File.txt"; DestDir: "{app}\Files"; Flags: ignoreversion;
    8.  
    9. [Code]
    10. var
    11.   UnicodeStr: string;
    12.   ANSIStr: AnsiString;
    13. begin
    14.   LoadStringFromFile(ExpandConstant('{app}\Files\File.txt'), ANSIStr)
    15.   UnicodeStr := String(ANSIStr);
    16.   StringChangeEx(UnicodeStr, ExpandConstant('"FromStr"'), ExpandConstant('"ToStr"'), False)
    17.   SaveStringToFile('{app}\Files\File.txt', AnsiString(UnicodeStr), True);
    18. end.
     
  2. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    790
    Симпатии:
    1.147
    Пол:
    Мужской
    jason
    Кавычки нужно убрать у текста, если я правильно понял суть проблемы. Функция ищет точное значение. Она заменит значение "FromStr" на "ToStr".

    Код (Text):
    1. [Code]
    2. var
    3.   UnicodeStr: string;
    4.   ANSIStr: AnsiString;
    5. begin
    6.   LoadStringFromFile(ExpandConstant('{app}\Files\File.txt'), ANSIStr)
    7.   UnicodeStr := String(ANSIStr);
    8.   StringChangeEx(UnicodeStr, 'FromStr', 'ToStr', False)
    9.   SaveStringToFile('{app}\Files\File.txt', AnsiString(UnicodeStr), True);
    10. end.
     
  3. Пользователь

    Регистрация:
    5 сен 2016
    Сообщения:
    9
    Симпатии:
    2
    Пол:
    Мужской
    Shegorat
    Попробовал скопировать ваш код, проверял в том числе еще несколько комбинаций.
    Файл вроде обычный txt, в нем может быть проблема? http://www45.zippyshare.com/v/mRxrz1LC/file.html
    А как посмотреть значение переменной UnicodeStr в текущий момент, в AutoIt бывает msgbox, может в innosetup есть подобное? И еще интересно когда выполняется секция Code (после или во время установки основной части инсталлятора)?
     
  4. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    790
    Симпатии:
    1.147
    Пол:
    Мужской
    Так, стоп. А где собственно вызов этого кода? Вот так он будет вызван на этапе установки, после извлечения всех файлов.
    Код (Text):
    1. [Code]
    2. procedure CurStepChanged(CurStep: TSetupStep);
    3. var
    4.   UnicodeStr: string;
    5.   ANSIStr: AnsiString;
    6. begin
    7.   if (CurStep = ssPostInstall) then begin
    8.     LoadStringFromFile(ExpandConstant('{app}\Files\File.txt'), ANSIStr)
    9.     UnicodeStr := String(ANSIStr);
    10.     StringChangeEx(UnicodeStr, 'FromStr', 'ToStr', False)
    11.     SaveStringToFile('{app}\Files\File.txt', AnsiString(UnicodeStr), True);
    12.   end;
    13. end;
    В Inno определены процедуры, которые вызываются на каждом этапе установки. Почитайте справку по этому поводу.
     
    Nemko, jason и SBalykov нравится это.
  5. Пользователь

    Регистрация:
    5 сен 2016
    Сообщения:
    9
    Симпатии:
    2
    Пол:
    Мужской
    Спасибо за помощь! После нескольких попыток исталлятор обработал файл,

    Оказалось что еще в SaveStringToFile нужно указать параметр False вместо True. Иначе на выходе получается смесь из двух файлов
    И добавить ExpandConstant в пути до сохраняемого файла чтобы он обрабатывал значение переменной {app}

    Получился такой код , может быть еще кому-нибудь пригодится
    Код (Inno):
    1.  
    2. [Setup]
    3. AppName=My Program
    4. AppVerName=My Program v.1.2
    5. DefaultDirName={pf}\My Program
    6.  
    7. [Files]
    8. Source: "File.txt"; DestDir: "{app}\Files"; Flags: ignoreversion;
    9.  
    10. [Code]
    11. procedure CurStepChanged(CurStep: TSetupStep);
    12. var
    13.   UnicodeStr: string;
    14.   ANSIStr: AnsiString;
    15. begin
    16.   if (CurStep = ssPostInstall) then
    17.   begin
    18.   LoadStringFromFile(ExpandConstant('{app}\Files\File.txt'), ANSIStr)
    19.   UnicodeStr := String(ANSIStr);
    20.   StringChangeEx(UnicodeStr, 'FromStr', 'ToStr', False)
    21.   SaveStringToFile(ExpandConstant('{app}\Files\File.txt'), AnsiString(UnicodeStr), False);
    22.   end;
    23. end;
    24.  
     
    Последнее редактирование: 5 сен 2016
    YURSHAT и Nemko нравится это.
  6. Пользователь

    Регистрация:
    5 сен 2016
    Сообщения:
    9
    Симпатии:
    2
    Пол:
    Мужской
    Обнаружил еще одну проблему, у меня вместо значения 'ToStr' будет ExpandConstant('{userdocs}') с кириллическими символами, а редактируемый текстовый файл в кодировке UTF-8.
    Как можно сохранить файл в кодировке UTF-8 чтобы не было кракозябр?

    Нашел упоминание об этом здесь -
    http://stackoverflow.com/questions/14693425/does-inno-setups-expandconstant-support-utf-8
    http://www.jrsoftware.org/ishelp/index.php?topic=unicode
    http://stackoverflow.com/questions/35117362/save-ini-file-in-utf-8-rather-than-ansi-in-inno-setup
    Но не хватает знаний разобраться
     
    Последнее редактирование: 5 сен 2016
  7. Старожил

    Регистрация:
    31 мар 2015
    Сообщения:
    340
    Симпатии:
    174
    Пол:
    Мужской
    Unicode Converter
    А вообще, в UTF-8 кириллица читается нормально ...
     
  8. Пользователь

    Регистрация:
    2 мар 2013
    Сообщения:
    4
    Симпатии:
    1
    Здравствуйте. А можно ли в эту строчку внести путь установки {app}" (выделено)
    т.е мне надо DSTCOPY заменить на DSTCOPY = "{pf}\my prog (например)
    в текстовом файле ops.txt

    Код (Inno):
    1. procedure CurStepChanged(CurStep: TSetupStep);
    2. var
    3.   UnicodeStr: string;
    4.   ANSIStr: AnsiString;
    5. begin
    6.   if (CurStep = ssPostInstall) then
    7.   begin
    8.   LoadStringFromFile(ExpandConstant('{app}\Files\ops.txt'), ANSIStr)
    9.   UnicodeStr := String(ANSIStr);
    10.   StringChangeEx(UnicodeStr, 'DSTCOPY', 'DSTCOPY = "{app}"', False)
    11.   SaveStringToFile(ExpandConstant('{app}\Files\ops.txt'), AnsiString(UnicodeStr), False);
    12.   end;
    13. end;
    Спасибо заранее.
     
  9. Старожил Супер модератор

    Регистрация:
    5 мар 2016
    Сообщения:
    435
    Симпатии:
    459
    Пол:
    Мужской
    Доктор ВОВАН, можно использовать функцию WizardDirValue, передающую путь установки:

    Код (Inno):
    1. [Setup]
    2. AppName=My Application
    3. AppVersion=1.5
    4. DefaultDirName={sd}\My Application
    5.  
    6. [Files]
    7. Source: "ops.txt"; DestDir: "{app}\Files";
    8.  
    9. [Code]
    10. procedure CurStepChanged(CurStep: TSetupStep);
    11. var
    12.   UnicodeStr: String;
    13.   ANSIStr: AnsiString;
    14. begin
    15.   if (CurStep = ssPostInstall) then begin
    16.     LoadStringFromFile(ExpandConstant('{app}\Files\ops.txt'), ANSIStr);
    17.     UnicodeStr:=String(ANSIStr);
    18.     StringChangeEx(UnicodeStr, 'DSTCOPY', 'DSTCOPY = ' + WizardDirValue, False);
    19.     SaveStringToFile(ExpandConstant('{app}\Files\ops.txt'), AnsiString(UnicodeStr), False);
    20.   end;
    21. end;
     
    Доктор ВОВАН нравится это.
  10. Борода Супер модератор

    Регистрация:
    15 июн 2011
    Сообщения:
    757
    Симпатии:
    612
    Пол:
    Мужской
    Еще проще, если файл имеет структуру ini, что очен похоже, можно использовать встроенные средства работы с ini файлами
     
    Доктор ВОВАН нравится это.
  11. Пользователь

    Регистрация:
    2 мар 2013
    Сообщения:
    4
    Симпатии:
    1
    LexBell, точно не ини. простой текст файл.
    вопрос решился отлично тк. нужно было еще "" кавычки добавить. "{pf}\my prog" Может кому пригодится. Спасибо товарисчу Gnom_aka_Lexander

    StringChangeEx(UnicodeStr, 'DSTCOPY', 'DSTCOPY = "'+ExpandConstant('{app}')+'"', False

    Nemko, Здоровья и Удачи Вам. Спасибо.
     
    Nemko нравится это.

Поделиться этой страницей