Скрипты Inno Setup. Помощь и советы [часть 5]

Ответить
 • Просмотры: 31
Аватара пользователя
R.i.m.s.k.y.

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение R.i.m.s.k.y. »

Пацаны скажите пожалуйста

1. правильно ли портировал отсюда
http://www.swissdelphicenter.ch/torr...code.php?id=55
нижний Delay (задержку)

2. действительно ли он хорош (работает уж точно, но вот реализация... В общем хотелось бы чтоб кто-нибудь знающий глянул)


читать дальше »




Код:

Код: Выделить всё

[Setup]
AppName=DisksInfo
VersionInfoVersion=5.0
AppVerName=DisksInfo
DefaultDirName={pf}\My program
[  Code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
const
  QS_KEY                  = $0001;
  QS_MOUSEMOVE            = $0002;
  QS_MOUSEBUTTON          = $0004;
  QS_POSTMESSAGE          = $0008;
  QS_TIMER                = $0010;
  QS_PAINT                = $0020;
  QS_SENDMESSAGE          = $0040;
  QS_HOTKEY               = $0080;
  QS_MOUSE = (QS_MOUSEMOVE or QS_MOUSEBUTTON);
  QS_INPUT = (QS_MOUSE or QS_KEY);
  QS_ALLEVENTS = (QS_INPUT or QS_POSTMESSAGE or QS_TIMER or QS_PAINT or QS_HOTKEY);
  QS_ALLINPUT = (QS_INPUT or QS_POSTMESSAGE or QS_TIMER or QS_PAINT or QS_HOTKEY or QS_SENDMESSAGE);
  STATUS_TIMEOUT          = $00000102;
  WAIT_TIMEOUT = STATUS_TIMEOUT;
function MsgWaitForMultipleObjects(nCount: DWORD; var pHandles: THandle; fWaitAll: BOOL; dwMilliseconds, dwWakeMask: DWORD): DWORD; external 'MsgWaitForMultipleObjects@user32.dll stdcall';
function CreateEvent(lpEventAttributes: Longint; bManualReset, bInitialState: BOOL; lpName: PChar): THandle; external 'CreateEvent{#A}@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';
procedure Delay(Milliseconds: Integer); 
var
  dwTick: DWORD;
  hEvent: THandle;
begin
  hEvent := CreateEvent(0, False, False, '');
  try
    dwTick := GetTickCount + DWORD(Milliseconds);
    while (Milliseconds > 0) and (MsgWaitForMultipleObjects(1, hEvent, False, Milliseconds, QS_ALLINPUT)  WAIT_TIMEOUT) do
    begin
      Application.ProcessMessages;
      Milliseconds := dwTick - GetTickCount;
    end;
  finally
    CloseHandle(hEvent);
  end;
end;
procedure InitializeWizard;
begin
  Delay(2000);
end;





наперёд скажу, что обычный Sleep() не подходит, тк мне нужно задержать исчезновение формы на пару секунд, а с ним на ней всё замирает. Решение - код выше

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

alert30,
Цитата alert30:



заголовок окна и отображает в панели задач
Скрипты Inno Setup. Помощь и советы [часть 5]




заголовок окна и имя кнопки в панели задач не взаимосвязаны , меняются отдельно друг от друга 3-мя способами:


читать дальше »




1. путём изменения стандартных констант сообщений



Код:

Код: Выделить всё

[messages]
SetupAppTitle=имя кнопки
SetupWindowTitle=заголовок окна

2. через методы объектов



Код:

Код: Выделить всё

procedure InitializeWizard();
begin
  WizardForm.Caption := 'Заголовок окна';
  Application.Title := 'Имя кнопки';
end;

3. через функцию винды SetWindowText



Код:

Код: Выделить всё

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';
procedure InitializeWizard();
begin
  SetWindowText(WizardForm.Handle, 'Заголовок окна');
  SetWindowText(Application.Handle, 'Имя кнопки');
end;
Аватара пользователя
Raf-9600

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Raf-9600 »

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

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Johny777 »

Raf-9600, конечно, сам так делаю Изображение

вот пример

создай рядом с экзешником инсталла ини файл следующего содержания


читать дальше »




Код:

Код: Выделить всё

[components]
a=yes
b=
c=
d=





код-пример:


читать дальше »




Код:

Код: Выделить всё

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
[Components]
Name: a; Description: a
Name: b; Description: b
Name: c; Description: c
Name: d; Description: d
[  code]
procedure InitializeWizard();
begin
  if FileExists(ExpandConstant('{src}\PreSelector.ini')) then
  with WizardForm.ComponentsList do
  begin
    Checked[Items.IndexOf('a')] := GetIniString('Components', 'a', '', ExpandConstant('{src}\PreSelector.ini')) = 'yes';
    /// отмечаем компонент по индкесу
    /// индекс получаем методом IndexOf('a') Items, который является TStrings;
    /// остальные компонеты по аналогии
  end;
end;





если ини большой, то его лучше парсить классной функцией El Sanchez


читать дальше »




Код:

Код: Выделить всё

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
[  code]
type
    TIniFile = array of record
        Section: String;
        Entries: TStringList;
    end;
function ParseIniFile(const Filename: String): TIniFile;
var
    iFile: TArrayOfString;
    i: Integer;
begin
    if not FileExists(Filename) then Exit;
    SetArrayLength(Result, 0);
    LoadStringsFromFile(Filename, iFile);
    for i := 0 to GetArrayLength(iFile)-1 do
    begin
        //для всех непустых строк, исключая комментарии
        if (iFile[i]  '') and (Copy(iFile[i], 1, 1)  ';') then
        begin
            //если строка является секцией...
            if (Pos('[', iFile[i]) = 1) and (Pos(']', iFile[i]) = Length(iFile[i])) then
            begin
                //...пишем в результат имя секции...
                SetArrayLength(Result, GetArrayLength(Result)+1);
                Result[GetArrayLength(Result)-1].Section := Copy(iFile[i], 2, Length(iFile[i])-2);
            end
                else
            begin
                //...иначе пишем пару параметр/значение
                if TObject(Result[GetArrayLength(Result)-1].Entries) = nil then
                    Result[GetArrayLength(Result)-1].Entries := TStringList.Create;
                Result[GetArrayLength(Result)-1].Entries.Append(iFile[i]);
            end;
        end;
    end;
end;
//своя функция для чтения значений параметров из секций
function GetIniValue(const Section, Key, Default: String; iFile: TIniFile): String;
var
    i, j: Integer;
begin
    Result := Default;
    for i := 0 to GetArrayLength(iFile)-1 do if CompareText(iFile[i].Section, Section) = 0 then
    begin
        for j := 0 to iFile[i].Entries.Count-1 do if CompareText(iFile[i].Entries.Names[j], Key) = 0 then
        begin
            Result := iFile[i].Entries.Values[Key];
            Break;
        end;
        Break;
    end;
end;
procedure InitializeWizard();
var
    iFile: TIniFile;
    i: Integer;
    res: String;
begin
    //парсим ini-файл
    iFile := ParseIniFile('d:\Program Files (x86)\Inno Setup 5\projects\johny777\test.ini');
    //пример 1 - выводим на экран содержимое ini-файла, используя созданную переменную iFile
    for i := 0 to GetArrayLength(iFile)-1 do
        res := res + '[' + iFile[i].Section + ']' + #13#10 + iFile[i].Entries.Text;
    MsgBox(res, mbInformation, MB_OK);
    //пример 2 - выводим на экран значение параметра name34 секции section2, используя созданную переменную iFile и свою функцию GetIniValue
    MsgBox(GetIniValue('section2', 'name34', '', iFile), mbInformation, MB_OK);
end;
Аватара пользователя
Raf-9600

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Raf-9600 »

Johny777, а в чем принципиальное отличие между твоим кодом и махиной от El Sanchez-а?
Аватара пользователя
Johny777

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Johny777 »

Как делают Механики? Они же запаковывают фриарком, файлы извлекаются в {app}, а потом эти архивы удаляются, а остаются извлечённые файлы. Как мне так сделать?
Аватара пользователя
Raf-9600

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Raf-9600 »

Nikish X, по поводу распакования FreeArc-ом делается ISDone, почитай несколько страниц, там есть.



А Вот по поводу удаления архива ARC-а, после распакования FreeArc-ом в инсталляторе,
Скрипты Inno Setup. Помощь и советы [часть 5]
.
Аватара пользователя
Johny777

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Johny777 »

Цитата LinkOFF:



Здравствуйте. Как в инсталляторе сделать проверку целостности игровых архивов перед началом установки?
Скрипты Inno Setup. Помощь и советы [часть 5]




ISMD5 - библиотека для вычисления и сравнения хеш-суммы MD5 файлов с выводом прогресса.





Цитата Nikish X:



Они же запаковывают фриарком, файлы извлекаются в {app}, а потом эти архивы удаляются, а остаются извлечённые файлы.
Скрипты Inno Setup. Помощь и советы [часть 5]




Брр... К чему эти извращения? Для чего копировать архивы в папку назначения и затем удалять их после извлечения? Нужно гораздо больше места для установки, да и время установки увеличивается. Лучше и быстрее извлекать архивы из {src} в {app}.
Аватара пользователя
Raf-9600

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Raf-9600 »

Цитата nik1967:



Брр... К чему эти извращения? Для чего копировать архивы в папку назначения и затем удалять их после извлечения? Нужно гораздо больше места для установки, да и время установки увеличивается. Лучше и быстрее извлекать архивы из {src} в {app}.
Скрипты Inno Setup. Помощь и советы [часть 5]




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

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Johny777 »

Я понял, что тупо паковать архивы в архивы, за это спасибо alert30 и nik1967. Теперь меня интересует как precomp'om всю папку сжать?
Ответить

Вернуться в «Автоматическая установка приложений»