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?
Может так будет достигнуто желаемое.
Если нужно залью весь скрипт
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, 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;
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 никто не отменял :))
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.