Войти

Показать полную графическую версию : Скрипты 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

popt2t
11-12-2012, 15:40
Версия длл-ки - анси-юникод должна совпадать с версией инно, именно поэтому в комплекте их две - одна для анси, другая для юникод. »

Спасибо, уже сам допер :yahoo:

А для чего нужна ISSkinEx.dll?

alert30
11-12-2012, 17:13
popt2t, ISSkinEx.dll - вроде тоже самое, как ISSkin.dll; загрузка скина.

Johny777
11-12-2012, 21:33
Системные месседжбоксы:
1. выглядят жутко со скином
http://img14.imageshack.us/img14/6504/94141352.png (http://imageshack.us/photo/my-images/14/94141352.png/)
2. Их трудно программно сдвинуть в сторону или отобразить не по центру
3. Нельзя изменить размер кнопки и пр.
Поэтому запилил под свои нужды самопальный месседжбокс, который умеет:
старый месседжбокс:

1: Подстраиваться под размер текста (как и систмный), правда алгоритм хромает
2: Возвращает результат (пока добавил только несколько комбинаций кнопок, но не все)
3: умеет как и его расширенный собрат самозакрываться
пока что не умеет:
1: Отображать на себе иконку
2: Воспроизводить звуки (ошибка, критическая ошибка и пр.)
Код:

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

[code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif


const
GWL_EXSTYLE = -20;
WS_EX_APPWINDOW = $40000;
WS_EX_TOOLWINDOW = $80;
//SW_HIDE = 0;
SW_NORMAL = 1;
GWL_HWNDPARENT = -8;
GCL_STYLE = -26;
CS_NOCLOSE = $200;
WM_CLOSE = $10;
// hhkAtlTab = 101;
// hhkAtlSpace = 102;
// MOD_ALT = 1;
// VK_TAB = 9;
MB_ICONHAND = $00000010;
// MB_ICONQUESTION = $00000020;
MB_ICONEXCLAMATION = $00000030;
MB_ICONASTERISK = $00000040;
MB_USERICON = $00000080;
// MB_ICONWARNING = MB_ICONEXCLAMATION;
// MB_ICONERROR = MB_ICONHAND;
// MB_ICONINFORMATION = MB_ICONASTERISK;
MB_ICONSTOP = MB_ICONHAND;

type
HDC = LongWord;
HFONT = LongWord;
HGDIOBJ = LongWord;

STR_SIZE = record
cx: Longint;
cy: Longint;
end;

_MESSAGE_INFO = record
hMsgLabel: HWND;
dTimeOut: DWORD;
dStartTime: DWORD;
hMsgForm: HWND;
end;

var
MESSAGE_INFO: _MESSAGE_INFO;



//function GetClassLong(Wnd: HWnd; Index: Integer): Longint; external 'GetClassLong{#A}@user32.dll stdcall';
//function SetClassLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetClassLong{#A}@user32.dll stdcall';
//function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@user32.dll stdcall';
function GetDC(hWnd: HWND): HDC; external 'GetDC@user32.dll stdcall';
function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; external 'SelectObject@gdi32.dll stdcall';
function GetTextExtentPoint32(DC: HDC; Str: PChar; Count: Integer; var Size: STR_SIZE): BOOL; external 'GetTextExtentPoint32{#A}@gdi32.dll stdcall';
function ReleaseDC(hWnd: HWND; hDC: HDC): Integer; external 'ReleaseDC@user32.dll stdcall';
function StrFromTimeInterval(var pszOut: Char; cchMax: UINT; dwTimeMS: DWORD; digits: Byte): Integer; external 'StrFromTimeInterval{#A}@shlwapi.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';
//function RegisterHotKey(hWnd: HWND; id: Integer; fsModifiers, vk: UINT): BOOL; external 'RegisterHotKey@user32.dll stdcall';
//function UnregisterHotKey(hWnd: HWND; id: Integer): BOOL; external 'UnregisterHotKey@user32.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';
function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';
function MessageBeep(uType: UINT): BOOL; external 'MessageBeep@user32.dll stdcall';

function GetStrSizeInPixels(Font: TFont; Caption: String): STR_SIZE;
var
DC: HDC;
SaveFont: HFONT;
begin
DC := GetDC(0);
try
SaveFont := SelectObject(DC, Font.Handle);
GetTextExtentPoint32(DC, PChar(Caption), Length(Caption), Result);
SelectObject(DC, SaveFont);
finally
ReleaseDC(0, DC);
end;
end;

function TicksToTime(Ticks: DWORD): String;
var
i: Byte;
arr: array [0..31] of Char;
begin
for i := 0 to StrFromTimeInterval(arr[0], sizeof(arr), Ticks, 8)-1 do Result := Result + arr[i];
end;

function CharCount(C: Char; aStr: String): Integer;
var
i: Integer;
begin
Result := 0;
for i := 1 to Length(aStr) do if aStr[i] = C then Result := Result + 1;
end;

procedure ATimeOutProc;
var
PassedTime: DWORD;
begin
PassedTime := GetTickCount-MESSAGE_INFO.dStartTime;
if PassedTime >= MESSAGE_INFO.dTimeOut then PostMessage(MESSAGE_INFO.hMsgForm, WM_CLOSE, 0, 0);
SetWindowText(MESSAGE_INFO.hMsgLabel, TicksToTime(MESSAGE_INFO.dTimeOut-PassedTime));
end;

function ShowMessageEx(AText, ACaption: string; AType: UINT; AMsgTyp: TMsgBoxType; ATimeOut: Integer): Integer;
var
MsgBoxForm: TSetupForm;
MsgLabel: TLabel;
Size: STR_SIZE;
szStatus: TNewStaticText;
ATimeOutTimer: LongWord;
begin
MsgBoxForm := CreateCustomForm;
with MsgBoxForm do
begin
Position := poScreenCenter;
BorderStyle := bsDialog;
Caption := ACaption;
Color := clBtnFace;
ShowWindow(GetWindowLong(MsgBoxForm.Handle, GWL_HWNDPARENT), SW_HIDE);
// RegisterHotKey(Handle, hhkAtlTab, MOD_ALT, VK_TAB);
MsgLabel := TLabel.Create(nil)
with MsgLabel do
begin
AutoSize := False;
WordWrap := True;
Parent := MsgBoxForm;
Caption := AText;
Size := GetStrSizeInPixels(Font, AText);
Left := ScaleX(16);
Top := ScaleY(16);
Font.Size := 10;
if (Size.cx > 300) and (Size.cx <= 500) then
begin
Width := ScaleX(Size.cx);
Height := ScaleY(Size.cy)+Size.cy*CharCount(#13,AText)+3;
end else if (Size.cx > 500) then
begin
Width := ScaleX(500);
Height := ScaleY(Size.cy*Round(Size.cx/500)+Size.cy*CharCount(#13,AText));
end else if (Size.cx < 300) then
begin
Width := ScaleX(300);
Height := (Size.cy);
end;
end;

ClientWidth := MsgLabel.Width + ScaleX(30);
ClientHeight := MsgLabel.Height + ScaleY(70);

with TButton.Create(nil) do
begin
Parent := MsgBoxForm;
SetBounds(MsgBoxForm.ClientWidth - ScaleX(90), MsgBoxForm.ClientHeight - ScaleY(35), ScaleX(71), ScaleY(25));
Cursor := crHand;
case AType of
MB_OKCANCEL:
begin
ModalResult := mrOk;
Caption := SetupMessage(msgButtonOK);
end;
MB_YESNO:
begin
ModalResult := mrYes;
Caption := SetupMessage(msgButtonYes);
end;
MB_OK:
begin
ModalResult := mrOk;
Caption := SetupMessage(msgButtonOk);
end;
end;
end;

if AType <> MB_OK then
with TButton.Create(nil) do
begin
Caption := SetupMessage(msgButtonNo);
Parent := MsgBoxForm;
SetBounds(MsgBoxForm.ClientWidth - ScaleX(175), MsgBoxForm.ClientHeight - ScaleY(35), ScaleX(71), ScaleY(25));
Cursor := crHand;
case AType of
MB_OKCANCEL:
begin
ModalResult := mrCancel;
Caption := SetupMessage(msgButtonCancel);
end;
MB_YESNO:
begin
ModalResult := mrNo;
Caption := SetupMessage(msgButtonNo);
end;
end;
end;

if ATimeOut <> 0 then
begin
szStatus := TNewStaticText.Create(nil);
with szStatus do
begin
Parent := MsgBoxForm;
WordWrap := True;
SetBounds(ScaleX(16), MsgBoxForm.ClientHeight - ScaleY(25), ScaleX(71), ScaleY(25));
end;
MESSAGE_INFO.hMsgLabel := szStatus.Handle;
MESSAGE_INFO.dTimeOut := ATimeOut;
MESSAGE_INFO.dStartTime := GetTickCount;
MESSAGE_INFO.hMsgForm := MsgBoxForm.Handle;
ATimeOutTimer := SetTimer(0, 777, 1, CallbackAddr('ATimeOutProc'));
end;

case AMsgTyp of
mbError: MessageBeep(MB_ICONWARNING);
mbInformation: if not MessageBeep(MB_ICONINFORMATION) then MessageBeep(MB_ICONASTERISK);
mbCriticalError: if not MessageBeep(MB_ICONSTOP) then MessageBeep(MB_ICONERROR);
end;

case AType of
MB_OKCANCEL:
case ShowModal of
mrOk: Result := IDOK;
mrCancel: Result := IDCANCEL;
else Result := IDCANCEL;
end;
MB_YESNO:
case ShowModal of
mrYes: Result := IDYES;
mrNo: Result := IDNO;
else Result := IDNO;
end;
MB_OK:
begin
ShowModal;
Result := IDOK;
end;
end;
ShowWindow(GetWindowLong(MsgBoxForm.Handle, GWL_HWNDPARENT), SW_NORMAL);
KillTimer(0, ATimeOutTimer);
// UnregisterHotKey(Handle,hhkAtlTab);
// UnregisterHotKey(Handle,hhkAtlSpace);
Free;
end;
end;


function InitializeSetup(): Boolean;
begin
if ShowMessageEx( ' Названия архивов:' + #13#10 +
'hl2_update.exe' + #13#10 +
'hl2_ep1_update.exe' + #13#10 +
'hl2_ep2_update.exe' + #13#10 +
'portal_update.exe'
, SetupMessage(msgErrorTitle), MB_YESNO, mbCriticalError, 7000) = IDNO then MsgBox('Cancel', mbCriticalError, MB_OK);
end;


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

UPD: Новый месседжбокс :grin:
способен:
1. в точности подстраиваться под размер текста
2. возвращать результат
3. самозакрываться
4. отображать те же системные иконки(берёт у системы), что и системный + ещё одну с вопросом
5. воспроизводить системные звуки под все четыре типа иконки свой
вызов:
function ShowMessageEx(sMessage, sCaption: String; uBtnType: UINT; tMessageType: _MSG_TYPE; dwMessageTimeOut: DWORD): Integer;
где
sMessage - сообщение
sCaption - заголовок окна
uBtnType - комбинации кнопок (на данный момент 3: MB_YESNO, MB_OK, MB_OKCANCEL).
tMessageType - тип сообщения (4 своих типа со звуком на каждый: mError, mInformation, mQuestion, mCriticalError)
dwMessageTimeOut - время до закрытия в миллисекундах
возвращает в зависимости от кнопок: IDOK, IDNO, IDYES, IDCANCEL
если МБ самозакрылся то возврат по умолчанию: IDNO, IDCANCEL
реализация:
грузим сообщение в TStringList
в цикле длиной в TStringList.Count создаём динамичный массив TNewStaticText(один под другим)
получаем высоту формы ClientHeight := StaticArray[0].Height*ArrayLength + ScaleY(70); (+70 пикселей на кнопки)
ширина - самый длинный TNewStaticText + 90
если ширина МБ равна ширине монитора (аналогично с высотой) то рекурсивно выводим сообщение что он не помещается, выходим из процедуры

делал под потребности "полу-распада":), но кому нужно забирайте КОД:

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

[code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif


const
WM_CLOSE = $10;
MB_ICONHAND = $00000010;
MB_ICONEXCLAMATION = $00000030;
MB_ICONASTERISK = $00000040;
MB_USERICON = $00000080;
ID_QUESTION = 65579;
ID_ASTERISK = 65583;
ID_HAND = 65581;
ID_EXCLAMATION = 65577;

type
_MESSAGE_INFO = record
hMsgLabel: HWND;
dwTimeOut: DWORD;
sTimeOut: String;
dwStartTime: DWORD;
hMsgForm: HWND;
end;

_MSG_TYPE = (mError, mInformation, mQuestion, mCriticalError);

var
MESSAGE_INFO: _MESSAGE_INFO;


function StrFromTimeInterval(var pszOut: Char; cchMax: UINT; dwTimeMS: DWORD; digits: Byte): Integer; external 'StrFromTimeInterval{#A}@shlwapi.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';
function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';
function MessageBeep(uType: UINT): BOOL; external 'MessageBeep@user32.dll stdcall';

function TicksToTime(Ticks: DWORD): String;
var
i: Byte;
arr: array [0..31] of Char;
begin
for i := 0 to StrFromTimeInterval(arr[0], sizeof(arr), Ticks, 8)-1 do Result := Result + arr[i];
end;


procedure MessageSelfCloseProc;
var
PassedTime: DWORD;
begin
PassedTime := GetTickCount-MESSAGE_INFO.dwStartTime;
if PassedTime >= MESSAGE_INFO.dwTimeOut then PostMessage(MESSAGE_INFO.hMsgForm, WM_CLOSE, 0, 0);
SetWindowText(MESSAGE_INFO.hMsgLabel, MESSAGE_INFO.sTimeOut + TicksToTime(MESSAGE_INFO.dwTimeOut-PassedTime));
end;




function ShowMessageEx(sMessage, sCaption: String; uBtnType: UINT; tMessageType: _MSG_TYPE; dwMessageTimeOut: DWORD): Integer;
var
MessageForm: TSetupForm;
ATimeOutTimer: LongWord;
StrList: TStringList;
StaticArray: array of TNewStaticText;
MaxStaticTextWidth, i, ArrayLength: Integer;
begin
try
MessageForm := CreateCustomForm;
with MessageForm do
begin
Position := poScreenCenter;
BorderStyle := bsDialog;
Caption := sCaption;
Color := clBtnFace;
try
StrList := TStringList.Create;
StrList.Text := sMessage;
SetArrayLength(StaticArray, StrList.Count);
ArrayLength := GetArrayLength(StaticArray);
StaticArray[0] := TNewStaticText.Create(MessageForm)
with StaticArray[0] do
begin
Parent := MessageForm;
Caption := StrList.Strings[0];
Font.Size := 10;
Left := ScaleX(65);// 16
Top := ScaleY(16);
MaxStaticTextWidth := Width;
end;
if ArrayLength > 1 then for i := 1 to ArrayLength-1 do // MsgBox(StrList[i], mbInformation, MB_OK);
begin
StaticArray[i] := TNewStaticText.Create(MessageForm)
with StaticArray[i] do
begin
Parent := MessageForm;
Caption := StrList.Strings[i];
Font.Size := 10;
Left := StaticArray[0].Left;
Top := StaticArray[i-1].Top + StaticArray[i-1].Height;
if Width > MaxStaticTextWidth then MaxStaticTextWidth := Width;
end;
end else if ArrayLength = 1 then MaxStaticTextWidth := StaticArray[0].Width;
if MaxStaticTextWidth < 200 then ClientWidth := ScaleX(200) else ClientWidth := ScaleX(MaxStaticTextWidth + 90);
ClientHeight := StaticArray[0].Height*ArrayLength + ScaleY(70);
finally
StrList.Free;
end;
end;

if (MessageForm.ClientWidth >= Screen.Width) or (MessageForm.ClientHeight >= Screen.Height) then
begin
ShowMessageEx('Слишком большое сообщение для Вашего монитора!', SetupMessage(msgErrorTitle), MB_OK, mError, 10000);
Exit;
end;

with TButton.Create(MessageForm) do
begin
Parent := MessageForm;
SetBounds(MessageForm.ClientWidth - ScaleX(90), MessageForm.ClientHeight - ScaleY(35), ScaleX(71), ScaleY(25));
Cursor := crHand;
case uBtnType of
MB_OKCANCEL:
begin
ModalResult := mrOk;
Caption := SetupMessage(msgButtonOK);
end;
MB_YESNO:
begin
ModalResult := mrYes;
Caption := SetupMessage(msgButtonYes);
end;
MB_OK:
begin
ModalResult := mrOk;
Caption := SetupMessage(msgButtonOk);
end;
end;
end;

if uBtnType <> MB_OK then
with TButton.Create(MessageForm) do
begin
Caption := SetupMessage(msgButtonNo);
Parent := MessageForm;
SetBounds(MessageForm.ClientWidth - ScaleX(175), MessageForm.ClientHeight - ScaleY(35), ScaleX(71), ScaleY(25));
Cursor := crHand;
case uBtnType of
MB_OKCANCEL:
begin
ModalResult := mrCancel;
Caption := SetupMessage(msgButtonCancel);
end;
MB_YESNO:
begin
ModalResult := mrNo;
Caption := SetupMessage(msgButtonNo);
end;
end;
end;

if dwMessageTimeOut <> 0 then
begin
with TNewStaticText.Create(MessageForm) do
begin
Parent := MessageForm;
SetBounds(StaticArray[0].Left, MessageForm.ClientHeight - ScaleY(30), ScaleX(71), ScaleY(25));
MESSAGE_INFO.hMsgLabel := Handle;
MESSAGE_INFO.dwTimeOut := dwMessageTimeOut;
MESSAGE_INFO.sTimeOut := 'это сообщение закроется через ';
MESSAGE_INFO.dwStartTime := GetTickCount;
MESSAGE_INFO.hMsgForm := MessageForm.Handle;
Caption := MESSAGE_INFO.sTimeOut + TicksToTime(dwMessageTimeOut);
end;
ATimeOutTimer := SetTimer(0, 777, 1, CallbackAddr('MessageSelfCloseProc'));
end;

with TNewIconImage.Create(MessageForm) do
begin
Parent := MessageForm;
SetBounds(ScaleX(16), ScaleY(16), ScaleX(32), ScaleY(32));
case tMessageType of
mError:
begin
if not MessageBeep(MB_ICONWARNING) then MessageBeep(MB_ICONEXCLAMATION);
Icon.Handle := ID_EXCLAMATION;
end;
mInformation:
begin
if not MessageBeep(MB_ICONINFORMATION) then MessageBeep(MB_ICONASTERISK);
Icon.Handle := ID_ASTERISK;
end;
mCriticalError:
begin
if not MessageBeep(MB_ICONHAND) then MessageBeep(MB_ICONERROR);
Icon.Handle := ID_HAND;
end;
mQuestion:
begin
MessageBeep(MB_USERICON);
Icon.Handle := ID_QUESTION;
end;
end;
end;

case uBtnType of
MB_OKCANCEL:
case MessageForm.ShowModal of
mrOk: Result := IDOK;
mrCancel: Result := IDCANCEL;
else Result := IDCANCEL;
end;
MB_YESNO:
case MessageForm.ShowModal of
mrYes: Result := IDYES;
mrNo: Result := IDNO;
else Result := IDNO;
end;
MB_OK:
begin
MessageForm.ShowModal;
Result := IDOK;
end;
end;
if dwMessageTimeOut <> 0 then KillTimer(0, ATimeOutTimer);
finally
MessageForm.Free;
end;
end;


function InitializeSetup(): Boolean;
begin
repeat
until ShowMessageEx('"It was a low dome, jutting with antennae and radar dishes, tiny red lights blinking above them.' + #13#10 +
'Around the dome were more structures, built low and painted white, almost indistinguishable from' + #13#10 +
'their surroundings. The whole thing was sprinkled with snow, like powdered sugar, but it was' + #13#10 +
'hardly a pristine image. There hard already been fighting here. Smoke rose from a crack in the dome.' + #13#10 +
'The soldiers stationed inside the station had massed against the Combine operators as the news of' + #13#10 +
'the uprising spread; the fighting had torn it apart from within."' + #13#10#13#10 + #9#9#9#9#9#9#9#9 +
'--Weather Control Vignette' + #13#10#13#10 +
''
, SetupMessage(msgErrorTitle), MB_OKCANCEL, mError, 7000) = IDCANCEL;
end;


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

R.i.m.s.k.y.
15-12-2012, 07:25
можно ли менять значение Uninstallable=false секции Setup во время установки? а именно после выбора компонентов

Gnom_aka_Lexander
15-12-2012, 07:59
R.i.m.s.k.y., это один из тех параметров, который можно менять. В качестве значения можно использовать булевую функцию, считывается значение в начале установки, когда начинается запись в лог удаления.

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

[*code]
function isUninstallable(): Boolean;
begin
Result := MsgBox('Создать деинсталлятор?', mbConfirmation, MB_YESNO) = IDYES;
end;

R.i.m.s.k.y.
15-12-2012, 10:14
это один из тех параметров, который можно менять. »
какие еще можно менять?

И помоему должно быть Uninstallable={code:isUninstallable}

Mailchik
15-12-2012, 10:40
какие еще можно менять? »
в которых значения могут быть true (yes) или false (no).
И помоему должно быть Uninstallable={code:isUninstallable} »[Setup]
Uninstallable=not IsTaskSelected('portablemode')

[Tasks]
Name: portablemode; Описание: "Portable Mode"

Gnom_aka_Lexander
15-12-2012, 17:07
в которых значения могут быть true (yes) или false (no). »
отнюдь, далеко не все из них можно. нужно смотреть в справке, часть параметров является компиляционными и менять их нельзя снаружи, только задавать изначально.И помоему должно быть Uninstallable={code:isUninstallable} »
когда-то именно так и было. но очень дано. именно булевые функции можно применять напрямую.

Gambetto
17-12-2012, 09:35
Подскажите кто-нибудь функции для следующих действий:
1. Найти в каталоге установщика zip-архив по маске;
2. Открыть из архива текстовый файл;
3. В файле найти заданную строку.

http://css.nevesta.info/images/legacy/smiles/thanks.gif

Dark_Delphin
19-12-2012, 02:02
Всем привет!

Y меня проблема...

Не могy перенести текст на новy строкy

см. скриншот:
http://i53.fastpic.ru/big/2012/1219/e3/8bb813294796a4c33eb7583a3d65d6e3.png

Caption:='!ВНИМАНИЕ!\n %n \% Клиент распакуется:';


И как можно перемещать этот инсталл при нажатии в любyю его точкy?


Заранее благодарен!

Gnom_aka_Lexander
19-12-2012, 07:20
Dark_Delphin, про перенос строи в коде, буквально на прошлой странице было. по второму вопросу тоже было, и видимо нужно в шапку, раз вы пользоваться поиском не умеете...

function ReleaseCapture: Longint;
external 'ReleaseCapture@user32.dll stdcall';
........................

procedure LabelOnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
SendMessage(WizardForm.Handle,$0112,$F012,0);
end;

.......................

WizardForm.OnMouseDown:=@LabelOnMouseDown;
там где WizardForm - укажешь свою поверхность, которая у тебя снаружи.

Mailchik
19-12-2012, 10:06
Gambetto,
1. Не понятен вопрос. Просто найти по маске ? Вот скрипт, находит файлы по маске и выводит список найденных файлов в ListBox.[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
var
FindButton : TButton;
FindListBox : TListBox;

procedure FindFiles(Folder, Mask : string; List : TStrings);
var
FilesFound: Integer;
FindRec: TFindRec;
begin
FIlesFound := 0;
if FindFirst(Folder + '\' + Mask, FindRec) then begin
try
repeat
if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
List.Add(Folder + '\' + FindRec.Name);
FilesFound := FilesFound + 1;
until not FindNext(FindRec);
finally
FindClose(FindRec);
end;
end;
if FilesFound = 0 then
MsgBox('Ничего не найдено.', mbInformation, MB_OK);
end;

procedure FindButtonClick(Sender : TObject);
begin
{ Где искать? Маска Куда вывести список?
| | | }
FindFiles(ExpandConstant('{src}'), '*.zip', FindListBox.Items);
end;

procedure FindListBoxClick(Sender : TObject);
begin
{ При нажатии на ListBox заголовок инсталла изменяется на адрес к найденному файлу}
WizardForm.Caption := TListBox(Sender).Items.Strings[TListBox(Sender).ItemIndex];
end;

procedure InitializeWizard;
begin
with WizardForm do begin
OuterNotebook.Hide;
SetBounds(Left, Top, ScaleX(520), ScaleY(400));
Bevel.Width := ClientWidth;
end;
FindButton := TButton.Create(WizardForm);
with FindButton do begin
Parent := WizardForm;
Caption := 'Find';
OnClick := @FindButtonClick;
SetBounds(ScaleX(10), ScaleY(250), ScaleX(100), ScaleY(30));
end;
FindListBox := TListBox.Create(WizardForm);
with FindListBox do begin
Parent := WizardForm;
OnClick := @FindListBoxClick;
SetBounds(ScaleX(10), ScaleY(10), ScaleX(500), ScaleY(200));
end;
end; 2. Наверное невозможно сделать такое. Другим путём можно пойти: распаковываем нужный файл в темп и оттуда открываем его. Рядом со скриптом положите 7z.exe, который можно забрать на оф. сайте.[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: 7z.exe; Flags: dontcopy

[Code]
var
TestButton : TButton;

procedure TestClick(Sender : TObject);
var
res : integer;
begin
{ Сначала извлекаем файл из архива Архив, из которого извлекаем | Извлекаем в темп | Нужный файл
| | | }
Exec(ExpandConstant('{tmp}\7z.exe'), 'e ' + ExpandConstant('{src}\archive.zip') + ' -o' + ExpandConstant('{tmp}') + ' test.txt -r',
ExpandConstant('{tmp}'), SW_HIDE, ewNoWait, res);
{ Теперь запускаем текстовый файл через блокнот}
Exec('notepad', ExpandConstant('{tmp}\test.txt'), ExpandConstant('{tmp}'), SW_SHOWNORMAL, ewNoWait, res);
end;

function InitializeSetup() : boolean;
begin
ExtractTemporaryFile('7z.exe');
Result := True;
end;

procedure InitializeWizard;
begin
with WizardForm do begin
OuterNotebook.Hide;
SetBounds(Left, Top, ScaleX(520), ScaleY(400));
Bevel.Width := ClientWidth;
end;
TestButton := TButton.Create(WizardForm);
with TestButton do begin
Parent := WizardForm;
Caption := 'Открыть';
OnClick := @TestClick;
SetBounds(ScaleX(10), ScaleY(250), ScaleX(100), ScaleY(30));
end;
end;
3. Опять же, не понятно что вам нужно. Просто найти строку? Или что то с ней делать? Вот скрипт, который при нахождении текста строки сообщает об этом.[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
var
TestButton : TButton;
F : String;
S : TArrayOfString;
i : integer;

procedure TestClick(Sender : TObject);
begin
F := ExpandConstant('{src}\test.txt');
LoadStringsFromFile(F, S);
if FileExists(F) then begin
for i:= 0 to GetArrayLength(S) - 1 do
begin
if Pos('TestText', S[i]) > 0 then begin //TestText - текст строки который нужно найти
MsgBox('Строка найдена', mbInformation, MB_OK);
Break;
end;
end;
end else begin
MsgBox('Файл не найден', mbError, MB_OK);
end;
end;

procedure InitializeWizard;
begin
with WizardForm do begin
OuterNotebook.Hide;
SetBounds(Left, Top, ScaleX(520), ScaleY(400));
Bevel.Width := ClientWidth;
end;
TestButton := TButton.Create(WizardForm);
with TestButton do begin
Parent := WizardForm;
Caption := 'Test';
OnClick := @TestClick;
SetBounds(ScaleX(10), ScaleY(250), ScaleX(100), ScaleY(30));
end;
end;

Gnom_aka_Lexander
19-12-2012, 10:14
2. Наверное невозможно сделать такое.
возможно. Я давал пример замены файла в зип-архиве. распаковка строго заданного файла и упаковка другого файла в этот архив. Ну да, для этого нужно целую тему полопатить. Но мне лениво вспоминать, как я это делал. и за кого-то лопатить тему - тоже неохота. Ответ есть, значит все, что нужно - просто его найти.

Mailchik
19-12-2012, 12:04
Gnom_aka_Lexander, я имел в виду, что именно так как описал Gambetto невозможно. а так как ты описал, это да. сначала распаковать определенный файл, в темп например, а потом его прочитать.

Dark_Delphin
19-12-2012, 18:35
Gnom_aka_Lexander, да. Спасибо большое, всё получилось.

В чемь может быть проблема, я вставил в скрипт себе код для скина, но после компилирование и запуска инсталла скин стандартный.
Я скачал даже пример и его же компилирую и запускается инсталл с стандартным скином...

Gnom_aka_Lexander
19-12-2012, 19:11
Dark_Delphin, потому, что IsSkin.dll не соответствует версии компилятора. это тоже буквально пару страниц назад было. это единственная возможна причина.

Dark_Delphin
19-12-2012, 19:49
Gnom_aka_Lexander, блин=) Точно, спасибо.

Dark_Delphin
19-12-2012, 23:16
Как избежать ошибки?

http://forum.oszone.net/attachment.php?attachmentid=91691&stc=1&d=1355944597

Gambetto
20-12-2012, 09:32
Не понятен вопрос. Просто найти по маске? »
Найти по маске архив, достать из него файл, в этом файле найти строку type=1 или type=2.
В зависимости от значения type устанавливать ту или иную программу.

Спасибо за примеры.

Dark_Delphin
20-12-2012, 14:53
Всем привет.

Помогите сделать, чтобы при распаковке файлов прогрес бар работал (Распаковка файлов, которые собраны компилятором)
ставил ssInstall и та же проблема.

Скачать (http://rghost.ru/private/42379972/91401ffe6b8ee7c5e5020a9d42e17985)




© OSzone.net 2001-2012