Ru-Board.club
← Вернуться в раздел «Программы»

» Inno Setup (создание инсталяционных пакетов)

Автор: Diawer
Дата сообщения: 26.10.2008 09:53
Skullboy

Цитата:
Люди, подскажите, пожалуйста, как сделать так, чтобы при установке программы выбрать файлы, с котрыми эта прога будет ассоциирована?

Выбор ассоциации файловых расширений на отдельной странице. [more=Смотри][Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Registry]
Root: HKLM; Subkey: SOFTWARE\Classes\.v64; Check: CheckOption(0)
Root: HKLM; Subkey: SOFTWARE\Classes\.z64; Check: CheckOption(1)
Root: HKLM; Subkey: SOFTWARE\Classes\MP64; ValueType: string; ValueData: My Program; Flags: uninsdeletekey
Root: HKLM; Subkey: SOFTWARE\Classes\MP64\DefaultIcon; ValueType: string; ValueData: {app}\MyProgram.exe,0
Root: HKLM; Subkey: SOFTWARE\Classes\MP64\shell\open\command; ValueType: string; ValueData: {app}\MyProgram.exe %1

[_Code]
var
Page: TInputOptionWizardPage;

procedure InitializeWizard();
begin
Page := CreateInputOptionPage(wpSelectTasks,
'Select File Extension Association', 'Which the file extension you would like to associate?',
'Select the file extension you would like to associate with My Program,'#13#10'then click Next.',
False, False);

{0} Page.Add('.v64');
{1} Page.Add('.z64');

Page.Values[0] := True;
end;

function CheckOption(OptionNum: integer): Boolean;
begin
Result:= Page.Values[OptionNum];
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpReady then
begin
WizardForm.ReadyMemo.Lines.Add('');
if Page.Values[1] or Page.Values[2] then
WizardForm.ReadyMemo.Lines.Add('File extension association:');
if Page.Values[1] then
WizardForm.ReadyMemo.Lines.Add(' .v64');
if Page.Values[2] then
WizardForm.ReadyMemo.Lines.Add(' .z64');
end;
end;[/more]
Автор: Genri
Дата сообщения: 26.10.2008 13:04
Diawer

Цитата:
по первому вопросу по переносу длинных имен вставка CheckListBox.Offset:= 0 не дало результата, а по второму вопросу работает, но только на корне папки
-- немного поясню:
по первому вопросу я уже сказал - "не знаю". Т.е. как изменить режим переноса - я не знаю. Могу только порекомендовать использовать свойство Offset. На перенос оно никак не влияет, но уменьшенные отступы уменьшат вероятность необходимости переноса. Так что говорить - "не дало результата" не совсем корректно. Скорее - дало не тот результат, который ты ожидал
По второму вопросу - сделано только на уровне корневой папки (при первом же вхождении во вложенную выставляется CheckFiles:= True). Не думаю, что расположение папок сверху улучшит удобочитаемость (особенно при большом кол-ве вложенных)
Автор: SergeyLS
Дата сообщения: 26.10.2008 14:41
Есть русификатор игры, русификатры модов и доработки для модов
А есть ли способ, в случае если папка с модами не существует (моды не установлены) - скрыть из списка компонентов русификаторы модов, доработки для модов и сам выбор компонентов?

[more]
[Files]
Source: cp\*; DestDir: {app}; Flags: overwritereadonly ignoreversion uninsneveruninstall; Check: CheckSelLanguage( '{#MyLanguageRU}' ); Components: HotUpdate MU // Основной русификатор
Source: extras\qpasmm\Strings.p01; DestDir: {app}\Data\modvdf\qp_and_sammel; Flags: overwritereadonly ignoreversion; Check: CheckSelLanguage( '{#MyLanguageRU}' ); Components: MU // Русификатор первого мода
Source: extras\sammel\Strings.p01; DestDir: {app}\Data\modvdf\sammelmod; Flags: overwritereadonly ignoreversion; Check: CheckSelLanguage( '{#MyLanguageRU}' ); Components: MU // Русификатор второго мода

Source: extras\smlcm\gui.p04; DestDir: {app}\Data\modvdf\sammelmod; Flags: overwritereadonly ignoreversion ; Check: CheckSelLanguage( '{#MyLanguageRU}' ) ; Components: MU\DftGui // карта 1
Source: extras\smlcm\gui.p04; DestDir: {app}\Data\modvdf\qp_and_sammel; Flags: overwritereadonly ignoreversion; Check: CheckSelLanguage( '{#MyLanguageRU}' ); Components: MU // карта 1
Source: extras\smlbm\gui.p04; DestDir: {app}\Data\modvdf\sammelmod; Flags: overwritereadonly ignoreversion; Check: CheckSelLanguage( '{#MyLanguageRU}' ) ; Components: MU\BdMaps // карта 2
Source: extras\smlbm\gui.p04; DestDir: {app}\Data\modvdf\qp_and_sammel; Flags: overwritereadonly ignoreversion; Check: CheckSelLanguage( '{#MyLanguageRU}' ) ; Components: MU\BdMaps // карта 2
Source: extras\gtwkcm\gui.p04; DestDir: {app}\Data\modvdf\sammelmod; Flags: overwritereadonly ignoreversion; Check: CheckSelLanguage( '{#MyLanguageRU}' ); Components: MU\SpMaps // карта 3
Source: extras\gtwkcm\gui.p04; DestDir: {app}\Data\modvdf\qp_and_sammel; Flags: overwritereadonly ignoreversion; Check: CheckSelLanguage( '{#MyLanguageRU}' ); Components: MU\SpMaps // карта 3
Source: extras\gtwknm\gui.p04; DestDir: {app}\Data\modvdf\sammelmod; Flags: overwritereadonly ignoreversion; Check: CheckSelLanguage( '{#MyLanguageRU}' ); Components: MU\GuiTweak // карта 4
Source: extras\gtwknm\gui.p04; DestDir: {app}\Data\modvdf\qp_and_sammel; Flags: overwritereadonly ignoreversion; Check: CheckSelLanguage( '{#MyLanguageRU}' ) ; Components: MU\GuiTweak // карта 4

[Types]
Name: full; Description: {cm:FullInstallation}
Name: custom; Description: {cm:CustomInstallation}; Flags: iscustom

[Components]
Name: HotUpdate; Description: {cm:HotUpdateDescription}; Types: custom full; Flags: fixed
Name: MU; Description: {cm:ModUpdateDescription}; Flags: checkablealone; Types: custom full
Name: MU\DftGui; Description: {cm:DftGuiDescription}; Flags: exclusive checkablealone; Types: custom full
Name: MU\SpMaps; Description: {cm:SpMapsDescription}; Flags: exclusive checkablealone; Types: custom full
Name: MU\BdMaps; Description: {cm:BdMapsDescription}; Flags: exclusive checkablealone; Types: custom full
Name: MU\GuiTweak; Description: {cm:GuiTweakDescription}; Flags: exclusive checkablealone; Types: custom full
[/more]
Автор: Genri
Дата сообщения: 26.10.2008 16:52
SergeyLS -- используй параметр Check. [more]
Код: [no]
[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
OutputDir=userdocs:Inno Setup Examples Output

[Types]
Name: "full"; Description: "Full installation"
Name: "compact"; Description: "Compact installation"
Name: "custom"; Description: "Custom installation"; Flags: iscustom

[Components]
Name: "program"; Description: "Program Files"; Types: full compact custom; Flags: fixed
Name: "help"; Description: "Help File"; Types: full; Check: MyProgCheck
Name: "readme"; Description: "Readme File"; Types: full
Name: "readme\en"; Description: "English"; Flags: exclusive
Name: "readme\de"; Description: "German"; Flags: exclusive

[Files]
Source: "MyProg.exe"; DestDir: "{app}"; Components: program
Source: "MyProg.chm"; DestDir: "{app}"; Components: help
Source: "Readme.txt"; DestDir: "{app}"; Components: readme\en; Flags: isreadme
Source: "Readme-German.txt"; DestName: "Liesmich.txt"; DestDir: "{app}"; Components: readme\de; Flags: isreadme

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"

[Code]
function MyProgCheck(): Boolean;
begin
Result := DirExists('c:\test');
end;[/no]
Автор: SergeyLS
Дата сообщения: 26.10.2008 17:54
Огромное спасибо за подсказку!
Genri

Цитата:
SergeyLS -- используй параметр Check. Подробнее... Компонент help будет отображен только если присутствует папка c:\test

Не работало - как всегда из-за моей невнимательности.
Автор: elchupakabra
Дата сообщения: 26.10.2008 23:39
Уж простите, если уже вопрос не новый...

Код:
[Run]
Filename: "{src}\templates.exe"; Parameters: " /silent";
Автор: Pantalone
Дата сообщения: 27.10.2008 01:04
Как думаете почему не работает это:
if (FindWindowbyWindowName('MyApp')>0) and (FindWindowbyWindowName('MyApp')=FindWindowByClassName('ThunderRT6FormDC')) then

Имя окна знаю, имя класса определил тулзами.

А это работает:
if (FindWindowbyWindowName('MyApp')>0)

Но последнее вдобавок еще и ловит открытую папку с именем MyApp.
Автор: Artem_Butenko
Дата сообщения: 27.10.2008 02:39
Друзья - возникла идея создать инсталлятор для установки тем оформления Windows XP. В чем сложность? Я хочу реализовать возможность выборочной установки ресурсов темы (звуки, иконки, обои и пр.), при условии, что информация о выбранных компонентах будет записана в файл *.theme (манифест темы). Помогите полезной информацией, ведь вопрос новый, и на мой взгляд, продуктивный. И, м.б. немного не по адресу, но все же, есть ли подробный мануал по полному оформлению файла *.theme, или программа, позволяющая его тонко настроить?
Автор: Diawer
Дата сообщения: 27.10.2008 09:02
Да, я сразу протестировал свойства Offset и, написав "не дало результата", я собственно и имел ввиду, что Мне это не чего не дает именно относительно ожидаемого мной результата. Позвольте еще немного вас помучить своими вопросами, выше на форуме давали [more= код][Setup]
AppName=Components Descriptions
AppVerName=Components Descriptions
CreateAppDir=false

[Languages]
Name: ru; MessagesFile: compiler:Languages\Russian.isl

[Types]
Name: tweak; Description: Оптимальный выбор
Name: full; Description: Выбрать все компоненты
Name: deselect; Description: Сбросить все компоненты
Name: custom; Description: Пользовательский режим; Flags: iscustom

[Components]
Name: Safe; Description: Параметры безопасности; Types: deselect
Name: Safe\wscsvc; Description: Отключить 'Центр обеспечения безопасности'; Types: full tweak
Name: Safe\Signing; Description: Разрешить установку неподписанных драйверов; Types: full
Name: WB; Description: 'Мой компьютер' - Настройки; Types: deselect
Name: WB\Computer; Description: Добавить ярлыки - Корзина, Сетевые подключения; Types: full tweak
Name: WB\Low; Description: Уведомление о недостатке свободного места на диске
Name: WB\Low\1; Description: Изменить порог срабатывания с 10 % до 1%; Flags: exclusive; Types: tweak
Name: WB\Low\No; Description: Не предупреждать о переполнении дисков; Flags: exclusive; Types: full
Name: IE; Description: Настройки обозревателя Internet Explorer; Types: deselect
Name: IE\Cache; Description: Временные файлы Internet - использовать сжатие; Types: full tweak
Name: User; Description: Параметры входа в систему
Name: User\Logon; Description: Пользователи - использовать страницу приветствия; Flags: exclusive; Types: full
Name: User\Logon2K; Description: Классический вид - выводить запрос имени и пароля; Flags: exclusive; Types: tweak
Name: User\Autologon; Description: Задействовать автоматический вход в систему; Types: full tweak
Name: User\Sound; Description: Не сопровождать звуком загрузку и завершение работы; Types: full
Name: User\English; Description: Английский язык ввода по умолчанию для всех; Types: full
Name: Sys; Description: Настройки системы и оборудования; Types: deselect
Name: Sys\Memory; Description: Память - оптимизировать работу ядра Windows
Name: Sys\Memory\1024; Description: 1024Мб физической памяти на этом компьютере; Flags: exclusive
Name: Sys\Timeout; Description: Разрешить быстрое завершение работы; Types: full tweak

[Files]
Source: compiler:descctrl.dll; Flags: dontcopy
; скачать библиотеку descctrl.dll (6 кб) можно здесь: http://victor-dobrov.narod.ru/inno_descctrl.7z

[_Code]
var Point: TPoint; CompDesc: TEdit; MessageForm: TForm; MessagePanel: TPanel; MessageLabel: TLabel; n, frame: integer; CompUpKey: Boolean; Descriptions: String; Messages: array of String;

function EnableDesc(ComponentsListHandle, DescLabelHandle: HWND; DescStrings: PChar): BOOL; external 'enabledesc@files:descctrl.dll stdcall';
function disabledesc(): BOOL; external 'disabledesc@files:descctrl.dll stdcall';
procedure GetCursorPos(var Point: TPoint); external 'GetCursorPos@user32 stdcall delayload';
function SetWindowPos(hWnd, hWndInsertAfter, X, Y, cx, cy, wFlags: Longint):Boolean; external 'SetWindowPos@user32.dll stdcall';
function ExtractIcon(hInst: LongInt; lpszExeFileName: PChar; nIconIndex: LongInt): LongInt; external 'ExtractIconA@shell32 stdcall delayload';
function DrawIconEx(hdc, x, y, hIcon, cx, cy, AniCur, Draw, Flags: Longint): Longint; external 'DrawIconEx@user32 stdcall delayload';
function GetModuleHandle(lpModuleName: LongInt): LongInt; external 'GetModuleHandleA@kernel32 stdcall delayload';

Procedure DrawIcon(Form: TWinControl; File: String; nIcon, Left, Top, Size, BColor: Integer); var Panel: TPanel; Rect: TRect; Begin
Panel:= TPanel.Create(Form); Panel.SetBounds(Left, Top, Size, Size); Panel.Parent:= Form
with TBitmapImage.Create(Panel) do begin Parent:= Panel; with Bitmap do begin
Width:= Size; Height:= Size; Rect.Right:= Size; Rect.Bottom:= Size; Canvas.Brush.Color:= BColor; Canvas.FillRect(Rect);
DrawIconEx(Canvas.Handle, 0,0, ExtractIcon(GetModuleHandle(0), ExpandConstant(File), nIcon), Size, Size,0,0,3); end; end;
End;

Function StringToArray(Text, Cut: String): array of String; var t, i, k: Integer; Begin { создать массив из текста}
Repeat SetArrayLength(Result, GetArrayLength(Result) + 1); t:= 1; k:= Pos(Cut, Text); if k > 0 then t:= Length(Cut) else k:= Pos(#10, Text); i:= GetArrayLength(Result) - 1;
if k > 0 then begin Result[i]:= Copy(Text, 1, k - 1); Text:= Copy(Text, k + t, Length(Text)) end else begin Result[i]:= Text; SetLength(Text, 0) end;
Until Length(Text) = 0
End;

Procedure ResizeLabel(Obj: TLabel; Text: String; MaxWidth: Integer); var k, w, h: integer; Begin { размер формы подгоняется под текст}
Obj.AutoSize:= true; Obj.WordWrap:= false; Obj.Caption:= Text; { авторазмер}
w:= Obj.Width; h:= Obj.Height; n:= (w + frame*2)/MaxWidth + 1
Repeat
Obj.Width:= w/n + frame*2*n + k
Obj.Height:= h * n
Obj.WordWrap:= true; k:= k + 4
Until Obj.Height/h = n
End;

Procedure ShowHint(String: string; AIndex: Integer; XCenter, YCenter: Bool); Begin { размер формы подгоняется под текст, если AIndex = 0, значок не рисуется}
frame:= 10; if AIndex <> 0 then String:= ' '+ String;
GetCursorPos(Point); MessageLabel.Left:= frame; MessageLabel.Top:= frame
ResizeLabel(MessageLabel, String, WizardForm.ClientWidth)
if XCenter then Point.X:= WizardForm.Left + WizardForm.Width/2 - (MessageLabel.Width + frame*2 -2)/2 else Point.X:= Point.X + 12;
if YCenter then Point.Y:= WizardForm.Top + WizardForm.BeveledLabel.Top else Point.Y:= Point.Y + 12;
MessageForm.SetBounds(Point.X, Point.Y, MessageLabel.Width + frame*2 -2, MessageLabel.Height + frame*2 -2)
if AIndex <> 0 then DrawIcon(MessageForm, '{sys}\shell32.dll', AIndex, 9, 8, 16, MessagePanel.Color);
MessageForm.Show; SetWindowPos(MessageForm.Handle, -1, 0, 0, 0, 0, 3);
End;

Procedure CompKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); Begin
CompUpKey:= true
n:= WizardForm.ComponentsList.ItemIndex
if n >= 0 then ShowHint(Messages[n], -1001, true, true) else MessageForm.Hide;
End;

Procedure ObjectOnClick(Sender: TObject);
Begin
Case TObject(Sender) of { событие объекта}
CompDesc:
if CompDesc.Text > '' then
if CompUpKey then CompUpKey:= false else ShowHint(CompDesc.Text, -1001, false, false)
else MessageForm.Hide;
MessageForm:
WizardForm.BringToFront;
end;
End;

Procedure DeinitializeSetup();
Begin
disabledesc();
End;

Procedure CurStepChanged(CurStep: TSetupStep);
Begin
if CurStep = ssInstall then disabledesc;
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
if CurPageID = wpSelectComponents then enableDesc(WizardForm.ComponentsList.Handle,CompDesc.Handle,Descriptions) else MessageForm.Hide;
End;

Procedure InitializeWizard;
Begin
CompDesc:= TEdit.Create(WizardForm)
CompDesc.Parent:= WizardForm
CompDesc.Visible:= false
CompDesc.OnChange:= @ObjectOnClick
MessageForm:= CreateCustomForm;
MessageForm.BorderStyle:= bsNone
MessageForm.OnActivate:= @ObjectOnClick
MessagePanel:= TPanel.Create(MessageForm)
MessagePanel.BevelInner:= bvLowered;
MessagePanel.Align:= alClient;
MessagePanel.Color:= $E1FFFF;
MessagePanel.Parent:= MessageForm
MessageLabel:= TLabel.Create(MessagePanel)
MessageLabel.Transparent:= true
MessageLabel.Font.Name:= 'Arial'
MessageLabel.Font.Size:= WizardForm.Font.Size + 1
MessageLabel.Parent:= MessagePanel
WizardForm.ComponentsList.OnKeyUp:= @CompKeyUp
Descriptions:=
'Демонстрационный режим. Действия по изменению настроек системы или параметров безопасности не выполняются. Компоненты и их описания даны только для примера. Описания отделяются друг от друга точкой с запятой и должны содержать не более 255 символов.;' +
'Отключить «Центр обеспечения безопасности» (рекомендуется отключить эту практически бесполезную службу);' +
'Разрешить установку неподписанных драйверов (упрощает настройку компьютера сразу после установки системы);' +
'«Мой компьютер» - Секция настроек, влияющих на работу компьютера;' +
'ярлыки Корзина и Сетевые подключения будут созданы в папке «Мой компьютер»;' +
'Изменить порог срабатывание уведомления о недостатке свободного места на диске;' +
'Изменить порог срабатывания с 10 % (значение по-умолчанию) до 1% (необходимо для дисков большой ёмкости);' +
'Выдача всплывающей подсказки о переполнении дисков будет отключена;' +
'Общие настройки обозревателя Internet Explorer;' +
'Папка временных файлов Internet Explorer будет сжата средствами файловой системы NTFS;' +
'Параметры входа в систему;' +
'Пользователи - использовать страницу приветствия (новый экран загрузки, появившийся в Windows XP);' +
'Классический вид - выводить запрос имени и пароля (экран загрузки, использующийся в Windows 2000);' +
'Задействовать автоматический вход в систему для текущего пользователя без запроса имени и пароля;' +
'Не сопровождать звуком загрузку и завершение работы (немного ускоряет загрузку «Рабочего стола»);' +
'Английский язык ввода по умолчанию для всех (для новых пользователей);' +
'Настройка системы на имеющийся объём оперативной памяти и процессорного кэша, оптимизация файловой подсистемы;' +
'После установке данной опции уменьшать объём оперативной памяти НЕЖЕЛАТЕЛЬНО;' +
'Вычисленный объём установленной физической памяти на этом компьютере;' +
'Разрешить быстрое завершение работы (сетевые соединения могут быть разорваны преждевременно)';
Messages:= StringToArray(Descriptions,';')
End;[/more] о компонентах, где всплывают подсказки при навиденнии курсора мышки, как в Виндовс, если с вашим [more=кодом][Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Files]
Source: Files\*; DestDir: {app}

[_Code]
const
bidDelAll = 1;
bidSkipAll = 2;
var
Form: TSetupForm;
CheckListBox: TNewCheckListBox;
AllButton, UnAllButton: TButton;
CancelButton, DelButton: TButton;
StaticText: TNewStaticText;

MsgForm: TSetupForm;
MsgAllButton, MsgSkipAllButton: TButton;
MsgCancelButton, MsgDelButton: TButton;

DelAllReadOnly: Boolean;
SkipAllReadOnly: Boolean;

CheckDirs, CheckFiles: Boolean;

function Size64(Hi, Lo: integer): Extended;
var
i: integer;
begin
Result:= Lo;
if Lo < 0 then
Result:= Result + 2147483647 + 2147483647 + 2;
i:= Hi;
while i > 0 do
begin
Result:= Result + 2147483647 + 2147483647 + 2;
i:= i - 1;
end;
end;

procedure FillListBox(const fromDir, fileMask: string; Level: Byte);
var
FSR, DSR: TFindRec;
FindResult: Boolean;
APath: string;
i: integer;
begin
APath := AddBackslash(fromDir);
FindResult := FindFirst(APath + fileMask, FSR);
try
while FindResult and CheckFiles do
begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
begin
{files} i:= CheckListBox.AddCheckBox(FSR.Name,
FloatToStr(Size64(FSR.SizeHigh, FSR.SizeLow)) + ' byte',
Level, True, True, False, True, TStringList.Create);
TStrings(CheckListBox.ItemObject[i]).Text:= APath + FSR.Name;
end;
FindResult := FindNext(FSR);
end;
FindResult := FindFirst(APath + '*.*', DSR);
while FindResult and CheckDirs do
begin
CheckFiles:= True;
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and
not ((DSR.Name = '.') or (DSR.Name = '..')) then
begin
{dir} i:= CheckListBox.AddCheckBox(DSR.Name,'DIR', Level,
True, True, False, True, TStringList.Create);
TStrings(CheckListBox.ItemObject[i]).Text:= APath + DSR.Name;
{Recursion} FillListBox(APath + DSR.Name, fileMask, Level+1);
end;
FindResult := FindNext(DSR);
end;
finally
FindClose(FSR);
FindClose(DSR);
end;
end;

procedure ButtonOnClick(Sender: TObject);
begin
if TButton(Sender).Tag = 0 then
CheckListBox.CheckItem(0, coCheckWithChildren)
else
CheckListBox.CheckItem(0, coUnCheck);
end;

procedure MsgButtonOnClick(Sender: TObject);
begin
Case TButton(Sender).Tag of
bidDelAll : DelAllReadOnly:= True;
bidSkipAll: SkipAllReadOnly:= True;
end;
MsgForm.Close;
end;

function DelMsgBox(FileName: string): Boolean;
var
MsgLabel: TLabel;
begin
MsgForm:= CreateCustomForm;
MsgForm.ClientWidth := ScaleX(400);
MsgForm.ClientHeight := ScaleY(120);
MsgForm.Caption := 'Files to delete';
MsgForm.Center;

MsgLabel := TLabel.Create(MsgForm);
MsgLabel.Left := ScaleX(20);
MsgLabel.Top := ScaleY(20);
MsgLabel.Caption:= FileName + ' is protected file or directory!' + #10#10#13 + 'Do you want to delete the file with READONLY attribute?';
MsgLabel.Parent := MsgForm;

MsgAllButton := TButton.Create(MsgForm);
MsgAllButton.Parent := MsgForm;
MsgAllButton.Width := ScaleX(75);
MsgAllButton.Height := ScaleY(23);
MsgAllButton.Left := ScaleX(20);
MsgAllButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10);
MsgAllButton.Caption := 'Delete All';
MsgAllButton.Tag:= bidDelAll;
MsgAllButton.OnClick := @MsgButtonOnClick;

MsgSkipAllButton := TButton.Create(MsgForm);
MsgSkipAllButton.Parent := MsgForm;
MsgSkipAllButton.Width := ScaleX(75);
MsgSkipAllButton.Height := ScaleY(23);
MsgSkipAllButton.Left := MsgAllButton.Left + MsgAllButton.Width + ScaleX(10);
MsgSkipAllButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10);
MsgSkipAllButton.Caption := 'Skip All';
MsgSkipAllButton.Tag:= bidSkipAll;
MsgSkipAllButton.OnClick := @MsgButtonOnClick;

MsgCancelButton := TButton.Create(MsgForm);
MsgCancelButton.Parent := MsgForm;
MsgCancelButton.Width := ScaleX(75);
MsgCancelButton.Height := ScaleY(23);
MsgCancelButton.Left := MsgForm.ClientWidth - MsgCancelButton.Width - ScaleX(20);
MsgCancelButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10);
MsgCancelButton.Caption := 'Skip';
MsgCancelButton.ModalResult := mrCancel;

MsgDelButton := TButton.Create(MsgForm);
MsgDelButton.Parent := MsgForm;
MsgDelButton.Width := ScaleX(75);
MsgDelButton.Height := ScaleY(23);
MsgDelButton.Left := MsgCancelButton.Left - MsgDelButton.Width - ScaleX(10);
MsgDelButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10);
MsgDelButton.Caption := 'Delete';
MsgDelButton.ModalResult := mrOk;

MsgForm.ActiveControl:= MsgCancelButton;

if MsgForm.ShowModal() = mrOk then
Result:= True
else
Result:= False;
end;

procedure DeleteFiles();
var
SR: TFindRec;
i: integer;
str: string;
ResultCode: Integer;
begin
DelAllReadOnly:= False;
SkipAllReadOnly:= False;
for i:= CheckListBox.Items.Count - 1 downto 0 do
begin
if CheckListBox.State[i] = cbChecked then
begin
str:= Trim(TStrings(CheckListBox.ItemObject[i]).Text);
FindFirst(str, SR);
if ((SR.Attributes and FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY) then
if Not (DelAllReadOnly or SkipAllReadOnly) then
if DelMsgBox(SR.Name) then
Exec('attrib', ' -h -s -r ' + '"' + str + '"',
'', SW_HIDE, ewWaitUntilTerminated, ResultCode);
if DelAllReadOnly then
Exec('attrib', ' -h -s -r ' + '"' + str + '"',
'', SW_HIDE, ewWaitUntilTerminated, ResultCode);

FindClose(SR);
DeleteFile(str);
RemoveDir(str);
end;
end;
end;

procedure BrowseRemainedFiles();
begin
Form:= CreateCustomForm;
Form.ClientWidth := ScaleX(400);
Form.ClientHeight := ScaleY(400);
Form.Caption := 'Files to delete';
Form.Center;

StaticText := TNewStaticText.Create(Form);
StaticText.Left:= ScaleX(20);
StaticText.Top := ScaleY(8);
StaticText.Caption := 'Some elements could not be removed.' + #10#13 +
'These can be removed manually.' + #10#13#13 +
'Choose which are necessary to delete' + #10#13 +
'or press Cancel button.';
StaticText.Font.Color:= clBlue;
StaticText.Font.Style:= [fsBold];
StaticText.AutoSize := True;
StaticText.Parent := Form;

CheckListBox := TNewCheckListBox.Create(Form);
CheckListBox.Left:= ScaleX(20);
CheckListBox.Top:= ScaleY(20);
CheckListBox.Width:= Form.ClientWidth - ScaleX(20*2);
CheckListBox.Height:= Form.ClientHeight - ScaleY(23*2 + 20);
// CheckListBox.Offset:= 0;
CheckListBox.Parent:= Form;

AllButton := TButton.Create(Form);
AllButton.Parent := Form;
AllButton.Width := ScaleX(75);
AllButton.Height := ScaleY(23);
AllButton.Left := ScaleX(20);
AllButton.Top := Form.ClientHeight - ScaleY(23 + 10);
AllButton.Caption := 'Select All';
AllButton.Tag:= 0;
AllButton.OnClick := @ButtonOnClick;

UnAllButton := TButton.Create(Form);
UnAllButton.Parent := Form;
UnAllButton.Width := ScaleX(75);
UnAllButton.Height := ScaleY(23);
UnAllButton.Left := AllButton.Left + AllButton.Width + ScaleX(10);
UnAllButton.Top := Form.ClientHeight - ScaleY(23 + 10);
UnAllButton.Caption := 'Clear All';
UnAllButton.Tag:= 1;
UnAllButton.OnClick := @ButtonOnClick;

CancelButton := TButton.Create(Form);
CancelButton.Parent := Form;
CancelButton.Width := ScaleX(75);
CancelButton.Height := ScaleY(23);
CancelButton.Left := Form.ClientWidth - CancelButton.Width - ScaleX(20);
CancelButton.Top := Form.ClientHeight - ScaleY(23 + 10);
CancelButton.Caption := 'Cancel';
CancelButton.ModalResult := mrCancel;
CancelButton.Cancel := True;

DelButton := TButton.Create(Form);
DelButton.Parent := Form;
DelButton.Width := ScaleX(75);
DelButton.Height := ScaleY(23);
DelButton.Left := CancelButton.Left - DelButton.Width - ScaleX(10);
DelButton.Top := Form.ClientHeight - ScaleY(23 + 10);
DelButton.Caption := 'Delete';
DelButton.ModalResult := mrOk;

Form.ActiveControl:= CancelButton;

CheckListBox.AddCheckBox(ExpandConstant('{app}'), '', 0, True, True, False, True, TStringList.Create);
TStrings(CheckListBox.ItemObject[0]).Text:= ExpandConstant('{app}');
CheckDirs:= True;
FillListBox(ExpandConstant('{app}'), '*', 1);
CheckDirs:= False;
FillListBox(ExpandConstant('{app}'), '*', 1);

if Form.ShowModal() = mrOk then DeleteFiles();
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if DirExists(ExpandConstant('{app}')) and (CurUninstallStep = usPostUninstall) then
BrowseRemainedFiles();
end;[/more] сделать то же самое, то это будет, на мой взгляд, даже еще лучше. Сам я точно не перенесу. В программе, для которой мне нужен этот код создается 4 (четыре) одинаково длинных и без пробела файла, реально из них нужен только один и определить его можно только по расширению.

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


Добавлено:
Genri
Автор: SpoinT
Дата сообщения: 27.10.2008 16:22
Как сделать детальную страницу установки? Как в НСИС, где показано какие файлы копируются (MEMO)
Автор: vserd
Дата сообщения: 27.10.2008 16:25
Всем Доброго здравия!!!
Возник вопрос, а как можно в #define указать ссылку на другой #define?
т.е. если указывать так

#define path_Def "\Folder"
#define Files_Def "{#path_Def}\Files"

то в итоге остается не расскрытая {#path_Def}, а если так
#define Files_Def {#path_Def}"\Files" то не компилируется

и в итоге везде использовать {#Files_Def}



Сам себе и отвечаю:

#define Files_Def path_Def + "\Files"
Автор: SotM
Дата сообщения: 28.10.2008 08:39
SpoinT
В шапке темы есть Corona Skin. Либо ей полностью воспользуйся, либо вытащи кусок кода, который отвечает за это.
Автор: Artem_Butenko
Дата сообщения: 28.10.2008 14:46
Genri - похоже меня игнорируют многие форумчане, но я не обижаюсь. Решил обратиться за помощью именно к Вам. Все по поводу моего последнего вопроса на текущей странице. Пожалуйста, помогите примером скрипта, в котором осуществляется запись в текстовый файл (в конце установки), в зависимости от выбранных компонентов? Т.е., если компонент не выбран, запись его данных в текстовый файл (имеется ввиду файл манифеста темы - *.theme) не происходит.
Автор: EagleSH
Дата сообщения: 28.10.2008 15:10
повторю вопрос:

господа, можно проигрывать флеш к примеру во время установке в окне визарда?

п.с. если было такое, тыкните носом.

ну и по поводу добавления в гейм-эксплорер, выковырял с фола3 GDFInstall.exe - прикольная вещь, запускаем GDFInstall.exe GDFFallout3.dll и всё прописывается туда, проверил с другими играми, всё отлично работает, НО! два вопроса, не создаёт Tasks и постоянно Home Page на http://www.bethsoft.com/ прописывается. Это лечить можно? в реестре нифига не нашёл.
Автор: Unc1e
Дата сообщения: 28.10.2008 15:24
EagleSH, выложи GDFInstall.exe и GDFFallout3.dll
Автор: SpoinT
Дата сообщения: 28.10.2008 15:25
Столкнулся с интересной задачей.

В дистрибутив вношу 2 файла, они разные, но имена одинаковые, например install.exe. У обоих стоит флаг "не копировать".

Вопрос в следующем, как мне извлечь нужный файл через ExtractTempoperyFile?
Извлекается не тот, как на зло, который нужен

з.ы. имена файлов изменять нельзя.

Добавлено:
Вопрос снимается, задачу решил
Автор: EagleSH
Дата сообщения: 28.10.2008 15:47
Unc1e
http://www.rapidshare.ru/813258
Автор: EagleSH
Дата сообщения: 28.10.2008 18:24
господа на первый вопрос ответит кто-то?

ещё созрел вопрос:

как ПЕРЕД началом установки файлов запустить внешнее приложение и переместить его окно в левый нижний угол экрана? (ну и спрятать главное окно инно)

вот пример:
Filename: {src}\7z.exe; Parameters: "x test.7z -o""{app}"" -y"

именно с такими параметрами.
Автор: Pantalone
Дата сообщения: 28.10.2008 23:29
Не пойму почему у меня иконка не ставится на общий рабочий стол, подскажите что не так.

Вот фрагменты скрипта:

[Setup]
PrivilegesRequired=poweruser

[Tasks]
Name: desktopicon; Description: "Create a &desktop icon"; GroupDescription: "Additional icons:";
Name: desktopicon\common; Description: "For all users"; GroupDescription: "Additional icons:"; Flags: exclusive
Name: desktopicon\user; Description: "For the current user only"; GroupDescription: "Additional icons:"; Flags: exclusive unchecked

[Icons]
Name: "{commondesktop}\My Proga"; Filename: "{app}\MyProga.exe"; Tasks: desktopicon\common; WorkingDir: "{app}"
Name: "{userdesktop}\My Proga"; Filename: "{app}\MyProga.exe"; Tasks: desktopicon\user; WorkingDir: "{app}"


Вроде правильно все? А ставлю из под поверюзера и иконка все равно шлепается только на его стол.
И подскажите пожалуйста, как тоже самое сделать с папкой в группе Старт-Программы-Моя прога.
С проводнике специально проверял из повер юзера и десктопы All Users и старт меню доступны.
Автор: sVIKs
Дата сообщения: 28.10.2008 23:41
а врзможно справку, руссификатор, программу, скрипты в один установщик запихнуть, было бы удобно...
Автор: tomor
Дата сообщения: 29.10.2008 02:01
Считываю имя файла из реестра, подставляю в DefaultDirName={code:PrevAppPath}
Имя файла там короткое: c:\Progra~1\Diagno~1\Adiag.ini, я выделяю путь c:\Progra~1\Diagno~1.
Запускается форма выбора директории. Нажимаю на Обзор и балдею: появляется в списке папок ветка c:\Progra~1\Diagno~1, причем параллельно существует C:\Program Files\Diagnostics. Нет ли какой возможноти преобразовать короткое имя в длинное?
Автор: Aglow51
Дата сообщения: 29.10.2008 02:12
Pantalone

Цитата:
Вроде правильно все? А ставлю из под поверюзера и иконка все равно шлепается только на его стол.

У тебя все правильно и работает нормально, пробовал из под "Администратора" и обычного юзера...


Цитата:
И подскажите пожалуйста, как тоже самое сделать с папкой в группе Старт-Программы-Моя прога.

Добавь в [Icons], следующий код:
Name: "{commonprograms}\My Proga Folder\My Proga"; Filename: "{app}\MyProga.exe"; Tasks: desktopicon\common; WorkingDir: "{app}"
Name: "{userprograms}\My Proga Folder\My Proga"; Filename: "{app}\MyProga.exe"; Tasks: desktopicon\user; WorkingDir: "{app}"
Автор: SotM
Дата сообщения: 29.10.2008 08:35
sVIKs
А разве в Inno все эти файлы не в установщике находятся после сборки?!
Автор: KurtWagner
Дата сообщения: 29.10.2008 13:24
что бы при установке файлов
писались расширения скажем в сексии [Code]
я впишу *.dll - "Распаковка Библиотек"
а вовремя установки! При распаковки файлов *.dll
Выскакивало вместо "Распаковка файлов" след. "Распаковка Библиотек"
Заранее спасибо...





а еще вопросик как слепить 2-ва кода


[Code]
var
InstallLocation: String;
errCode: Integer;
procedure InitializeWizard();
var
MD5: String;
begin
MD5 := GetMD5OfString('сool')
WizardForm.PasswordEdit.Visible:= False;
WizardForm.PasswordEdit.Text:= MD5;
end;
type TSystemTime = record wYear, wMonth, wDayOfWeek, wDay, wHour, wMinute, wSecond, wMilliseconds: word; end;

procedure GetLocalTime(var lpSystemTime: TSystemTime); external 'GetLocalTime@kernel32 stdcall delayload';
function SystemTimeToFileTime(const lpTime: TSystemTime; var lpFileTime: TFileTime): Boolean; external 'SystemTimeToFileTime@kernel32 stdcall delayload';
function CompareFileTime(const lpFileTime1, lpFileTime2: TFileTime): LongInt; external 'CompareFileTime@kernel32 stdcall delayload';

#ifdef TimeLimit
Function TimeLimit: Boolean; var lt, dateLimit: TSystemTime; LocalTime, LimitTime: TFileTime;
    Begin
#for {M[0] = 59; Pos(':', TimeLimit); M[0]++} M[M[0]] = Int(Copy(TimeLimit,,Pos(':', TimeLimit)-1)), TimeLimit = Copy(TimeLimit,Pos(':', TimeLimit)+1)
#expr M[M[0]] = TimeLimit
    dateLimit.wYear:= {#Int(M[59])}; dateLimit.wMonth:= {#Int(M[60])}; dateLimit.wDay:= {#Int(M[61])}; dateLimit.wHour:= {#Int(M[62])}; dateLimit.wMinute:= {#Int(M[63])};
    GetLocalTime(lt); SystemTimeToFileTime(lt, LocalTime); SystemTimeToFileTime(dateLimit, LimitTime)
    Result:= not(CompareFileTime(LimitTime, LocalTime) = -1)
End;
#endif
function InitializeSetup(): Boolean;
var
ErrorCode: Integer;
Autorun : Boolean;
begin

Autorun := RegKeyExists(HKLM,'SOFTWARE\{#Author}\');
if Autorun =true then
begin
Result := true;
end;
if Autorun = false then
begin
Autorun := RegKeyExists(HKLM,'SOFTWARE\{#Reglnk}');
if Autorun =true then
begin
Result := true;
end;

if Autorun =false then
begin

Result:=false;
end
else
begin
Result:=false;
ShellExec('open', ExpandConstant('{reg:HKLM\Software\{#Reglnk},{#lnk}|}') + '\{#MyAppExeName}', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
begin
if not TimeLimit then MsgBox('&#194;&#237;&#232;&#236;&#224;&#237;&#232;&#229;! &#194;&#251; &#232;&#241;&#247;&#229;&#240;&#239;&#224;&#235;&#232; &#235;&#232;&#236;&#232;&#242; &#226;&#240;&#229;&#236;&#229;&#237;&#232;, &#226; &#242;&#229;&#247;&#229;&#237;&#232;&#232;'#10'&#234;&#238;&#242;&#238;&#240;&#238;&#227;&#238; &#243;&#241;&#242;&#224;&#237;&#238;&#226;&#234;&#224; &#239;&#240;&#232;&#235;&#238;&#230;&#229;&#237;&#232;&#255; &#225;&#251;&#235;&#224; &#240;&#224;&#231;&#240;&#229;&#248;&#229;&#237;&#224;.'#10#10'&#208;&#229;&#234;&#238;&#236;&#229;&#237;&#228;&#243;&#229;&#242;&#241;&#255; &#239;&#238;&#235;&#243;&#247;&#232;&#242;&#252; &#237;&#238;&#226;&#243;&#254; &#226;&#229;&#240;&#241;&#232;&#254; &#239;&#240;&#238;&#227;&#240;&#224;&#236;&#236;&#251;.', mbError, MB_OK)
else Result:= True;
end;
end;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpPassword then
WizardForm.NextButton.OnClick(WizardForm.NextButton);
end;
Автор: Pantalone
Дата сообщения: 29.10.2008 14:01
Aglow51

Цитата:
Вроде правильно все? А ставлю из под поверюзера и иконка все равно шлепается только на его стол.

У тебя все правильно и работает нормально, пробовал из под "Администратора" и обычного юзера...

Нифига оно не работает, из под повер юзера иконка ставится только на его рабочий стол, а не на общий! Проверял на чистой ХР. Как я понял такова специфика, только под админом можно что-то лепить на общий рабочий стол.
Автор: SotM
Дата сообщения: 29.10.2008 14:36
KurtWagner
Твой кусок кода растягивает всё окно форума, лучше использовать тэг [ more ]
Автор: Artem_Butenko
Дата сообщения: 30.10.2008 21:19
-=Друзья=- прошу Вашей помощи! Так и не дождавшись ответа на свой предыдущий вопрос, решил задать следующий, чуть более конструктивный. Как при создании "тихой" инсталляции в Inno Setup, не отображать запущенное окно тихого инсталла на панели быстрого запуска?
Автор: andreasb
Дата сообщения: 30.10.2008 22:21
Пацаны У меня большая проблема после установки проги икона(ярлык) на рабочем столе не работает а когда указываеш путь : свойства -рабочия папка наченает работать Как зделать чтоб она сама находила после установки где у неё рабочия папка?
Автор: NightW0lf
Дата сообщения: 30.10.2008 22:46
andreasb

Цитата:
Пацаны У меня большая проблема после установки проги икона(ярлык) на рабочем столе не работает а когда указываеш путь : свойства -рабочия папка наченает работать Как зделать чтоб она сама находила после установки где у неё рабочия папка?


Код: [Icons]
Name: "{userdesktop}\Name"; Filename: "app.exe"; WorkingDir: "{app}\";
Автор: Diawer
Дата сообщения: 31.10.2008 09:15
NightW0lf

Цитата:
[Icons]
Name: "{userdesktop}\Name"; Filename: "app.exe"; WorkingDir: "{app}\";

Укажи ПОЛНЫЙ путь в WorkingDir:

Добавлено:
Name: {group}\Прочитать Readme; Filename: {app}\help\readme\Readme.html; WorkingDir: {app}\help\readme

Добавлено:
Как можно совсем убрать на странице выбора компонентов, выпадающее меню, ну то где пишется (Полная – Выборочная установка), что бы осталось только окно выбора компонентов.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970

Предыдущая тема: Презентация


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.