Kotyarko_O Posted July 11, 2014 Share 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 Link to comment Short link Share on other sites More sharing options...
AtotIK Posted July 11, 2014 Share 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 Link to comment Short link Share on other sites More sharing options...
Kotyarko_O Posted July 11, 2014 Share 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 Link to comment Short link Share on other sites More sharing options...
AtotIK Posted July 11, 2014 Share Posted July 11, 2014 Kotyarko_O, тоже не плохо. Но лучше через TStringList, так можно сразу несколько значений менять. @ Quote Link to comment Short link Share on other sites More sharing options...
StranikS_Scan Posted July 11, 2014 Share Posted July 11, 2014 (edited) Вы чего творите, товарищи? Ваши LoadFromFile и SaveToFile с UTF-8 же не контачат????? Edited July 11, 2014 by StranikS_Scan @ Quote Link to comment Short link Share on other sites More sharing options...
Kotyarko_O Posted July 11, 2014 Share Posted July 11, 2014 Вы чего творите, товарищи? Ваши LoadFromFile и SaveToFile с UTF-8 же не контачат????? Контачат @ Quote Link to comment Short link Share on other sites More sharing options...
StranikS_Scan Posted July 11, 2014 Share Posted July 11, 2014 Контачат Сомневаюсь. Он скорее всего xc прочитает как ANSI и в начале текста будет UTF-8 преамбула а кириллица будет прочитана кракозябрами? @ Quote Link to comment Short link Share on other sites More sharing options...
Kotyarko_O Posted July 11, 2014 Share Posted July 11, 2014 Сомневаюсь. Он скорее всего xc прочитает как ANSI и в начале текста будет UTF-8 преамбула а кириллица будет прочитана кракозябрами? Проверил на minimap.xc, hotkeys.xc, rating.xc, battle.xc - без проблем после замены. В игре работает всё нормально, реплей на наличие ошибок не ругается. @ Quote Link to comment Short link Share on other sites More sharing options...
ventura69 Posted July 11, 2014 Share Posted July 11, 2014 Умеет. Без сторонних библиотек можно редактировать те же конфиги XVM... они хоть и имеют расширение XC, а внутри все тот же json. Но я тебя сразу отговорю... лучше работай с заменой файлов ибо у пользователей полно проблем с ОС... и часто необходимо сперва все dll системы восстанавливать... Лично я только в конфиге миникарты делаю подмену false на true... и то, чтобы не жалко было функцию зря писать. Спасибо огромное: подтвердили мои догадки (слаб я в Паскале), я тем же путем пришел к подмене false/true... Вот только не устраивает меня это решение (кривое и излишне сложное получается). Пытаюсь в Делфи найти решение... Вот вас бы (сильных в Делфи) объединить в единый проект... Полироид так и задвинул проект по настройке своего мода... А у меня один детский лепет получается пока... ЗЫ: Я вижу в этой теме народ стал потихоньку вылазить за рамки Inno Setup и плавно вливаться в Delphi и ObjPascal, вопросики стали появляться, dll-ки.... как там писал К.Маркс - наблюдается переход количественных изменений в качественные. :))))))))) Качество на самом деле давно зашкалило за количество... Может откроете темку на ту же тему (приношу извинения за тавтологию) по Делфи? :-) @ Quote Link to comment Short link Share on other sites More sharing options...
Kotyarko_O Posted July 11, 2014 Share Posted July 11, 2014 (edited) Может откроете темку на ту же тему (приношу извинения за тавтологию) по Делфи? А зачем? Edited July 11, 2014 by Kotyarko_O @ Quote Link to comment Short link Share on other sites More sharing options...
AtotIK Posted July 11, 2014 Share Posted July 11, 2014 StranikS_Scan, если менять латинские буквы, цифры и знаки пунктуации, то проблем нет. @ Quote Link to comment Short link Share on other sites More sharing options...
StranikS_Scan Posted July 11, 2014 Share 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 Link to comment Short link Share on other sites More sharing options...
AtotIK Posted July 11, 2014 Share Posted July 11, 2014 StranikS_Scan, всё верно. Косяки начинаются с кириллицы и etc. @ Quote Link to comment Short link Share on other sites More sharing options...
Andrew_Dark Posted July 11, 2014 Share 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 Link to comment Short link Share on other sites More sharing options...
Kotyarko_O Posted July 11, 2014 Share 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 Link to comment Short link Share on other sites More sharing options...
Andrew_Dark Posted July 11, 2014 Share Posted July 11, 2014 Ок, попробую утром, а пока спать:) всем бобра;) @ Quote Link to comment Short link Share on other sites More sharing options...
Andrew_Dark Posted July 12, 2014 Share Posted July 12, 2014 первый вариант не помог, тестирую второй (компилируется пока что:) ). второй тоже не помог, просто пока убрал эту функцию. @ Quote Link to comment Short link Share on other sites More sharing options...
Kotyarko_O Posted July 12, 2014 Share Posted July 12, 2014 просто пока убрал эту функцию И без неё всё норм?У меня тот же код для изменения текста в "О программе" и никаких ошибок винда не находит. @ Quote Link to comment Short link Share on other sites More sharing options...
Andrew_Dark Posted July 12, 2014 Share Posted July 12, 2014 без неё всё норм скайп есть? я покажу может я что-то не дописал, или не туда тыкаю код?? @ Quote Link to comment Short link Share on other sites More sharing options...
Kotyarko_O Posted July 12, 2014 Share Posted July 12, 2014 (edited) @Darksoul, а процедуру InitializeWizard3 в основную InitializeWizard подключил? Edited July 12, 2014 by Kotyarko_O @ Quote Link to comment Short link Share on other sites More sharing options...
Recommended Posts
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.