Kotyarko_O 1,906 #198974 Posted July 11, 2014 если необходимо перейти в другую - прошу показать , где будет беседа будет более актуальна http://www.koreanrandom.com/forum/topic/1388-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D1%8B-%D0%BD%D0%B0-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D0%BE%D0%B2-%D0%BF%D1%80%D0%BE%D1%81%D0%B8%D1%82%D1%8C-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D0%B8-%D0%BF%D0%BE/ Quote Share this post Link to post Short link Share on other sites
AtotIK 580 #198978 Posted July 11, 2014 Наведённый на размышления недавними событиями в теме и желанием решить эту проблему, накидал новую процедурку замены теста: procedure XVMConfigEdit(); var XVMConfig: TStringList; XVMConfigDir, Tmp: String; begin XVMConfigDir:=ExpandConstant('{app}\res_mods\xvm\configs\default'); XVMConfig:=TStringList.Create; try XVMConfig.LoadFromFile(XVMConfigDir + '\rating.xc'); Tmp:=XVMConfig.Text; StringChange(Tmp, '"showPlayersStatistics": false,', '"showPlayersStatistics": true,'); StringChange(Tmp, '"enableUserInfoStatistics": true,', '"enableUserInfoStatistics": false,'); StringChange(Tmp, '"enableCompanyStatistics": true,', '"enableCompanyStatistics": false,'); XVMConfig.Text:=Tmp; XVMConfig.SaveToFile(XVMConfigDir + '\rating.xc'); finally XVMConfig.Free; end; end; Спасибо StranikS_Scan за наводку и размышление по теме, сам то думал решать эту проблему по-другому. Но его вариант развития этой тоже очень хорош. Применение уже сами найдёте! 2 Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #198985 Posted July 11, 2014 Наведённый на размышления недавними событиями в теме и желанием решить эту проблему По той же причине начал искать какой-то способ редактирования json, через Inno помимо той библиотеки, которая работает только на Unicode. Нашёл данный пример) [Files] Source: "conf.xc"; DestDir: "{app}"; AfterInstall: Parametrage [Code] procedure Parametrage; var App, Tmp: String; begin App := ExpandConstant('{app}'); if not LoadStringFromfile(App + '\Conf.xc', Tmp) then MsgBox('Возникла ошибка при открытии.', mbInformation, MB_OK) else begin StringChange(Tmp, '"mirroredVehicleIcons": true,', '"mirroredVehicleIcons": false,'); if not SaveStringToFile(App + '\Conf.xc', Tmp, False) then MsgBox('Возникла ошибка при сохранении!', mbInformation, MB_OK); end; end; Quote Share this post Link to post Short link Share on other sites
AtotIK 580 #198988 Posted July 11, 2014 Kotyarko_O, тоже не плохо. Но лучше через TStringList, так можно сразу несколько значений менять. Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #199002 Posted July 11, 2014 (edited) Вы чего творите, товарищи? Ваши LoadFromFile и SaveToFile с UTF-8 же не контачат????? Edited July 11, 2014 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #199004 Posted July 11, 2014 Вы чего творите, товарищи? Ваши LoadFromFile и SaveToFile с UTF-8 же не контачат????? Контачат Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #199013 Posted July 11, 2014 Контачат Сомневаюсь. Он скорее всего xc прочитает как ANSI и в начале текста будет UTF-8 преамбула а кириллица будет прочитана кракозябрами? Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #199014 Posted July 11, 2014 Сомневаюсь. Он скорее всего xc прочитает как ANSI и в начале текста будет UTF-8 преамбула а кириллица будет прочитана кракозябрами? Проверил на minimap.xc, hotkeys.xc, rating.xc, battle.xc - без проблем после замены. В игре работает всё нормально, реплей на наличие ошибок не ругается. Quote Share this post Link to post Short link Share on other sites
ventura69 34 #199063 Posted July 11, 2014 Умеет. Без сторонних библиотек можно редактировать те же конфиги XVM... они хоть и имеют расширение XC, а внутри все тот же json. Но я тебя сразу отговорю... лучше работай с заменой файлов ибо у пользователей полно проблем с ОС... и часто необходимо сперва все dll системы восстанавливать... Лично я только в конфиге миникарты делаю подмену false на true... и то, чтобы не жалко было функцию зря писать. Спасибо огромное: подтвердили мои догадки (слаб я в Паскале), я тем же путем пришел к подмене false/true... Вот только не устраивает меня это решение (кривое и излишне сложное получается). Пытаюсь в Делфи найти решение... Вот вас бы (сильных в Делфи) объединить в единый проект... Полироид так и задвинул проект по настройке своего мода... А у меня один детский лепет получается пока... ЗЫ: Я вижу в этой теме народ стал потихоньку вылазить за рамки Inno Setup и плавно вливаться в Delphi и ObjPascal, вопросики стали появляться, dll-ки.... как там писал К.Маркс - наблюдается переход количественных изменений в качественные. :))))))))) Качество на самом деле давно зашкалило за количество... Может откроете темку на ту же тему (приношу извинения за тавтологию) по Делфи? :-) Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #199065 Posted July 11, 2014 (edited) Может откроете темку на ту же тему (приношу извинения за тавтологию) по Делфи? А зачем? Edited July 11, 2014 by Kotyarko_O Quote Share this post Link to post Short link Share on other sites
AtotIK 580 #199079 Posted July 11, 2014 StranikS_Scan, если менять латинские буквы, цифры и знаки пунктуации, то проблем нет. Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #199084 Posted July 11, 2014 (edited) StranikS_Scan, если менять латинские буквы, цифры и знаки пунктуации, то проблем нет. Я же давно в курсе что чудес не бывает. Давайте угадаю как он работает (Инно). Он понятия не имеет что там UTF-8. Он открывает файл, считывает как ANSI вместо с преамбулой и всем что там есть. В UTF-8 как и в ANSI сначала идёт латинца, пунктуация и цифры, они одинаково отображаются в любой кодировке. Если вы меняете только их, то дальше весь этот текст записывается обратно в файл и по сути ни каких проблем у нас не наблюдается. Но вот если нуно изменить блок текста с кириллицей вот тут-то косячки и будут: Косяк №1: Ищем блок текста с кириллицей записанной в ANSI, а текст в буфере закодирован в UTF-8 значит поиск не найдет совпадений, хотя текст-то один и тот же, но вот кодировочка то разная Косяк №2: Вставляем в буфер текст на кириллице, опять косяк, в буфере она в UTF-8 а мы вставляем как ANSI после записи буфера в файл и его прочтения XVM-ом, который распознает UTF-8 записанная нами киррилица будет по ошибке перекодирована в кракозябрики, ведь он будет думать что весь файл в UTF-8. Edited July 11, 2014 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
AtotIK 580 #199090 Posted July 11, 2014 StranikS_Scan, всё верно. Косяки начинаются с кириллицы и etc. Quote Share this post Link to post Short link Share on other sites
Andrew_Dark 8 #199105 Posted July 11, 2014 Отвлекитесь пожалуйста ребятки на мой детский вопросец: при добавлении фичи, которая работает через процедуру AboutSetupClick, должно в инсталляторе инфу о программе менять на заданную мной строку текста, всё успешно меняется, но при досрочном закрытии модпака или полном завершении установки инсталлятор вылетает с окном "преждевременное закрытие .... винда ищет решение этой проблемы". вот то, что я добавляю, секция код: type TWFProc = function(h:hWnd;Msg,wParam,lParam:Longint):Longint; function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam: Longint; lParam: Longint): Longint; external '[email protected] stdcall'; function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external '[email protected] stdcall'; function WrapWFProc(Callback: TWFProc; ParamCount: Integer): Longword; external 'wrapcallbackaddr@files:CallbackCtrl.dll stdcall'; var OldProc:Longint; procedure AboutSetupClick; begin //çäåñü îáðàáàòûâàåì íàæàòèå íà ïóíêò ìåíþ "Î ïðîãðàììå ..." MsgBox('Ìîäïàê îò Darksoul. Ìîè êîíòàêòû: Skype: kozyrny2', mbInformation, MB_OK); end; function WFWndProc(h:HWND;Msg,wParam,lParam:Longint):Longint; begin if (Msg=$112) and (wParam=9999) then begin Result:=0; AboutSetupClick; end else begin if Msg=$2 then SetWindowLong(WizardForm.Handle,-4,OldProc); Result:=CallWindowProc(OldProc,h,Msg,wParam,lParam); end; end; procedure InitializeWizard3; begin OldProc:=SetWindowLong(WizardForm.Handle,-4,WrapWFProc(@WFWndProc,4)); end; . Или я что-то упустил, или там нельзя кириллицей писать само сообщение. Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #199107 Posted July 11, 2014 (edited) или там нельзя кириллицей писать само сообщение. Можно. 'Попробуй так:' [code] #ifdef UNICODE #define A "W" #else #define A "A" #endif var OldProc:Longint; type TWFProc = function(h:hWnd;Msg,wParam,lParam:Longint):Longint; function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam: Longint; lParam: Longint): Longint; external '[email protected] stdcall'; function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall'; function WrapWFProc(Callback: TWFProc; ParamCount: Integer): Longword; external 'wrapcallbackaddr@files:CallbackCtrl.dll stdcall'; procedure AboutSetupClick; begin MsgBox('Ìîäïàê îò Darksoul. Ìîè êîíòàêòû: Skype: kozyrny2', mbInformation, MB_OK); end; function WFWndProc(h:HWND;Msg,wParam,lParam:Longint):Longint; begin if (Msg=$112) and (wParam=9999) then begin Result:=0; AboutSetupClick; end else begin if Msg=$2 then SetWindowLong(WizardForm.Handle,-4,OldProc); Result:=CallWindowProc(OldProc,h,Msg,wParam,lParam); end; end; procedure InitializeWizard3; begin OldProc:=SetWindowLong(WizardForm.Handle,-4,WrapWFProc(@WFWndProc,4)); end; Если не получится, попробуй ещё заменить это: function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam: Longint; lParam: Longint): Longint; external '[email protected] stdcall'; на это: function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam: Longint; lParam: Longint): Longint; external 'CallWindowProc{#A}@user32.dll stdcall'; Edited July 11, 2014 by Kotyarko_O Quote Share this post Link to post Short link Share on other sites
Andrew_Dark 8 #199110 Posted July 11, 2014 Ок, попробую утром, а пока спать:) всем бобра;) Quote Share this post Link to post Short link Share on other sites
Andrew_Dark 8 #199146 Posted July 12, 2014 первый вариант не помог, тестирую второй (компилируется пока что:) ). второй тоже не помог, просто пока убрал эту функцию. Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #199156 Posted July 12, 2014 просто пока убрал эту функцию И без неё всё норм?У меня тот же код для изменения текста в "О программе" и никаких ошибок винда не находит. Quote Share this post Link to post Short link Share on other sites
Andrew_Dark 8 #199157 Posted July 12, 2014 без неё всё норм скайп есть? я покажу может я что-то не дописал, или не туда тыкаю код?? Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #199158 Posted July 12, 2014 (edited) @Darksoul, а процедуру InitializeWizard3 в основную InitializeWizard подключил? Edited July 12, 2014 by Kotyarko_O Quote Share this post Link to post Short link Share on other sites