Войти

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


Страниц : 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 101 102 103 104 105

Ivan_009
23-04-2012, 00:24
wertulll как-то так. Пример: :)

valyok666
23-04-2012, 02:13
EvilAlex, если ты пытаешься делать всё копипастой то тебя жаль((

valyok666
23-04-2012, 03:14
EvilAlex, Я писал что помогу да(только уже не помню когда)Целыми днями я тут не сижу у меня и другие дела есть)А вот твои 10 сообщений "Помогите" "Дайте скрипт" "Исправте" и т.д)Набивание постов вообще глубость накой чёрт мне это надо???Ты элементарное сделать не можешь

Дорого времени суток !

Нужна помощь в исправлении скрипта ...

создав и запустив инстал в строке "Осталось времени:" показывает "Тестовый прогон", а не время до окончания установки...


Здравствуйте форумчане !

Подскажите пожалуйста чем кроме фриарка можно еще паковать и главное как ?

Заранее спасибо !

Доброго времени суток форумчане !

Вы кнопки для инсталов сами делаете или же есть какая-то прога ?

Зарание спасибо за ответ ...

valyok666
23-04-2012, 05:40
значит неправильно делаешь)кинь full на ргхост

wertulll
23-04-2012, 05:49
valyok666

http://rghost.ru/37722145

valyok666
23-04-2012, 06:49
wertulll,
download (http://rghost.ru/37722255)
Ты код полностью смотрел???Если бы смотрел увидел бы
WizardForm.SelectDirBitmapImage.Hide
WizardForm.SelectGroupBitmapImage.Hide
в середине кода вот поэтому код для картинки на папку не срабатывал:)

wertulll
23-04-2012, 07:04
всё работает :up
недосмотрел малёха

Devils Night
23-04-2012, 09:52
я там весь код облазил »
Хреново значит лазил, и главное не в ту степь заплёл!

извини, но мне жаль тебя »И мне тебя жаль что ты такой лентяй!

Блин, EvilAlex, почитай справку к исдон, ты её 100% не читал!
Там же ясно написано:
;#define records
определяет будет ли включен в компиляцию файл records.inf. Он служит для автоматического определения процентных соотношений между операциями. Создается в первом прогоне установки, далее включается в установщик раскомментированием выше указанной строки. Более подробную информацию об этом файле и тестовом прогоне см. раздел "Работа с библиотекой";

Как я понял, Тестовый прогон нужен для того чтобы создался records.inf в котором будут прописаны необходимые параметры, после раскомментируй #define records и будут тебе проценты.

Ну реально разжёвано до того чтобы даже идиот понял.

El Sanchez
23-04-2012, 12:51
Добрые люди скажите пожалуйста как добавить разделитель во сплывающее меню? »
Johny777, смотри реализацию в Example_Menu_StatusBar.iss

странное мигание скроллбокса (в частности картинок и ричэдитов) на второй странице »
Johny777, если инсталлятор запускать прямо из IDE по F9, то мерцание обеспечено, т.к. IDE запускает сетап в режиме отладки. Этот медленный процесс в совокупности с медленной операцией рисования и вызывает мерцание. При запуске двойным кликом мерцания я не заметил, скроллил как мог.

есть код для выкатывающейся панели через таймер, но с его использованием вылетают непонятные и жуткие ошибки »
Johny777, глюков не увидел. Но ставить такой низкий интервал таймеру не рекомендую - минимум 10 мс, и таймеров многовато - достаточно одного. А можно и без таймеров:


[Code]
const
GWL_EXSTYLE = (-20);
WS_EX_COMPOSITED = $2000000;
AW_HIDE = $10000;
AW_VER_POSITIVE = $4;
AW_VER_NEGATIVE = $8;

function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';
function AnimateWindow(hwnd: HWND; dwTime, dwFlags: DWORD): BOOL; external 'AnimateWindow@user32.dll stdcall';

var
SettingPanel: TPanel;

procedure NewButton1Click(Sender: TObject);
begin
with SettingPanel do
begin
//временно отрубаем стиль WS_EX_COMPOSITED, а то AnimateWindow плавненько не отработает
SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) xor WS_EX_COMPOSITED);
AnimateWindow(Handle, 1000, (AW_VER_POSITIVE * dword(not Visible)) or ((AW_HIDE or AW_VER_NEGATIVE) * dword(Visible)));
SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_COMPOSITED);
Visible := not Visible;
end;
end;

procedure InitializeWizard();
begin
SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_COMPOSITED);

SettingPanel := TPanel.Create(WizardForm);
with SettingPanel do
begin
Parent := WizardForm;
SetBounds(ScaleX(0), ScaleY(0), WizardForm.ClientWidth, WizardForm.OuterNotebook.ClientHeight);
Visible := False;
end;

with TNewButton.Create(WizardForm) do
begin
Parent := WizardForm;
SetBounds(ScaleX(40), ScaleY(327), ScaleX(75), ScaleY(25));
Caption := 'open';
OnClick := @NewButton1Click;
end;
end;



другой пример использвания таймера привел к тому что он (таймер) не работал (то была проверки на странице выбора директории установки)
речь идёт об этом незамысловатом примере: »
Johny777, такую проверку нужно делать в обработчике OnChange компонента WizardForm.DirEdit:


[Code]
procedure DirEditOnChange(Sender: TObject);
begin
WizardForm.NextButton.Enabled := TEdit(Sender).Text <> '123';
end;

procedure InitializeWizard();
begin
WizardForm.DirEdit.OnChange := @DirEditOnChange;
end;

Johny777
23-04-2012, 13:02
El Sanchez,
спасибо добрый человек! :)
буду разбирать
таймеров многовато »
ну innocallback для процентов стоит

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

[Files]
Source: compiler:innocallback.dll; Flags: dontcopy
Source: {win}\Help\*; DestDir: {app}; Flags: external recursesubdirs

[ code]
type
TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);

var
PercentsTimer: LongWord;
PercentsLabel: TLabel;

function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';

Function NumToStr(Float: Extended): String;
Begin
Result:= Format('%.1n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
End;

Procedure PercentsProc(h, msg, idevent, dwTime: Longword);
Begin
with WizardForm.ProgressGauge do
begin
PercentsLabel.Caption:= 'Выполнено ' + NumToStr((Position*100)/Max) + ' %';
end;
End;

procedure DeinitializeSetup();
begin
KillTimer(0, PercentsTimer);
end;

procedure InitializeWizard();
begin
PercentsLabel:= TLabel.Create(WizardForm);
with PercentsLabel do
begin
Left:= WizardForm.ProgressGauge.Left;
Top:= WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10);
Width:= WizardForm.StatusLabel.Width;
Height:= WizardForm.StatusLabel.Height;
AutoSize:= False;
Transparent := True;
Parent:= WizardForm.InstallingPage;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
PercentsTimer:= SetTimer(0, 0, 100, WrapTimerProc(@PercentsProc, 4));
end;
end;

и для того чтобы форма задач двигалась вместе с основным окном

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

[Files]
Source: compiler:innocallback.dll; DestDir: {tmp}; Flags: dontcopy

[ code]
const
WM_MOVE = $3;

GWL_WNDPROC = -4;

type
TCallbackProc = function(h:hWnd;Msg,wParam,lParam:Longint):Longint ;

function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function WndProcCallBack(P:TCallbackProc;ParamCount:integer ):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall';
function SetWindowPos(hWnd: HWND; hWndInsertAfter: HWND; X, Y, cx, cy: Integer; uFlags: UINT): BOOL; external 'SetWindowPos@user32.dll stdcall';

var
Form1: TForm;
OldProc: Longint;

function MyProc(h: HWND; Msg, wParam, lParam: longint): Longint;
begin
if Msg=WM_MOVE then SetWindowPos(Form1.Handle, 0, WizardForm.Left+WizardForm.Width+5, WizardForm.Top, 0, 0, $415);
Result:= CallWindowProc(OldProc, h, Msg, wParam, lParam);
end;

procedure InitializeWizard();
begin
Form1:= TForm.Create(MainForm);
Form1.SetBounds(WizardForm.Left+WizardForm.Width+5 , WizardForm.Top, 100, 358);
Form1.BorderStyle:= bsSingle;
Form1.Show;

OldProc:= SetWindowLong(WizardForm.Handle, GWL_WNDPROC, WndProcCallBack(@MyProc, 4));
end;

procedure DeinitializeSetup();
begin
SetWindowlong(WizardForm.Handle, GWL_WNDPROC, OldProc);
end;
проверку нужно делать в обработчике OnChange »
отлично,
Хочу переделать запрет на кириллицу в пути для отображения лейбла и блокирования кнопки далее вместо меседж бокса.
Займусь теперь.

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,
во время выката панель плавно появляется, но не обновляется (т.е. мемо пролога появляется в самом конце после анимации), что не есть красиво!
менял панель на саму мемо - результат тот же
Ты бы не мог пожалуйста, если не трудно, немного переделать старый пример под innocallback?
Может так будет достигнуто желаемое.
Если нужно залью весь скрипт

nikitich95
23-04-2012, 15:28
Спасибо)) Рабочий, но правда возникла небольшая проблема:
Нужно убрать разделители и опустить кнопки.
Вот скрин:

El Sanchez
23-04-2012, 18:22
во время выката панель плавно появляется, но не обновляется (т.е. мемо пролога появляется в самом конце после анимации), что не есть красиво! »
Лады, переделаю.

под innocallback »
Johny777, зачем тебе вообще эта библиотека в Restools, когда там вместо нее можно использовать ф-ию CallbackAddr?

Хочу переделать запрет на кириллицу в пути »
Чтоб ты ничего не выдумывал, то вот функция:


function IsStringCyrillic(Str: String): Boolean;
var
objRegExp: Variant;
begin
try
objRegExp := CreateOleObject('VBScript.RegExp');
except
ShowExceptionMessage;
end;

if objRegExp.Test(Str) then
begin
objRegExp.Pattern := '[\u0400-\u04FF,\u0500-\u052F,\u2DE0-\u2DFF,\uA640-\uA69F]';
Result := objRegExp.Execute(Str).Count = 1;
end;
end;

Johny777
23-04-2012, 18:35
Лады, переделаю. »
Спасибо! Скрипт нужен для удобства?
ты ничего не выдумывал »
да есть уже в приготовом виде :)
http://forum.ru-board.com/topic.cgi?forum=5&topic=35848&start=1484&limit=1&m=2#1

но спасибо за IsStringCyrillic.iss

Ivan_009
23-04-2012, 19:11
Возможно ли сделать в Inno Fairy Пропорциональное растягивание изображения до размеров окна.Тоесть, чтобы неуказывать размер вручную... :)

Johny777
23-04-2012, 20:06
Ivan_009,
почему именно Inno Fairy?
есть ведь isgsg.dll#
________________
вот наполовину готово
текущее разрешение поставил ) (при каком разрешении монитора запускают то и будет)
только не используй тк скрипт почистить нужно
А как растянуть хз
//Пример работы с fairy.dll. Через c .jpg

#include "fairy.iss"

[Setup]
AppName=fairy
AppVerName=fairy Ver 2.0
DefaultDirName={pf}\fairy
DefaultGroupName=fairy
OutputDir=.
SolidCompression=yes

[Files]
Source: miku.jpg; Flags: dontcopy

[ code]
///////// начало
function DeleteDC(hDC: Integer): Integer;
external 'DeleteDC@GDI32 stdcall';

function CreateDC(lpDriverName, lpDeviceName, lpOutput: String; lpInitData: Integer): Integer;
external 'CreateDCA@GDI32 stdcall';

function GetDeviceCaps(hDC, nIndex: Integer): Integer;
external 'GetDeviceCaps@GDI32 stdcall';



Const
HORZRES = 8; //horizontal resolution
VERTRES = 10; //vertical resolution
BITSPIXEL = 12; //bits per pixel
PLANES = 14; //number of planes (color depth=bits_per_pixel*number_of_planes)
////////// конец

function GetSysColor(nIndex: Integer): DWORD; external 'GetSysColor@user32.dll stdcall';
function GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll';

var
GifFrameCount: Integer;

function ColorToRGB(Color: TColor): Longint;
begin
if Color < 0 then
Result := GetSysColor(Color and $000000FF)
else
Result := Color;
end;

procedure InitializeWizard();
var
Btn: TNewButton;
ImgFile: AnsiString;
S: AnsiString;
x, y: Integer;
BAlpha, TransparentColor: Integer;
///////// начало
xres, yres, bpp, pl, tmp: Integer;
hDC: Integer;
////////// конец
begin
///////// начало
//get resolution & BPP
hDC := CreateDC('DISPLAY', '', '', 0);
pl := GetDeviceCaps(hDC, PLANES);
bpp := GetDeviceCaps(hDC, BITSPIXEL);
xres := GetDeviceCaps(hDC, HORZRES); //horizontal resolution
yres := GetDeviceCaps(hDC, VERTRES); //vertical resolution

////////// конец
InitFairy(GetWindowLong(MainForm.Handle, -8), 0, 20);
ImgFile := 'miku.jpg';
ExtractTemporaryFile(ImgFile);
x := -xres div 2; // Расположение изображения (горизонталь [X]). По умолчанию -1280.
y := -yres div 2; // Расположение изображения (Вертикаль [Y]). По умолчанию -960.
BAlpha := 255; // Прозрачность изображения. По умолчанию 255.
TransparentColor := ColorToRGB(clNone);
AddImgToList(x, y, BAlpha, TransparentColor, ExpandConstant('{tmp}\'+ImgFile))
ShowFairyEx(0);
end;

procedure DeinitializeSetup();
begin
HideFairy;
WizardForm.Hide;
UninitFairy;
end;

nikitich95
23-04-2012, 20:55
Сори) забыл. Вот скрипт:
Если чего-то не хватает - скажите.

valyok666
23-04-2012, 22:13
nikitich95, Ты OuterNotebook и InnerNotebook растяни в редакторе и меняй дальше куда хочешь :)

P.S Прикрепляй полный скрипт!Со всеми файлами!
Разделители можно убрать так-->

procedure InitializeWizard();
begin
with WizardForm.Bevel do Hide;
with WizardForm.Bevel1 do Hide;
end;

detiedyatosla
23-04-2012, 23:01
valyok666 а можно подробней о OuterNotebook ?

valyok666
23-04-2012, 23:14
detiedyatosla, Cкриншот посмотри и поймёшь:)

Johny777
23-04-2012, 23:43
detiedyatosla,

http://img713.imageshack.us/img713/4528/87359895.png (http://imageshack.us/photo/my-images/713/87359895.png/)

и чтобы окно было аккурат по центру экрана напиши в процедуру InitializeWizard строку *(выделил жирным)
procedure InitializeWizard;
begin
WizardForm.Position:= poScreenCenter;
end;

_________________________________________________________________________

Вопрос
для того чтобы заблокировать закрытие окна через alt + F4 нужно использовать ?


const
WS_EX_NOACTIVATE = $8000000;
GWL_EXSTYLE = (-20);

function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';

procedure InitializeWizard();
begin
SetWindowLong(WizardForm.Handle,GWL_EXSTYLE,GetWindowLong(WizardForm.Handle,GWL_EXSTYLE) or WS_EX_NOACTIVATE);
end;

(нужно запретить закрытие одной из форм. Slim_Form.BorderIcons := []; а вот чудесно работающую комбинацию alt + F4 никто не отменял :))




© OSzone.net 2001-2012