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

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

Автор: mikutu
Дата сообщения: 15.11.2011 10:24
Пишу не большой скрипт, нужно что бы инсталер устанавливался без всяких вопросов, сделал все как в FAQ но на все равно показывается страница с кнопкой установить
[more=Текст скрипта]#define MyAppName "Обновление "
#define MyAppVersion "3.6.0.3625"
#define MyAppPublisher "ООО"
#define MyAppURL "http://www.so.ru"

[Setup]
AppId={{964EB4F1-0CC9-48F9-B26F-9CAF84C7A0EB}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
VersionInfoVersion={#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName=C:\prit3
DisableReadyPage=yes
DisableStartupPrompt=yes
DisableDirPage=yes
;DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes
;DisableFinishedPage=yes
OutputBaseFilename=Updater
OutputDir=.
Compression=lzma
SolidCompression=yes
Uninstallable=no
CreateUninstallRegKey=no

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

[Files]
Source: {src}\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs external; Languages:

[Icons]
Code] ; добавить [ в начало строки убрал т.к. при отправке ругался парсер
procedure CurPageChanged(CurPageID: Integer);
begin
If CurPageID=wpWelcome then
begin
SendMessage(WizardForm.NEXTBUTTON.Handle, 513, 0, 0)
SendMessage(WizardForm.NEXTBUTTON.Handle, 514, 0, 0)
end;
end;[/more]
У меня стоит InnoSetup 5.4.1 и ISTool 5.3.0.1
Автор: vint56
Дата сообщения: 15.11.2011 10:37
mikutu [more=вот можеш скрыть какую тебе нужно страницу установки]
function ShouldSkipPage(PageID: Integer): Boolean;
begin
// wpWelcome = 1;
// wpLicense = 2;
// wpPassword = 3;
// wpInfoBefore = 4;
// wpUserInfo = 5;
// wpSelectDir = 6;
// wpSelectComponents = 7;
// wpSelectProgramGroup = 8;
// wpSelectTasks = 9;
// wpReady = 10;
// wpPreparing = 11;
// wpInstalling = 12;
// wpInfoAfter = 13;
// wpFinished = 14;
// if (PageID = wpSelectComponents)or(PageID = 10)or(PageID = 14) then
if (PageID = wpSelectComponents) then
Result:= True;
end;[/more]
Автор: Fantasy22
Дата сообщения: 15.11.2011 13:34

Цитата:

[Files]
Source: Files\iswin7.dll; DestDir: {app}; Attribs: hidden system

[_code]
procedure megalol(Handle:HWND; Left, Top, Right, Bottom : Integer; GDIPLoadMode: boolean); external 'iswin7_add_glass@{app}\iswin7.dll stdcall uninstallonly';
procedure megalol_button(Handle:HWND); external 'iswin7_add_button@{app}\iswin7.dll stdcall uninstallonly';
procedure megalol_free; external 'iswin7_free@{app}\iswin7.dll stdcall uninstallonly';

procedure InitializeUninstallProgressForm();
begin
UninstallProgressForm.Color:=clBlack
megalol_button(UninstallProgressForm.CancelButton.Handle);
megalol(UninstallProgressForm.Handle, 0, 0, 0, 50, True);
end;

procedure DeinitializeUninstall();
begin
megalol_free;
end;

При использовании этого кода деинсталлятор выдает ошибку



помогите решить проблемку

Автор: vint56
Дата сообщения: 15.11.2011 14:06
Fantasy22 [more=пример]
[Files]
Source: iswin7.dll; Flags: dontcopy
Source: iswin7.dll; DestDir: {app}; Attribs: hidden system

[Code]
procedure iswin7_add_glass(Handle:HWND; Left, Top, Right, Bottom : Integer; GDIPLoadMode: boolean);
external 'iswin7_add_glass@files:iswin7.dll stdcall';

procedure iswin7_add_button(Handle:HWND);
external 'iswin7_add_button@files:iswin7.dll stdcall';

procedure iswin7_free;
external 'iswin7_free@files:iswin7.dll stdcall';

procedure Uninst_iswin7_add_glass(Handle: HWND; Left, Top, Right, Bottom : Integer; GDIPLoadMode: boolean);
external 'iswin7_add_glass@{app}\iswin7.dll stdcall uninstallonly';
procedure Uninst_iswin7_add_button(Handle: HWND); external 'iswin7_add_button@{app}\iswin7.dll stdcall uninstallonly';
procedure Uninst_iswin7_free;
external 'iswin7_free@{app}\iswin7.dll stdcall uninstallonly';

procedure InitializeWizard();
begin
// Необходимо добавлять каждую кнопку расположенную на стекле
// до инициализации стекла для того что бы не было дыр ))
iswin7_add_button(WizardForm.BackButton.Handle);
iswin7_add_button(WizardForm.NextButton.Handle);
iswin7_add_button(WizardForm.CancelButton.Handle);
// Параметр True не трогать он для htuos ))
iswin7_add_glass(WizardForm.Handle, 0, 0, 0, 47, True);
end;

procedure InitializeUninstallProgressForm();
begin
UninstallProgressForm.Color:=clBlack
Uninst_iswin7_add_button(UninstallProgressForm.CancelButton.Handle);
Uninst_iswin7_add_glass(UninstallProgressForm.Handle, 0, 0, 0, 50, True);
end;


procedure DeinitializeSetup();
begin
iswin7_free;
end;

procedure DeinitializeUninstall();
begin
Uninst_iswin7_free;
end; [/more]
Автор: Raf_SE
Дата сообщения: 15.11.2011 19:26
Ктонить может написать скрипт, который если обнаруживает в устанавливаемой папке, файл с тем же именем и расширением что сейчас должен распаковаться, то сначала проверил CRC32 файла в папке, и если он совпал с тем CRC32 что я задал для этого файла, файл бы не распаковывался?
Автор: Snoopak96
Дата сообщения: 15.11.2011 19:40
Raf_SE
Навряд ли кто возьмётся и скорее это не скрипт будет.
Автор: mikutu
Дата сообщения: 16.11.2011 02:25

Цитата:
vint56
Спасибо, но мне надо что бы инсталятор после запуска сразу переходил к установке, почитав help я понял что в таком случае не поможет ShouldSkipPage т.к. она не вызывается на этой странице, а DisableReadyPage игнорируется если перед ней не было ни одной страницы. CurPageChanged с send message тоже не дает эффекта. Может есть еще способы? Конечно я могу запустиь с параметром /silent, но в этом случае мне не нравиться что не выводиться страница WpFinished.

function ShouldSkipPage(PageID: Integer): Boolean;
The wizard calls this event function to determine whether or not a particular page (specified by PageID) should be shown at all. If you return True, the page will be skipped; if you return False, the page may be shown.

Note: This event function isn't called for the wpWelcome, wpPreparing, and wpInstalling pages, nor for pages that Setup has already determined should be skipped (for example, wpSelectComponents in an install containing no components).

DisableReadyPage
When Setup is not running silently, this directive is ignored if no other wizard page before the Ready to Install wizard page has been shown yet.

Автор: Gnom3
Дата сообщения: 16.11.2011 07:12
mikutu
Попробуй так сделать:


Код: [Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
[*code]
procedure InitializeWizard();
begin
with WizardForm do SetBounds(-Left*5, -Top*5, Width, Height);
end;
procedure CurPageChanged(CurPageID: Integer);
begin
PostMessage(WizardForm.NextButton.Handle, 245, 0, 0);
end;
Автор: mikutu
Дата сообщения: 16.11.2011 07:55
Gnom3 Спасибо, действительно работает как нужно.
Автор: Fantasy22
Дата сообщения: 16.11.2011 14:26
vint56

Цитата:

Fantasy22 пример [?]

Выдает туже самую ошибку может это и за Inno Setup 5.4.2


Автор: Raf_SE
Дата сообщения: 16.11.2011 14:31
Raf_SE (20:26 15-11-2011)
Цитата:
Ктонить может написать скрипт, который если обнаруживает в устанавливаемой папке, файл с тем же именем и расширением что сейчас должен распаковаться, то сначала проверил CRC32 файла в папке, и если он совпал с тем CRC32 что я задал для этого файла, файл бы не распаковывался?

Snoopak96 (20:40 15-11-2011)
Цитата:
Навряд ли кто возьмётся и скорее это не скрипт будет.

Почему это сложно? Inno умеет проверят контрольные суммы. Есть даже функции:
function GetMD5OfFile(const Filename: String): String;
function GetSHA1OfFile(const Filename: String): String;
Сделать сверку полученной хэш-суммы, с заданной мной, тоже врятли сложно.
Автор: vint56
Дата сообщения: 16.11.2011 14:32
Fantasy22
пример скрипт длл http://rghost.ru/30368301
версия компилятора Inno Setup QuickStart Pack (ansi) 5.4.2
Автор: Gnom3
Дата сообщения: 16.11.2011 15:24
Raf_SE

Цитата:
Ктонить может написать скрипт, который если обнаруживает в устанавливаемой папке, файл с тем же именем и расширением что сейчас должен распаковаться, то сначала проверил CRC32 файла в папке, и если он совпал с тем CRC32 что я задал для этого файла, файл бы не распаковывался?

Код: [Files]
Source: {app}\файл.расширение; DestDir: {app}\файл.расширение; Check: md5

[code*]
function md5: Boolean;
begin
case FileExists(ExpandConstant('{app}\файл.расширение')) of
True: // если файл наличиствует
Result:= not(GetSHA1OfFile(ExpandConstant('{app}\файл.расширение'))='твое значение'); // то запрещаем, если совпадает SHA1O
false: // если файла нет
Result:= true; // то просто разрешаем его копировать.
end;
end;
Автор: Raf_SE
Дата сообщения: 16.11.2011 18:27
Gnom3
А нельзя ли использовать проверку CRC32, вместо SHA1? Просто CRC32 гораздо быстрее проверяется...
Если проверка CRC32 невозможна, то можно ли вместо хэш-суммы, проверять файл побайтово?
И можно ли это реализовать не через Check, а через BeforeInstall ? К примеру:
Source: {app}\файл.расширение; BeforeInstall: CheckingByte('УКАЗАННОЕ МНОЙ КОЛИЧЕСТВО БАЙТ')

P.S.
Собстно такой код нужен для использования с улучшенным деинсталлятором UninsHs, чтобы когда пользователь выбрал в нем "Изменить" или "Восстановить", то не перезаписывались все файлы, а только измененные.
Автор: Gnom3
Дата сообщения: 16.11.2011 18:44
я нашел, также, только GetMD5OfFile и GetSHA1OfFile, использовать можно любую, не меняя кода. BeforeInstall - это то, что выполняется в тот момент, когда этот файл распаковывается. запретить-разрешить из кода, можно только Check-ом

Цитата:
Собстно такой код нужен для использования с улучшенным деинсталлятором UninsHs, чтобы когда пользователь выбрал в нем "Изменить" или "Восстановить", то не перезаписывались все файлы, а только измененные.

Може, проще так, тогда:

Код: [Files]
Source: {app}\файл.расширение; DestDir: {app}\файл.расширение; Flags: comparetimestamp
Автор: Raf_SE
Дата сообщения: 16.11.2011 19:17
Gnom3 (19:44 16-11-2011)
Цитата:
comparetimestamp - сравнивается время создания, при наличии в папке файла, и копируется только если подаваемый файл новее.

Если бы сравнивалось время изменения, тогда бы можно было использовать, а так, слишком не надежно.

Gnom3 (19:44 16-11-2011)
Цитата:
я нашел, также, только GetMD5OfFile и GetSHA1OfFile, использовать можно любую, не меняя кода.

Они оба очень ресурсозатратны. Если файл сжат zip'ом, то разница между его распаковкой, и проверкой его MD5\SHA1, не очень существенна.

Вы можете сделать чтобы проверка была побайтовой? Это был бы идеальный вариант, максимально быстрый, и не зависящий от сбоев настроек времени\часовых поясов.
Вроде бы для этого есть спец. функция: function FileSize(const Name: String; var Size: Integer): Boolean;
Автор: lorents
Дата сообщения: 16.11.2011 20:45
Добрый вечер!
Сейчас многие кто делаю репаки ставят пароль на архивы.
Можно ли, узнать это пароль? я распаковал установочный файл, но там нет пароля, где он может быть?
Автор: Profrager
Дата сообщения: 16.11.2011 21:54
lorents

Цитата:
Можно ли, узнать это пароль? я распаковал установочный файл, но там нет пароля, где он может быть?
узнать можно. Метод зависит от способа распаковки этим инсталлом нужного тебе архива. Если распаковка посредством exe (а так же переименованного в dll exe-файла) анпакера, то просто с помощью продвинутого диспетчера задач, если же с помощью длл - то с помощью дебагера. Первый метод занимает 10 секунд, второй при должном знании темы - 1-2 мин.
Автор: mikutu
Дата сообщения: 17.11.2011 06:03
написал код для завершения процесса, но с тем условием что он запущен из папки в которую мы будем ставить программу. Вроде работает правильно, но так как опыт написания на inno не очень большой прошу более опытных людей посмотреть не сделал ли я каких-нибудь ошибок в этом скрипте.
[more=Скрипт]
Код: #ifdef UNICODE
    #define A "PAnsiChar"
#else
    #define A "PChar"
#endif
const
    MAX_PATH = 260;
    MAX_MODULE_NAME32 = 258;
    PROCESS_TERMINATE = $0001;
    PM_REMOVE = 1;
    TH32CS_SNAPPROCESS = $00000002;
    TH32CS_SNAPMODULE = $00000008;
type
    TProcessEntry32 = record
        dwSize: DWORD;
        cntUsage: DWORD;
        th32ProcessID: DWORD;
        th32DefaultHeapID: DWORD;
        th32ModuleID: DWORD;
        cntThreads: DWORD;
        th32ParentProcessID: DWORD;
        pcPriClassBase: Longint;
        dwFlags: DWORD;
        szExeFile: array[0..MAX_PATH] of Char;
end;
    TModuleEntry32 = record
        dwSize: DWORD;
        th32ModuleID: DWORD;
        th32ProcessID: DWORD;
        GlblcntUsage: DWORD;
        ProccntUsage: DWORD;
        modBaseAddr: Byte;
        modBaseSize: DWORD;
        hModule: THandle;
        szModule: array[0..MAX_MODULE_NAME32] of Char;
        szExePath: array[0..MAX_PATH] of Char;
end;
    TMsg = record
        hWnd: HWND;
        msg: Word;
        wParam: Word;
        lParam: LongWord;
        Time: TFileTime;
        pt: TPoint;
    end;
    TProcessInformation = record
        hProcess: THandle;
        hThread: THandle;
        dwProcessId: DWORD;
        dwThreadId: DWORD;
end;
    TStartupInfo = record
     cb: DWORD;
     lpReserved: Longint;
     lpDesktop: Longint;
     lpTitle: {#A};
     dwX: DWORD;
     dwY: DWORD;
     dwXSize: DWORD;
     dwYSize: DWORD;
     dwXCountChars: DWORD;
     dwYCountChars: DWORD;
     dwFillAttribute: DWORD;
     dwFlags: DWORD;
     wShowWindow: Word;
     cbReserved2: Word;
     lpReserved2: Byte;
     hStdInput: THandle;
     hStdOutput: THandle;
     hStdError: THandle;
    end;
function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle;
    external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
function Process32First(hSnapshot: THandle; var lppe: TProcessEntry32): BOOL;
    external 'Process32First@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TProcessEntry32): BOOL;
    external 'Process32Next@kernel32.dll stdcall';
function Module32First(hSnapshot: THandle; var lppe: TModuleEntry32): BOOL;
    external 'Module32First@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL;
    external 'CloseHandle@kernel32.dll stdcall';
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle;
    external 'OpenProcess@kernel32.dll stdcall';
function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL;
    external 'TerminateProcess@kernel32.dll stdcall';
function PeekMessage(var lpMsg: TMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax,
wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
function TranslateMessage(const lpMsg: TMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
function DispatchMessage(const lpMsg: TMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';


function ArrayCharToString(ArrayChar: array of Char): string;
var
    i: Integer;
    str: string;
begin
    for i:= 0 to MAX_PATH do begin
        if (ArrayChar[i]) <> #0 then str:= str + ArrayChar[i]
        else Break;
    end;
    Result:= str;
end;

procedure Application_ProcessMessages;
var
    Msg: TMsg;
begin
    if not PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then Exit;
    TranslateMessage(Msg);
    DispatchMessage(Msg);
end;

function KillProcess(ProcessID: DWORD): Boolean;
var
    hProcess: THandle;
begin
    hProcess:= OpenProcess(PROCESS_TERMINATE, False, ProcessID);
    Result:= TerminateProcess(hProcess, 0);
    CloseHandle(hProcess);
end;

function IsRunExe(ExeFileName, PathFile:string; var ProcId: DWORD):Boolean;
var
    hSnapshot,hSnapshot2:THandle;
proc:TProcessEntry32;
m:TModuleEntry32;
begin
result:=false;
hSnapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
proc.dwSize:=Sizeof(proc);
if Process32First(hSnapshot,proc) then begin
        repeat
            if LowerCase(ArrayCharToString(proc.szExeFile)) = LowerCase(ExeFileName) then begin
                hSnapshot2:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,proc.th32ProcessID);
                m.dwSize:=SizeOf(m);
                if Module32First(hSnapshot2,m) then begin
                    if LowerCase(PathFile + '\' + ExeFileName) = LowerCase(ArrayCharToString(m.szExePath)) then begin
                        result:=true;
                        ProcId := proc.th32ProcessID;
                        CloseHandle(hSnapshot2);
                     CloseHandle(hSnapshot);
                        exit;
                    end;
                end;
            end;
            Application_ProcessMessages;
        until not Process32Next(hSnapshot,proc);
    end;
    CloseHandle(hSnapshot);
end;

procedure MyBeforeInstal();
var
PrID: DWORD;
begin
if IsRunExe('cntrl.exe', ExpandConstant('{app}'), PrID) then KillProcess(PrID);
end;
Автор: lorents
Дата сообщения: 17.11.2011 06:36
Profrager
а можно поподробнее, я просто никогда с этим не сталкивался?
Автор: PuB3
Дата сообщения: 17.11.2011 09:30
Парни выручайте, плз )!
Как разбить игру (15 ГБ) на 2 двухслоки так, чтобы inno на первом диске не просил последний bin файл со второго диска?
т.е. есть две пары архивов:
1.bin, 2.bin, 3.bin, 4.bin - на первом диске
+ 5.bin, 6.bin, 7.bin, 8.bin - на втором диске.


Код: AppId={{9A078EF7-09EF-4435-AF38-BA2700F0F871}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
DefaultDirName={pf}\Call of Duty - Modern Warfare 3
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
LicenseFile=C:\Users\ХХХ\Desktop\Инсталлеры\COD3\eula.rtf
OutputDir=C:\Users\ХХХ\Desktop\COD3
OutputBaseFilename=Setup_COD3
SetupIconFile=C:\Users\ХХХ\Desktop\Инсталлеры\COD3\1.ico
WizardImageFile=C:\Users\ХХХ\Desktop\Инсталлеры\COD3\logo.bmp
Compression=none
SolidCompression=no
DiskSpanning=yes
DiskSliceSize=2100000000
SlicesPerDisk=1
Автор: vint56
Дата сообщения: 17.11.2011 11:47
PuB3 пример
[Setup]
Compression=none
SolidCompression=true
DiskSpanning=true
DiskSliceSize=753663232
SlicesPerDisk=6
Автор: PuB3
Дата сообщения: 17.11.2011 12:28
vint56
Спасибо!

Цитата:
SlicesPerDisk=6
- это оно!!!
Автор: Fantasy22
Дата сообщения: 17.11.2011 14:38
Парни подскажите код для вставки изображений для для каждой секции свой рисунок
Заранее блогодарен
Автор: vint56
Дата сообщения: 17.11.2011 15:52
Fantasy22 вот пример http://rghost.ru/30618501
Автор: byExit
Дата сообщения: 18.11.2011 00:30
Подскажите плиз.
Существует ли возможность реализовать полупрозрачное оформление в IS (не через iswin7.dll) при помощи, скажем, png картинок. (Хотелось бы что-нибудь похожее для XP замутить)
Автор: AtariUser
Дата сообщения: 18.11.2011 16:42
The Elder Scrolls V: Skyrim

Версия скрипта 1.0





Описание:

Скрипт создан по игре TES 5: Skyrim.

Особенности:

- Растянутые картинки;
- Проверка свободного места на жестком диске;
- Is Win 7;
- ISDone 0.6;
- Лого;
- Удаление сохранений и настроек при деинсталляции;
- Измененная страница удаления;
- И так, по мелочам.

Благодарности:
- to Shegorat;
- to nik1967;
- to Profrager;
- to Vo1T;

Скачать:
Ссылка
Автор: Raf_SE
Дата сообщения: 18.11.2011 17:00
Ктонить может написать скрипт, который бы при нахождении в устанавливаемой папке, файла с тем же именем что и у файла который сейчас должен распаковаться, сверял бы количество байт файла в папке, с количеством байт, которое я задал для этого файла, и если значения совпадают, то файл бы не распаковывался?

P.S.
Собстно такой код нужен для использования с улучшенным деинсталлятором UninsHs, чтобы когда пользователь выбрал в нем "Изменить" или "Восстановить", то не перезаписывались все файлы, а только измененные.




А реально ли в этом коде сделать так, чтоб выбрав компонент под номером 3, у компонента под номером 5, менялось описание?

[more]
Код:
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl

[CustomMessages]
russian.ComponentsInfoPanel1=Описание
russian.ComponentsInfoPanel2=Наведите курсор мыши на компонент, чтобы прочитать его описание.

[c0de]
type
TComponentDesc = record Description: String; Index: Integer; end;

var
Descs: array of TComponentDesc;
Info: TNewStaticText;
InfoCaption: TNewStaticText;
InfoPanel: TPanel;
Indx: Integer;

procedure ShowDescription(Sender: TObject; X, Y, Index: Integer; Area: TItemArea);
var i: Integer;
begin
Indx:=-1;
for i:= 0 to GetArrayLength(Descs)-1 do begin
if (Descs[i].Index=Index) then begin Indx:=i; Break end; end;
if (Indx >=0)and(Area=iaItem) then Info.Caption:= Descs[Indx].Description else Info.Caption:= ExpandConstant('{cm:ComponentsInfoPanel2}');
end;

procedure AddDescription(AIndex: Integer; ADescription: String);
var i, k: Integer;
begin
i:= GetArrayLength(Descs); SetArrayLength(Descs, i+1);
Descs[i].Description:= ADescription; Descs[i].Index:= AIndex-1
end;

procedure InitializeWizard();
begin
WizardForm.TypesCombo.Visible:=False;
WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top;
WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top;
WizardForm.ComponentsList.Width := ScaleX(200);
WizardForm.ComponentsList.OnItemMouseMove:= @ShowDescription

InfoPanel := TPanel.Create(WizardForm);
InfoPanel.Parent := WizardForm.SelectComponentsPage;
InfoPanel.Caption := '';
InfoPanel.Top := WizardForm.ComponentsList.Top;//ScaleY(12); // поднимает панель, но опускает панель с текстом
InfoPanel.Left := ScaleX(216);
InfoPanel.Width := ScaleX(200);
InfoPanel.Height := WizardForm.ComponentsList.Height; //ScaleY(40);
InfoPanel.BevelInner := bvRaised;
InfoPanel.BevelOuter := bvLowered;
InfoCaption := TNewStaticText.Create(WizardForm);
InfoCaption.Parent := WizardForm.SelectComponentsPage;
InfoCaption.Caption := ExpandConstant('{cm:ComponentsInfoPanel1}');
InfoCaption.Left := ScaleX(224);
InfoCaption.Top := InfoPanel.Top - ScaleY(5); //поднять слово Описание
InfoCaption.Font.Color := clActiveCaption;

Info := TNewStaticText.Create(WizardForm);
Info.Parent := InfoPanel;
Info.AutoSize := False;
Info.Left := ScaleX(6);
Info.Width := ScaleX(188); //шырина текста
Info.Top := ScaleY(12); //Чем больше значение, тем ниже опускаеться полоска текста
Info.Height := WizardForm.ComponentsList.Height - ScaleY(18); //Чем больше значение, тем ниже опускаеться полоска текста
Info.Caption := ExpandConstant('{cm:ComponentsInfoPanel2}');
Info.WordWrap := true;

AddDescription(1, 'Это дополнение выпущенно 31 июля 1998 года. Созданно Aztech New Media. Этот продукт был официально признан Blizzard Entertainment, разработчиком оригинальной игры. Дополнение содержит три кампании, по 10 миссий каждая, и более чем 100 дополнительных карт.123456789'); //первый параметр - это номер компонента, идет последовательно от начала записи компонентов
AddDescription(2, 'Английская справка'); //Второй параметр - это собственно описание компонента
AddDescription(3, 'Русская справка');
AddDescription(4, 'Плагины');
AddDescription(5, 'Внутреннего просмотра');
AddDescription(6, 'Архиваторные');
AddDescription(7, 'Системные');
AddDescription(8, 'CanonCam');
AddDescription(9, 'PluginManager');
AddDescription(10, 'Registry');
AddDescription(11, 'Services');
AddDescription(12, 'StartupGuard');
AddDescription(13, 'Другие');

end;
Автор: troyan90
Дата сообщения: 18.11.2011 19:20
Raf_SE
вот как вариант, может подойдет:
[more]
Код: [_files]
Source: "files\1.zip"; DestDir: "{app}"; Check: install(1588650);
Source: "files\2.zip"; DestDir: "{app}"; Check: install(1237);
Source: "files\3.zip"; DestDir: "{app}"; Check: install(530023);

[_code]
function install(NewFileSize: integer{размер файла в байтах}): boolean;
var
OldFileSize: integer;
begin
if FileExists(ExpandConstant('{app}\' + ExtractFileName(CurrentFileName))) then begin
FileSize(ExpandConstant('{app}\' + ExtractFileName(CurrentFileName)), OldFileSize); {размер файла в устанавливаемой директории}
if OldFileSize = NewFileSize then {сопоставим размер файла в директории с устанавливаемым файлом}
Result:=False {если размер одинаковый то устанавливать не будем}
else Result:=True; {иначе заменим}
end
else Result:=True; {если файл с таким же именем отсутствует в дирректории установке, то полюбому устанавливаем}
end;
Автор: Raf_SE
Дата сообщения: 19.11.2011 03:46
troyan90
Премного благодарен, все работает!

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177

Предыдущая тема: поиск


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