Jump to content
Korean Random
EvilAlex

Создание инсталляторов для модпаков на базе Inno Setup

Recommended Posts

 Есть всё Паскалевское. Но делать-то я не всё умею.. записать что-то в файл - не проблема, но когда идёт речь о записи в определённые столбцы\строки - то я пока не в курсе, как это сделать.

 

А ни как это не сделать, имею ввиду в той формулировки что выше. Надо открыть файл на чтение. Считать всё что в нем есть в текстовый буфер, затем в буфере найти нужные места и заменить/вписать, после чего открыть файл на запись и переписать его содержимым буфера. Дай файл и скажи куда чего писать, накатаю на паскале в виде примера.

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

PS: Зачем столбцы-то? Откуда вообще в текстовом файле у вас столбцы???

Вот есть... Специфика работы. Градуировочная таблица называется и пишется в .txt  У меня есть текстовый документ, в котором 101 строка и 5 столбцов. Идут столбики цифр. Условно: надо заменить цифру 0.000256, расположенную во втором столбце двадцать третьей строки на 0.000375.

Share this post


Link to post

Short link
Share on other sites

Вот есть... Специфика работы. Градуировочная таблица называется и пишется в .txt  У меня есть текстовый документ, в котором 101 строка и 5 столбцов. Идут столбики цифр. Условно: надо заменить цифру 0.000256, расположенную во втором столбце двадцать третьей строки на 0.000375.

 

Кинь пример файла, я должен видеть как записано.

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

Кинь пример файла, я должен видеть как записано.

Вот примерный вариант:

Новый текстовый документ.txt

И еще вариант интересует: есть файлик, в котором записано что-то (условно возьмем battleLoading.xc). В нем надо:

"showChances": true

переписать на 

"showChances": false

Но это уже для общего развития.

Share this post


Link to post

Short link
Share on other sites

@ventura69, лови накатал, процедура заменяет текст в файле, указывается номер строки и столбца, нумерация с нуля.

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

//Заменяет в файле FileName слово в row-строке и column-столбце на содержимое Text (нумерация с нуля)
procedure ReplaceText(FileName: string; row, column: Integer; Text: string);
var f: TextFile;
    buffer, line, new_line: string;
    row_count, column_count, tab_pos: Integer;
begin
if FileExists(FileName) then
 begin
 AssignFile(f, FileName);
 Reset(f); //Открываем на чтение
 buffer:='';
 row_count:=0;
 while not Eof(f) do //Считываем по порядку все строки в буфер
  begin
  Readln(f, line);
  if row_count = row then
   begin //Нашли искомую строку, теперь перебираем её по формату: CловоA#9CловоБ#9словоС...
   column_count:=0;
   new_line:='';
   tab_pos:=Pos(#9,line);
   while tab_pos>0 do //Несколько столбцов
    begin
    if column_count=column then
     new_line:=new_line+Text+#9 //Меняем искоме слово
    else new_line:=new_line+Copy(line, 1, tab_pos);
    line:=Copy(line, tab_pos+1, Length(line)-tab_pos);
    tab_pos:=Pos(#9,line);
    Inc(column_count);
    end;
   if Length(line)>0 then //Если один столбец или это последний столбец
    if column_count=column then
     new_line:=new_line+Text
    else new_line:=new_line+line;
   line:=new_line;
   end;
  if Length(buffer)>0 then
   buffer:=buffer+#13#10;
  buffer:=buffer+line;
  Inc(row_count);
  end;
 CloseFile(f);
 Rewrite(f); //Открываем на запись
 Write(f, buffer); //Сбрасываем буфер в файл
 CloseFile(f);
 end;
end;

begin
ReplaceText('c:\s.txt',3,2,'3.333'); //Заменить в файле 'c:\s.txt' текст в 4 строке и 3 столбце на '3.333' 
end.

 

 

И еще вариант интересует: есть файлик, в котором записано что-то (условно возьмем battleLoading.xc). В нем надо: "showChances": true переписать на  "showChances": false Но это уже для общего развития.

 

Это и проще и сложнее. Я так понимаю этот файлик в формате UTF-8 записан :))))) И боюсь проблема работы с ним начнётся с вопроса, а UTF-8 кодировку InnoSetup правильно прочитает? Или надо писать перекодировщик из UTF-8 в ANSI и наоборот. 

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

@ventura69, лови накатал, процедура заменяет текст в файле, указывается номер строки и столбца, нумерация с нуля.

Спасибо огромнейшее! Будет чем в отпуске заняться: пищу для ума дали на все три недели :-)

А на счет кодировки - это мелочи. Мне принцип  бы понять...

Edited by ventura69

Share this post


Link to post

Short link
Share on other sites

Inno Setup не умеет работать с JSON, используйте Inno JSONConfig (https://code.google.com/p/inno-json-config/). Однако работает он только в Unicode последних версий ( не работает в расширенной), да и как-то криво обрабатывает форматирование файла. Сам дурюсь с этой проблемой, нужно что-то делать с ней всё же. Если кто-нибудь сможет написать библиотеку для 5.5.1, то это будет прекрасно. Пока обхожусь поиском текста и заменой параметра после него. Для простого редактирования хватает, но при попытках реализовать что-то сложнее, увы, ничего не выйдет.

В общем если кто-нибудь откликнется - смогу и материально отблагодарить.

Edited by AtotIK

Share this post


Link to post

Short link
Share on other sites

Inno Setup не умеет работать с JSON, используйте Inno JSONConfig (https://code.google.com/p/inno-json-config/). Однако работает он только в Unicode последних версий ( не работает в расширенной), да и как-то криво обрабатывает форматирование файла. Сам дурюсь с этой проблемой, нужно что-то делать с ней всё же. Если кто-нибудь сможет написать библиотеку для 5.5.1, то это будет прекрасно. Пока обхожусь поиском текста и заменой параметра после него. Для простого редактирования хватает, но при попытках реализовать что-то сложнее, увы, ничего не выйдет.

В общем если кто-нибудь откликнется - смогу и материально отблагодарить.

 

Глянул исходник - дык там используется Super Object, это отличный JSON движок под Delphi, я его в XCPad юзал. В чем именно у тебя проблема? И для работы с ним надо опять таки самому из UTF-8 конвертировать в ANSI при чтении файла, а при записи делать обратное ANSI в UTF-8. У мну все модули для этого есть. Процесс безболезненный.

Share this post


Link to post

Short link
Share on other sites

Разобрался, как запускается музыка в скрипте из поста от Ckaym. В данном виде, как он выложен, скрипт не работает.

Нашел одну ошибку в нем: тип PChar (он не поддерживается прогой) надо заменить на тип PAnsiChar. И тогда он начинает работать.

Вот такая штука получилась в результате для запуска музыки при старте инсталлятора. Гляньте, уважаемый. Комментарии и корректировки будут? :ok:

//подключаем ресурсы и библиотеки\\

[Files]

Source: "bass.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression

Source: "innocallback.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression

Source: "Music.MP3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression

 

 //задаем процедуры, переменные и константы\\typeHSTREAM=DWORD;TTimerProc=procedure(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);constIndent=25;varMP3List:TStringList;CurrentMP3:integer;hMP3:HWND;TimerID:LongWord;//создаем функции\\function SetTimer(hWnd:HWND;nIDEvent,uElapse:UINT;lpTimerFunc:LongWord{TFNTimerProc}):UINT; external '[email protected] stdcall delayload';function BASS_ChannelIsActive(Handle:HWND):DWORD; external 'BASS_ChannelIsActive@files:bass.dll stdcall';function BASS_SetConfig(Option,Value:DWORD):DWORD; external 'BASS_SetConfig@files:bass.dll stdcall';function BASS_Init(Device:integer;Freq,Flags:DWORD;Win:HWND;CLSID:integer):boolean; external 'BASS_Init@files:bass.dll stdcall delayload';function BASS_StreamCreateFile(Mem:BOOL;f:PAnsiChar;Offset:DWORD;Length:DWORD;Flags:DWORD):HSTREAM; external 'BASS_StreamCreateFile@files:bass.dll stdcall';function BASS_StreamFree(Handle:HWND):boolean; external 'BASS_StreamFree@files:bass.dll stdcall';function BASS_ChannelPlay(Handle:HWND;Restart:boolean):boolean; external 'BASS_ChannelPlay@files:bass.dll stdcall';function BASS_Start: Boolean; external 'BASS_Start@files:bass.dll stdcall';function BASS_Stop: Boolean; external 'BASS_Stop@files:bass.dll stdcall';

function BASS_Free: Boolean; external 'BASS_Free@files:bass.dll stdcall delayload';

function WrapTimerProc(CallBack:TTimerProc;ParamCount:integer):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';

 

//ну, и сам код запуска музыки\\

procedure TimerTick(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);

begin

if BASS_ChannelIsActive(hMP3)=0 then begin

BASS_Stop;

BASS_StreamFree(hMP3);

hMP3:=BASS_StreamCreateFile(False,PAnsiChar(MP3List.Strings[CurrentMP3]),0,0,0);

BASS_Start;

if hMP3<>0 then

if BASS_ChannelPlay(hMP3,True) then begin

CurrentMP3:=CurrentMP3+1;

if CurrentMP3>MP3List.Count-1 then CurrentMP3:=0;

end;

end;

end;

function InitializeSetup:boolean;

begin

ExtractTemporaryFile('Music.MP3');

MP3List:=TStringList.Create;

MP3List.Add(ExpandConstant('{tmp}')+'\Music.MP3');

CurrentMP3:=0;

Result:=True;

end;

procedure InitializeWizard;

begin

TimerID:=SetTimer(0,0,500,WrapTimerProc(@TimerTick,5));

BASS_Init(-1,44100,0,0,0);

BASS_SetConfig(5,100);

BASS_SetConfig(6,100);

end;

procedure DeinitializeSetup;

begin

BASS_Stop;

BASS_Free;

MP3List.Free;

end;

Это решение не проще?

music.rar

 

Link2

Edited by mpmp

Share this post


Link to post

Short link
Share on other sites

Это решение не проще?

 Не удобно. Лучше, если он будет в интерфейсе самого инсталлятора, чем отдельно.

Share this post


Link to post

Short link
Share on other sites

Это решение не проще?

attachicon.gifmusic.rar

 

Link2

Может и проще. Музыку вообще в одну строчку можно добавить (играет и играет себе фоном, без всяких кнопок вкл/выкл), но тогда я вообще мало что смыслил в Inno. Это все пробы и изучение программы. Я ведь только учусь :-)

А за код спасибо. Можно и пригодится куда-нибудь.

Share this post


Link to post

Short link
Share on other sites

Может и проще. Музыку вообще в одну строчку можно добавить (играет и играет себе фоном, без всяких кнопок вкл/выкл), но тогда я вообще мало что смыслил в Inno. Это все пробы и изучение программы. Я ведь только учусь :-)

А за код спасибо. Можно и пригодится куда-нибудь.

Я тоже учусь.

 

Уважаемые, вот что получилась с вашей помощью.

Надеюсь поможет вам в создании своей сборки.

Мой проект: LINK - DOWNLOAD

Есть фотографии модов, есть музыка.

Спасибо за помощью EvilAlex и Atotik.

Не удалось сделать описания модов и музыку кнопок вкл/выкл.

 

0dc1fe4958f6.png

73fe717ddf28.png

6be339798e72.png

Share this post


Link to post

Short link
Share on other sites

Спасибо за инсталлятор, давно хотел свой модпак создать, теперь смогу его оформить как надо)

Share this post


Link to post

Short link
Share on other sites

Вангую кучу однотипных модПаков, в скором времени)

Спасибо за инсталлятор, давно хотел свой модпак создать, теперь смогу его оформить как надо)

:heh: :heh: :heh:

Share this post


Link to post

Short link
Share on other sites

Inno Setup не умеет работать с JSON

:no:

Умеет.

Без сторонних библиотек можно редактировать те же конфиги XVM... они хоть и имеют расширение XC, а внутри все тот же json.

Но я тебя сразу отговорю... лучше работай с заменой файлов ибо у пользователей полно проблем с ОС... и часто необходимо сперва все dll системы восстанавливать...

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

Share this post


Link to post

Short link
Share on other sites

:no:

Умеет.

Без сторонних библиотек можно редактировать те же конфиги XVM... они хоть и имеют расширение XC, а внутри все тот же json.

Но я тебя сразу отговорю... лучше работай с заменой файлов ибо у пользователей полно проблем с ОС... и часто необходимо сперва все dll системы восстанавливать...

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

Юша привет , у меня есть вопрос по мод паку , в твоем изначальном конфиге урон по противнику у меня ( игрока ) желтый , а со взводного зеленый . Я неоднократно пытался изменить урон игрока на #00EAFF ( голубой ) но после сохранения-замены файла он не меняется , почему так ? Конфигуратор не работает ? Или у тебя там какой то блок на изменения ? вот скрин http://SSMaker.ru/c0ade95a/ .

Share this post


Link to post

Short link
Share on other sites

:no:

Умеет.

Без сторонних библиотек можно редактировать те же конфиги XVM... они хоть и имеют расширение XC, а внутри все тот же json.

Но я тебя сразу отговорю... лучше работай с заменой файлов ибо у пользователей полно проблем с ОС... и часто необходимо сперва все dll системы восстанавливать...

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

 

Проблему редактирования конфигов легко решил за 15 минут - накатал dll-ку с функциями поиска и замены текста в файлах UTF-8 формата. 

ЗЫ: Я вижу в этой теме народ стал потихоньку вылазить за рамки Inno Setup и плавно вливаться в Delphi и ObjPascal, вопросики стали появляться, dll-ки.... как там писал К.Маркс - наблюдается переход количественных изменений в качественные. :)))))))))

Share this post


Link to post

Short link
Share on other sites

Проблему редактирования конфигов легко решил за 15 минут - накатал dll-ку с функциями поиска и замены текста в файлах UTF-8 формата. 

ЗЫ: Я вижу в этой теме народ стал потихоньку вылазить за рамки Inno Setup и плавно вливаться в Delphi и ObjPascal, вопросики стали появляться, dll-ки.... как там писал К.Маркс - наблюдается переход количественных изменений в качественные. :)))))))))

я уже понял что онлайн конфигуратор не пашет :( , но в редакторе xctuner не увидел , где менять цвет по источнику урона , также в файле COLORS в конфиге при открытии через блокнот , тоже не нашел , где заменить цвет , сможете подсказать ? Кстати прошу прощения , что влез в эту тему со своими какулями , если необходимо перейти в другую - прошу показать , где будет беседа будет более актуальна , или если необходимо могу создать новую тему , спасибо за помощь и понимание. 

Share this post


Link to post

Short link
Share on other sites

:no:

Умеет.

Без сторонних библиотек можно редактировать те же конфиги XVM... они хоть и имеют расширение XC, а внутри все тот же json.

Но я тебя сразу отговорю... лучше работай с заменой файлов ибо у пользователей полно проблем с ОС... и часто необходимо сперва все dll системы восстанавливать...

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

Конечно может через "поиск-замену", это всё понятно, это всё используется. Но хочется большего, вот и всё, т.к. этим способом особо не разгонишься.

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...