PDA

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 5]


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 [49] 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

Johny777
20-09-2012, 01:19
спорить не буду, взял пример от сюда: »
+fps_max60-console »
пардон
мой косяк
пробелы быть должны
между параметрами ком строки и значениями. Везде!
в противном случае они будут являться тарабарщиной которую двиг игры не сможет прочитать при этом жутко ругаясь
поэтому сделал вот такую вот функцию (вроде работает но как-то медленно) но почему-то в параметр - hideconsole записывается как -h ideconsole
вот код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application


[ code]
var
Param_Edit: TEdit;

function DelSp(const st: String): String; /// укоротить до одинарных пробелов
begin
while pos(' ',st)>0 do delete(st,pos(' ',st),1);
Result := st;
end;

function InsertSp(AllText:String):String; //// добавить пробелы
var
pos_simbol: Integer;
Param: String;
i: Integer;
begin
i := 1;

repeat
begin
case i of
1: Param := '-console';
2: Param := '-hideconsole';
3: Param := '-safe';
4: Param := '-dev';
5: Param := '-condebug';
6: Param := '-autoconfig';
7: Param := '-dxlevel';
8: Param := '-32bit';
9: Param := '-fullscreen';
10: Param := '-windowed';
11: Param := '-w';
12: Param := '-h';
13: Param := '-x';
14: Param := '-y';
15: Param := '-nocrashdialog';
16: Param := '-novid';
17: Param := '-noborder';
18: Param := '-nojoy';
19: Param := '-noforcemspd';
20: Param := '-noforcemparms';
21: Param := '-noforcemaccel';
22: Param := '-refresh';
23: Param := '-d3d';
24: Param := '-gl';
25: Param := '-wavonly';
26: Param := '+cl_showfps';
27: Param := '+map';
28: Param := '+map_background';
29: Param := '+sv_cheats';
30: Param := '+exec';
31: Param := '+fps_max';
32: Param := '+skill';
33: Param := '+playdemo';
34: Param := '+mat_dxlevel';
end;

if pos(Param,AllText) > 0 then
begin
pos_simbol := Pos(Param, AllText);
Insert(' ',AllText, pos_simbol);
Insert(' ',AllText, pos_simbol+Length(Param)+1);
end;

i := i + 1;
end;
until i = 35;

Result := Trim(DelSp(AllText));
end;


function DeleteAllSp(const st: String): String; /// убрать все пробелы
begin
while pos(' ',st)>0 do delete(st,pos(' ',st),1);
Result := st;
end;


procedure Buttons_OnClick(Sender:TObject);
begin
case TButton(Sender).Caption of
'Insert': Param_Edit.Text := InsertSp(Param_Edit.Text);
'Delete': Param_Edit.Text := DeleteAllSp(Param_Edit.Text);
end;
end;


procedure InitializeWizard();
begin
WizardForm.OuterNotebook.Hide;
WizardForm.Width := 900;
WizardForm.Position := poScreenCenter;

Param_Edit := TNewEdit.Create(nil);
with Param_Edit do
begin
Parent := WizardForm;
SetBounds(ScaleX(40), ScaleY(100), ScaleX(700), ScaleY(21));
Text := InsertSp('+fps_max80-dxlevel80-hideconsole-32bit-gl-novid+cl_showfps1-dev1+sv_cheats1+playdemoTheBestDemo-condebug+skill2');
end;

with TButton.Create(nil) do
begin
Parent := WizardForm;
SetBounds(Param_Edit.Left + Param_Edit.Width + ScaleX(5), Param_Edit.Top, ScaleX(65), Param_Edit.Height);
Caption := 'Insert';
Cursor := crHand;
OnClick := @Buttons_OnClick;
end;

with TButton.Create(nil) do
begin
Parent := WizardForm;
SetBounds(Param_Edit.Left + Param_Edit.Width + ScaleX(5) + ScaleX(70), Param_Edit.Top, ScaleX(65), Param_Edit.Height);
Caption := 'Delete';
Cursor := crHand;
OnClick := @Buttons_OnClick;
end;
end;


кажись проблема в том что есть параметр -h
и есть параметр -hideconsole который в начале тоже имеет -h
подскажите пожалуйста как это поправить и можно ли как-то ускорить работу функции InserSp?

также порывшись на форумах по дельфи улучшил функцию проверки строки на целое число

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[ code]
function IsInt(const Value: string): Boolean;
begin
Result := StrToIntDef(Value,0) <> 0;
end;

procedure InitializeWizard();
begin
if IsInt('10') then MsgBox('yes', mbInformation, MB_OK);
if not IsInt('hfhfrh') then MsgBox('no', mbInformation, MB_OK);
end;


и кому надо функция получения разрешения монитора (верт., гор.) и частоты обновления (мне нужна для +fps_max и для -refresh и других параметров)

AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application


[ code]
function GetDC(HWND: DWord): DWord; external 'GetDC@user32.dll stdcall';
function GetDeviceCaps(DC: DWord; Index: Integer): Integer; external 'GetDeviceCaps@gdi32.dll stdcall';
function ReleaseDC(HWND: DWord;DC: DWord): Integer; external 'ReleaseDC@user32.dll stdcall';


function GetMonitorInfo(MetricType:Byte;Descriptor:THandle): Word;
var
dc: DWord;
begin
Result := 0;

case MetricType of
1: /// разрешение по ширине
begin
dc := GetDC(Descriptor);
Result := GetDeviceCaps(dc,8);
end;

2: /// разрешение по высоте
begin
dc := GetDC(Descriptor);
Result := GetDeviceCaps(dc,10);
end;

3: /// частота обновления экрана
begin
dc := GetDC(Descriptor);
Result := GetDeviceCaps(dc,116);
end;
end;
ReleaseDC(Descriptor,dc);
end;


procedure InitializeWizard();
begin
MsgBox(
'разрешение по горизонтали - ' + IntToStr(GetMonitorInfo(1,MainForm.Handle)) + #13#10 +
'разрешение по вертикали - ' + IntToStr(GetMonitorInfo(2,MainForm.Handle)) + #13#10 +
'частота обновления - ' + IntToStr(GetMonitorInfo(3,MainForm.Handle)),
mbConfirmation, MB_OK);
end;


Извиняюсь, поторопился... исправил предыдущее сообщение. »
держи еще вариант: »
Спасибо добрые люди! :)
предстоит много работы но теперь у меня есть всё для того чтоб завершить код

El Sanchez
20-09-2012, 11:33
но почему-то в параметр - hideconsole записывается как -h ideconsole »
Johny777, в своем сообщении поправил.

можно ли как-то ускорить работу функции InserSp? »
Johny777, защиту от дурака делаешь? Все случаи неправильного написания не предусмотришь. У тебя в Param_Edit комстроку будут продвинутые пользователи заполнять, а они уж знают где пробелы расставлять, так что не вижу смысла в DelSp, InsertSp, DeleteAllSp. Сделай проще:
1). CheckListBox со всеми параметрами.
2). Если у параметров предусмотрены значения, напротив соответствующий Edit. При создании чекбокса последним параметром AObject функции AddCheckBox укажи этот Edit. Позже, когда будешь считывать состояния чекбоксов (читай - параметров для результирующей комстроки), наличие объекта будет говорить о том, что у параметра есть значение, которое нужно тоже считать.

также порывшись на форумах по дельфи улучшил функцию проверки строки на целое число »
Johny777, в самый раз.

подскажите пожалуйста что это за ошибка »
wertulll, в самом начале дублирование #ifdef records, а закрытие только один раз.

Respin
21-09-2012, 02:11
Здравствуйте. Использую этот (http://forum.oszone.net/post-1930003-232.html) пример, чтобы докачать необходимые файлы из интернет. Всё работает нормально, но есть одно но. Если во время скачивания файла пропадает соединение с интернет, то выскакивает куча ошибок. Установщик начинает сильно ругаться на функцию DownloadProgress, так как связь оборвалась, а он продолжает пытаться считывать информацию. Подскажите как это исправить, а то после этого установщик возможно закрыть только принудительно.

El Sanchez
21-09-2012, 10:22
Если во время скачивания файла пропадает соединение с интернет, то выскакивает куча ошибок. Установщик начинает сильно ругаться на функцию DownloadProgress »
Respin, в процедуре DownloadFile найдите такие строки:

finally
FStream.Free;
ProgressPage.Hide;
end;

и допишите:

finally
Timer.Enabled := False;
FStream.Free;
ProgressPage.Hide;
end;

P.S. В будущем попробую реализовать асинхронную закачку в несколько потоков.

wertulll
21-09-2012, 16:22
подскажите пожалуйста как исправить этот баг на окнах

Respin
21-09-2012, 16:51
подскажите пожалуйста как исправить этот баг на окнах »
Это не баг, а стиль такой. Codejock Skin Builder тебе в помощь.

wertulll
21-09-2012, 19:23
никак
виста и 7-ка так вырисовывают месседж боксы
меняй на формы »

подбрось пример пожалуйста если не трудно. А вобще можно скин убрать с этого окна ???


чтобы было так

Respin
22-09-2012, 04:37
El Sanchez, Благодарю вас, на этом этапе ошибки больше нет.
Прикрутил к скрепту Cancel Button, а то получается как-то... хочешь не хочешь - качай!
На кустомной кнопки отмены прописываю: FStream.Free; WizardForm.Close;
Если во всей установки: Confirm:= False; то всё просто замечательно! Но если: Confirm:= True; ругается на эту строчку: FStream.WriteBuffer(fBuf, lpdwNumberOfBytesRead); Возможно ли как-то откатить установку без ошибок, но с живым Confirm?

SatHan
23-09-2012, 02:46
привет всем.
есть у меня ключ
[Registry]
;Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application_is1; ValueType: string; ValueName: QuietUninstallString; ValueData: """C:\Program Files\Application\unins000.exe"" /SILENT"; Flags: uninsdeletevalue uninsdeletekeyifempty
и есть у меня кнопачка
[#Code]
var
NewButton1: TNewButton;
procedure NewButton1Click(Sender: TObject); forward;
procedure NewButton1Click(Sender: TObject);
begin

end;

procedure InitializeWizard();
begin
NewButton1 := TNewButton.Create(WizardForm);
with NewButton1 do
begin
Name := 'NewButton1';
Parent := WizardForm;
Left := ScaleX(32);
Top := ScaleY(327);
Width := ScaleX(75);
Height := ScaleY(25);
OnClick := @NewButton1Click;
end;

ответьте пожалуйста на вопрос. как мне сделать чтоб я на кнопочку нажал и ключ добавился?

AlexLAN
23-09-2012, 10:53
Доброго времени суток.
Недавно загорелся идеей создать репак игры, все шло хорошо до того момента когда понадобилось в ini файле игры прописать путь до нее самой, но при этом чтобы не была указана буква диска.

Нужно чтобы значение ключа принимало примерно такой вид:
IDPath=\Game\Нэнси Дрю. Секреты могут убивать

Пробовал писать функцию с командой delete, но так как познания паскаля давно забыты, ничего не вышло. Писал примерно следующее:

[INI]
Filename: "{app}\Game.ini"; Section: "Nancy Data"; Key: "IDPath"; String: {code:CutString|{app}};

Function CutString(CutStr: string): String;

Begin
delete (CutStr,1,2);
end;

Прошу людей с прямыми руками (не такими как у меня :wink:) помочь довести до ума.

Mailchik
23-09-2012, 12:21
AlexLAN, попробуйте:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[INI]
Filename: "{app}\Game.ini"; Section: "Nancy Data"; Key: "IDPath"; String: {code:Test};

[Code]
function Test(s : string):string;
begin
Result := copy(ExpandConstant('{app}'), 3, 100);
end;

El Sanchez
23-09-2012, 12:35
На кустомной кнопки отмены прописываю: FStream.Free; WizardForm.Close;
Если во всей установки: Confirm:= False; то всё просто замечательно! Но если: Confirm:= True; ругается на эту строчку: FStream.WriteBuffer(fBuf, lpdwNumberOfBytesRead); Возможно ли как-то откатить установку без ошибок, но с живым Confirm? »
Respin, имхо, форму не нужно закрывать. В процедуре DownloadFile находите строчки и дописываете (допустим, что кастомная кнопка это CancelButton):

while (InternetQueryDataAvailable(hFile, lpdwNumberOfBytesAvailable, 0, 0) and (lpdwNumberOfBytesAvailable > 0)) do
begin
if CancelButton.Cancel then Exit;
SetArrayLength(lpBuffer, RoundDword(lpdwNumberOfBytesAvailable));

...

finally
Timer.Enabled := False;
FStream.Free;
ProgressPage.Hide;
CancelButton.Cancel := False;
end;

Обработчик OnClick кнопки:

procedure CancelButtonOnClick(Sender: TObject);
begin
TButton(Sender).Cancel := True;
end;


ответьте пожалуйста на вопрос. как мне сделать чтоб я на кнопочку нажал и ключ добавился? »
SatHan,

procedure NewButton1Click(Sender: TObject);
begin
RegWriteStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application_is1', 'QuietUninstallString', ExpandConstant('"{uninstallexe}" /SILENT'));
end;


Прошу людей с прямыми руками (не такими как у меня ) помочь довести до ума »
AlexLAN, функция должна возвращать результат, поэтому добавьте:

function CutString(CutStr: String): String;
begin
Delete(CutStr, 1, 2);
Result := CutStr;
end;

AlexLAN
23-09-2012, 12:50
El Sanchez
Спасибо, строка создалась верно.

Mailchik
Ваш способ не пробовал, но думаю что он тоже будет рабочим.

Спасибо за уделенное время =)

SatHan
23-09-2012, 23:19
El Sanchez, Спасибо. то что нужно.

подскажите пожалуйста.
как заставить
[Run]
Filename: app.exe
чтоб запускалась только при нажатии горячей клавиши CTRL+ F2?

Johny777
24-09-2012, 03:17
Можно мне пожалуйста пример заполнение массива записей именами файлов найденными по маске с последующим поиском имён но уже из массива (не статичный массив, тк файлов неизвестно сколько)
если по маске ничего не найдено то не заполнять массив (вообще никаких действий)

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

улучшил функцию проверки строки на целое число »
Важно!
должен заметить что криво работает с нулём :(
откатился к этой:

function IsInt(const sTestStr: string): Boolean;
var
i: Integer;
begin
Result := False;
if Length(sTestStr) > 0 then
for i := 0 to 9 do
begin
Result := Pos(IntToStr(i), sTestStr) > 0;
if Result then
Break;
end;
end;

===============================================================================

подбрось пример пожалуйста если не трудно. »
http://forum.oszone.net/post-1968497-631.html

А вобще можно скин убрать с этого окна ??? »
если устроит такой вариант:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

[Files]
Source: steam.cjstyles; DestDir: {tmp}; Flags: dontcopy
Source: ISSkin.dll; DestDir: {tmp}; Flags: dontcopy

[ Code]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
external 'LoadSkin@files:isskin.dll stdcall';

procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall';

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('steam.cjstyles');
LoadSkin(ExpandConstant('{tmp}\steam.cjstyles'), '');
Result := True;
end;

procedure DeinitializeSetup();
begin
UnloadSkin();
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm := False;
WizardForm.Hide;
Sleep(200);
UnloadSkin();
if ExitSetupMsgBox = False then
begin
Cancel := False;
LoadSkin(ExpandConstant('{tmp}\steam.cjstyles'), '');
WizardForm.Show;
end else Cancel := True;
end;


=============================================================

SatHan,
Чтоб мне не спороть чушь: вроде для этого используются хуки. Могут быть слышны маты антивиря
поставь инно ультру и в \Inno Setup 5\Scripts\WindowsHook есть пример

Ivan_009
25-09-2012, 15:59
Как сделать чтобы при нажатии на кнопку появлялась форма png...Заранее спасибо...

Johny777
25-09-2012, 16:52
форма png »
мои скудные знания и логика говорят что это словосочетание не возможно

чтобы при нажатии на кнопку появлялась ... png »


#define ShowPic "Pic.png"

[Setup]
AppName=Reg_Path_Demo
AppVerName=Reg_Path_Demo
DefaultDirName={pf}\Reg_Path_Demo

[Files]
Source: isgsg.dll; Flags: ignoreversion dontcopy nocompression solidbreak sortfilesbyextension
Source: Pic.png; Flags: ignoreversion dontcopy nocompression solidbreak sortfilesbyextension

[ code]
procedure ShowSplashScreen(p1:HWND;p2:string;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';

procedure Show(Sender: TObject);
begin
if not FileExists(ExpandConstant('{tmp}\{#ShowPic}')) then ExtractTemporaryFile('{#ShowPic}');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\{#ShowPic}',300,3000,300,0,255,False,$F FFFFF,10);
end;


procedure InitializeWizard();
begin
with TButton.Create(nil) do
begin
Parent := WizardForm;
Caption := 'Push';
Top := ScaleY(320);
Left := ScaleX(20);
OnClick := @Show;
end;
end;


положить рядом со скриптом:
isgsg.dll (библиотека от South)
Pic.png

форма - другой разговор

Ivan_009
25-09-2012, 17:56
Johny777, Спасибо... А как сделать чтобы эта картинка была строго по инсталлятору...

Gnom_aka_Lexander
25-09-2012, 19:32
Johny777, маладца! Я тоже знаю, что совсем не это человеку нужно, ну да ладно, сам хотел приколоться :)Ivan_009, в обработчик кнопки вешаешь не сплешь а функцию ImgLoad из botva2.dll. в ней-же и укажешь нужные тебе размеры относительно инсталлятора.

Ivan_009
25-09-2012, 19:47
Gnom_aka_Lexander, а как сделать чтобы картинка закрывалась при нажатии на кнопку...




© OSzone.net 2001-2012