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

Статус
В этой теме нельзя размещать новые ответы.

SeRaph1

Мимокрокодил
День добрый господа.
Появилась проблема такого рода. При работе со скроллбаром компонентлиста, наблюдается изменение цвета текста компонентлиста на ядовито-белый. Как избавиться от этого? Надеюсь на вас целиком и полностью :-[
Код:
var
BorderWidth: Integer;
BGImage: TBitmapImage;
BGImageStream: TMemoryStream;
procedure InitializeWizard;
begin
  BGImageStream := TMemoryStream.Create;
  ExtractTemporaryFileToStream('back.bmp', BGImageStream);
  BGImageStream.Position := 0;
  BGImage := TBitmapImage.Create(WizardForm);
  BGImage.Bitmap.LoadFromStream(BGImageStream);
   with WizardForm.ComponentsList do begin
    Font.Color:=clWhite;
    Font.Size:=8;
    BorderStyle := bsNone;
    Color:= clBlack;
    Font.Name:='Trebuchet MS';
    BorderWidth := (WizardForm.ComponentsList.Width-WizardForm.ComponentsList.ClientWidth) div 2;
    LoadBGBmpFromBitmap(BGImage.Bitmap,  WizardForm.ComponentsList.Left+BorderWidth, WizardForm.ComponentsList.Top+BorderWidth);
  end;
end;[/SPOILER]
 
Последнее редактирование:

sergey3695

Ветеран
Модератор
Как при нажатии правой кнопкой сделать чтобы нажималось системное меню?
Код:
  case Msg of WM_SYSCOMMAND:
  case Msg of WM_NCRBUTTONDOWN: 
begin
if GetCursorPos(pt) and GetWindowRect(hWnd, rt) then
if (pt.x > rt.Left) and (pt.x < rt.Right-WizardForm.Width+1000) and (pt.y > rt.Top) and (pt.y < rt.Bottom-WizardForm.Height+1000) then
begin
  ????????
end;
end;
end;
 

Mailchik

Старожил
Проверенный
sergey3695, получаем системное меню (GetSystemMenu) и отображаем его (TrackPopupMenuEx):
Лишь пример...Подробнее об TrackPopupMenuEx
Дальше нужно добавлять события на нажатия подпунктов этого меню...
[HR][/HR][HR][/HR]Или.. очень простое решение:Если не соответсвует твоему условию, то не вызываем меню (Msg := 0), в обратном случае ничего не делаем, то есть нажатие на правую кнопку выполняется по стандарту. Простое, но лучшее решение.
 

sergey3695

Ветеран
Модератор
Спасибо. Проще забить и не менять ничего. :)
 
Последнее редактирование:

David.D.Rocco

Участник
Проверенный
sergey3695, может не совсем то, но вот пример
Код:
[_Code]
function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall delayload';

procedure OnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var CurPos: TPoint;
begin
  GetCursorPos(CurPos);
  if Button = mbRight then
    SendMessage(WizardForm.Handle, $313, 0, CurPos.x or CurPos.y shl 16);
end;

procedure InitializeWizard();
begin
  with TLabel.Create(WizardForm) do begin
    Parent := WizardForm;
    AutoSize := false;
    SetBounds(0, 0, WizardForm.ClientWidth, WizardForm.ClientHeight);
    OnMouseDown := @OnMouseDown;
  end;
end;
 
Последнее редактирование:

ilzok17

Новичок
Доброго всем здравия.Подскажите пожалуйста что надо прописать в скрипте ,чтобы аудиоплеер не исчезал.Сейчас ситуация такая что панелька появляется,внизу экрана на какое то время,а затем исчезает и появится если только навести курсор на нижнею часть экрана.Хотелось бы чтобы она вообще не исчезала.Вот код:
Код:
Code

const
  Indent=10;

procedure ShowMP3Panel(hMainFrm:HWND;StartVolume:integer;DefMP3Dir,BASSDir,MLabel:PChar;IsShowMP3Info,IsBkgFrmVisible:boolean;ShowTimeMP3Info:integer;dBottom:integer);external 'ShowMP3Panel@files:isgsg.dll stdcall';
procedure KillMP3Panel;external 'KillMP3Panel@files:isgsg.dll stdcall';

function InitializeSetup:boolean;
begin
  ExtractTemporaryFile('Музыка.mp3');
  ExtractTemporaryFile('bass.dll');
  Result:=True;
end;

procedure InitializeWizard;
begin
  ShowMP3Panel(WizardForm.Handle,80,ExpandConstant('{tmp}'),ExpandConstant('{tmp}'),'Sound',False,False,0,Indent);
end;

procedure DeinitializeSetup;
begin
  KillMP3Panel;
end;
 

LexBell

Борода
Супер модератор
ilzok17, это зашито в библиотеке, что-бы мп3 панель исчезала. она появляется когда наводишь мышку на то место, где она находится. Из скрипта с этим ничего не сделаешь.
 

RameR

Новичок
Как сделать, чтобы иконка в верхнем левом углу не отображалась?
 

deaddima

Новичок
Ребят подскажите нубику.
Допустим есть в игре папка audio
Мне необходимо чтобы ресурсы расположенные в папке аудио были скопированы
и помещены в папку mod/audio
А также важно чтобы эти действия происходили до распаковки архивов фриарка.
 

Mailchik

Старожил
Проверенный
deaddima,
Код:
;***************************************************************;
;****************** SHFileOperation.iss ************************;
;***************************************************************;
;* Include this file in project. Example:
;* #include "SHFileOperation.iss"
;***************************************************************;
;************************ 1 ************************************;
;* function CopyDir(const fromDir, toDir: string): Boolean;
;* Example 1 (without <fromDir> trailing backslash):
;*     CopyDir('C:\TMP\MyApp', 'C:\TMP\Backup');
;* Result: C:\TMP\Backup\MyApp\..all <MyApp> subdirs and files
;* Example 2 (with <fromDir> trailing backslash):
;*     CopyDir('C:\TMP\MyApp\', 'C:\TMP\Backup');
;* Result: C:\TMP\Backup\..all <MyApp> subdirs and files
;***************************************************************;
;************************ 2 ************************************;
;* function MoveDir(const fromDir, toDir: string): Boolean;
;* Example 1 (without <fromDir> trailing backslash):
;*     MoveDir('C:\TMP\MyApp', 'C:\TMP\Backup');
;* Result: C:\TMP\Backup\MyApp\..all <MyApp> subdirs and files
;* Example 2 (with <fromDir> trailing backslash):
;*     MoveDir('C:\TMP\MyApp\', 'C:\TMP\Backup');
;* Result: C:\TMP\Backup\..all <MyApp> subdirs and files
;***************************************************************;
;************************ 3 ************************************;
;* function DelDir(dir: string; toRecycle: Boolean): Boolean;
;*   If <toRecycle> is True, <dir> deleted in Recycle Bin.
;***************************************************************;
;************************ 4 ************************************;
;* function RenameDir(const fromDir, toDir: string): Boolean;
;***************************************************************;
;***************************************************************;
;***************************************************************;

[B][[/B]Code]
type
   TSHFileOpStruct =  record
     Wnd: HWND;
     wFunc: UINT;
     pFrom: PAnsiChar;
     pTo: PAnsiChar;
     fFlags: Word; // FILEOP_FLAGS;
     fAnyOperationsAborted: BOOL;
     hNameMappings: HWND; // Pointer;
     lpszProgressTitle: PAnsiChar; { only used if FOF_SIMPLEPROGRESS }
   end;

const
// use in wFunc
   { $EXTERNALSYM FO_MOVE }
   FO_MOVE           = $0001;
   { $EXTERNALSYM FO_COPY }
   FO_COPY           = $0002;
   { $EXTERNALSYM FO_DELETE }
   FO_DELETE         = $0003;
   { $EXTERNALSYM FO_RENAME }
   FO_RENAME         = $0004;
// use in fFlags
   { $EXTERNALSYM FOF_MULTIDESTFILES }
   FOF_MULTIDESTFILES         = $0001;
   { $EXTERNALSYM FOF_CONFIRMMOUSE }
   FOF_CONFIRMMOUSE           = $0002;
   { $EXTERNALSYM FOF_SILENT }
   FOF_SILENT                 = $0004;  { don't create progress/report }
   { $EXTERNALSYM FOF_RENAMEONCOLLISION }
   FOF_RENAMEONCOLLISION      = $0008;
   { $EXTERNALSYM FOF_NOCONFIRMATION }
   FOF_NOCONFIRMATION         = $0010;  { Don't prompt the user. }
   { $EXTERNALSYM FOF_WANTMAPPINGHANDLE }
   FOF_WANTMAPPINGHANDLE      = $0020;  { Fill in
SHFILEOPSTRUCT.hNameMappings
                                          Must be freed using
SHFreeNameMappings }
   { $EXTERNALSYM FOF_ALLOWUNDO }
   FOF_ALLOWUNDO              = $0040;
   { $EXTERNALSYM FOF_FILESONLY }
   FOF_FILESONLY              = $0080;  { on *.*, do only files }
   { $EXTERNALSYM FOF_SIMPLEPROGRESS }
   FOF_SIMPLEPROGRESS         = $0100;  { means don't show names of files }
   { $EXTERNALSYM FOF_NOCONFIRMMKDIR }
   FOF_NOCONFIRMMKDIR         = $0200;  { don't confirm making any
needed dirs }
   { $EXTERNALSYM FOF_NOERRORUI }
   FOF_NOERRORUI              = $0400;  { don't put up error UI }


function SHFileOperation(const lpFileOp: TSHFileOpStruct):Integer;
external 'SHFileOperation@shell32.dll stdcall';

{****************************************************************}
{****************************************************************}
{****************************************************************}

function BackupDir(const fromDir, toDir: string; IsMove: Boolean): Boolean;
var
  fos: TSHFileOpStruct;
  _fromDir, _toDir: string;
  SR: TFindRec;
  res: Boolean;
begin
    ForceDirectories(toDir);
  if IsMove then
    fos.wFunc  := FO_MOVE else
    fos.wFunc  := FO_COPY;
    fos.fFlags := FOF_FILESONLY or FOF_SILENT or
               FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
    _fromDir:= AddBackslash(fromDir);
    _toDir  := AddBackslash(toDir);
  if (Length(fromDir) = Length(_fromDir)) then
    begin
        res:= FindFirst(_fromDir + '*', SR);
      try
        while res do
        begin
          if (SR.Name <> '') and (SR.Name <> '.') and (SR.Name <> '..') then
          begin
            if SR.Attributes = FILE_ATTRIBUTE_DIRECTORY then
              begin
                _fromDir:= _fromDir + SR.Name + #0#0;
                _toDir  := _toDir + #0#0;
                fos.pFrom  := PAnsiChar(_fromDir);
                fos.pTo    := PAnsiChar(_toDir);
              end else
              begin
                _fromDir:= _fromDir + SR.Name + #0#0;
                _toDir  := _toDir   + SR.Name + #0#0;
                fos.pFrom  := PAnsiChar(_fromDir);
                fos.pTo    := PAnsiChar(_toDir);
              end;
                Result := (0 = ShFileOperation(fos));
                _fromDir:= ExtractFilePath(_fromDir);
                _toDir:= ExtractFilePath(_toDir);
          end;
          res := FindNext(SR);
        end;
      finally
        FindClose(SR);
      end;
    end else
    begin
      _fromDir:= RemoveBackslashUnlessRoot(_fromDir) + #0#0;
      _toDir  := RemoveBackslashUnlessRoot(_toDir)   + #0#0;
      fos.pFrom  := PAnsiChar(_fromDir);
      fos.pTo    := PAnsiChar(_toDir);
      Result := (0 = ShFileOperation(fos));
    end;
end;

{****************************************************************}
function MoveDir(const fromDir, toDir: string): Boolean;
begin
  Result := BackupDir(fromDir, toDir, True);
end;

{****************************************************************}
function CopyDir(const fromDir, toDir: string): Boolean;
begin
  Result := BackupDir(fromDir, toDir, False);
end;

{****************************************************************}
function DelDir(dir: string; toRecycle: Boolean): Boolean;
var
  fos: TSHFileOpStruct;
  _dir: string;
begin
    _dir:= RemoveBackslashUnlessRoot(dir) + #0#0;
    fos.wFunc  := FO_DELETE;
    fos.fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
  if toRecycle then
    fos.fFlags := fos.fFlags or FOF_ALLOWUNDO;
    fos.pFrom  := PAnsiChar(_dir);
  Result := (0 = ShFileOperation(fos));
end;

{****************************************************************}
function RenameDir(const fromDir, toDir: string): Boolean;
var
  fos: TSHFileOpStruct;
  _fromDir, _toDir: string;
begin
    _fromDir:= RemoveBackslashUnlessRoot(fromDir) + #0#0;
    _toDir  := RemoveBackslashUnlessRoot(toDir) + #0#0;
    fos.wFunc  := FO_RENAME;
    fos.fFlags := FOF_FILESONLY or FOF_ALLOWUNDO or
              FOF_SILENT or FOF_NOCONFIRMATION;
    fos.pFrom  := PAnsiChar(_fromDir);
    fos.pTo    := PAnsiChar(_toDir);
  Result := (0 = ShFileOperation(fos));
end;
{****************************************************************}
{****************************************************************}
{****************************************************************}
function FilesMaskOperation(const fromDir, toDir, fileMask: string;
         FileOp: Integer; EmptyDirRemove: Boolean; toRecycle: Boolean): Boolean;
var
  fos: TSHFileOpStruct;
  _fromDir, _toDir: string;
  FSR, DSR: TFindRec;
  FindResult: Boolean;
  APath: string;
begin
  APath := AddBackslash(fromDir);
  FindResult := FindFirst(APath + fileMask, FSR);
  try
    while FindResult do
    begin
      if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
        begin
          Case FileOp of
            FO_COPY:
              begin
                fos.wFunc  := FO_COPY;
              end;
            FO_MOVE:
              begin
                fos.wFunc  := FO_MOVE;
              end;
            FO_DELETE:
              begin
                fos.wFunc  := FO_DELETE;
                if toRecycle then fos.fFlags := fos.fFlags or FOF_ALLOWUNDO;
              end;
            FO_RENAME:
              begin
                fos.wFunc  := FO_RENAME;
              end;
          else
            ;
          end;
            fos.fFlags := fos.fFlags or FOF_FILESONLY or FOF_SILENT or
                   FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
            _fromDir:= APath + FSR.Name + #0#0;
            _toDir:= AddBackslash(toDir) + FSR.Name + #0#0;
            ForceDirectories(ExtractFilePath(_toDir));
            fos.pFrom  := PChar(_fromDir);
            fos.pTo    := PChar(_toDir);
            Result := (0 = ShFileOperation(fos));
        end;
      FindResult := FindNext(FSR);
    end;
    FindResult := FindFirst(APath + '*.*', DSR);
    while FindResult do
    begin
      if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and
        not ((DSR.Name = '.') or (DSR.Name = '..')) then
{Recursion} FilesMaskOperation(APath + DSR.Name,
                               AddBackslash(toDir) + DSR.Name,
                               fileMask, FileOp, EmptyDirRemove, toRecycle);
      FindResult := FindNext(DSR);
    end;
  finally
    FindClose(FSR);
    FindClose(DSR);
    if EmptyDirRemove then RemoveDir(APath);
  end;
end;

function CopyFiles(const fromDir, toDir, fileMask: string): Boolean;
begin
  Result := FilesMaskOperation(fromDir, toDir, fileMask,
         FO_COPY, False, False);
end;

function MoveFiles(const fromDir, toDir, fileMask: string): Boolean;
begin
  Result := FilesMaskOperation(fromDir, toDir, fileMask,
         FO_MOVE, True, False);
end;

function DelFiles(const fromDir, fileMask: string; toRecycle: Boolean ): Boolean;
begin
  Result := FilesMaskOperation(fromDir, '', fileMask,
         FO_DELETE, True, toRecycle);
end;
Сохраняете этот код в SHFileOperation.iss файл. Далее включаете этот файл в скрипт: "#include "SHFileOperation.iss"" и до распаковки архивов фриарка пишите:
Код:
CopyDir(ExpandConstant('{app}\audio'), ExpandConstant('{app}\mod'));
[HR][HR][/HR][/HR]RameR, если по простому:
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[B][[/B]Code]
procedure InitializeWizard;
 begin
  with WizardForm do begin
   BorderIcons := [];
  end;
end;
Но в этом не случае, пропадут и системные кнопки на заголовке...

Или же можно просто изменить эту иконку на прозрачную:
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: icon1.ico; Flags: dontcopy

[B][[/B]Code]
#ifdef UNICODE
 #define A "W"
 type
  PChar = PAnsiChar;
#else
 #define A "A"
#endif
function LoadImage(hInst: THandle; ImageName: PChar; ImageType: UINT; X, Y: Integer; Flags: UINT): THandle;
 external 'LoadImage{#A}@user32.dll stdcall delayload';

procedure InitializeWizard;
begin
  ExtractTemporaryFile('icon1.ico');
  SendMessage(WizardForm.Handle, $0080, 0, LoadImage(0, ExpandConstant('{tmp}') + '\icon1.ico', 1, 16, 16, $1010));
end;
Или же скрыть стандартный заголовок и в ручную рисовать свой, рисовать системные кнопки, рисовать текст.. Но на инно такое лучше не творить)
 
Последнее редактирование:

deaddima

Новичок
Изменил.Эту ошибку я до этого получал...но изменения не сохранял.В итоге я начал вставлять не туда куда нужно.Однако снова выскакивает ошибка.Зашел на инноультра скачал сборник скриптов.Нашел SHFileOperation.iss.А ошибка таже
Gnom, Большое спасибо!
 
Последнее редактирование:

LexBell

Борода
Супер модератор
deaddima, А чего она тебе еще напишет? #include "SHFileOperation.iss" перемести выше секции кода. А почему - это твое домашнее задание.

А про PChar давно уже говорилось. В юникодной инно нет такого типа.
в SHFileOperation.iss, в секции кода добавь такое дело:
[SOURCE="iss"]#ifdef UNICODE
type
PChar = PAnsiChar;
#endif[/SOURCE]
И вовсе не та-же. до этого совершенно другие скрины были.
 
Последнее редактирование:

MAKS_MAFIA

Новичок
Подскажите пожалуйста
Как сделать так чтобы я выбрал папку которую нужно установить. А не файлы из нее по отдельности.
 

MAKS_MAFIA

Новичок
А как сделать так чтобы установочные файлы при установке заменялись принудительно
PS. Как убрать выбор компонентов. Оставить только выборочный.
 
Последнее редактирование:

Mailchik

Старожил
Проверенный
MAKS_MAFIA, Пример:
 

RameR

Новичок
Здраствуйте! Столкнулся с такой проблемой: не хочет компилировать с артиклем в caption...А название Assassin's Creed без артикля как-то не ахти смотрится...

WelcomeLabel2.Caption := 'Добро пожаловать! Вас приветствует мастер установки игры Assassin's Creed III.';

Можно ли в caption запихать переменную типа AppName или %1 (в messages это типа переменной)...
В голову приходит только править сам Russian.isl...
 

Adil

Старожил
Здраствуйте! Столкнулся с такой проблемой: не хочет компилировать с артиклем в caption...А название Assassin's Creed без артикля как-то не ахти смотрится...

WelcomeLabel2.Caption := 'Добро пожаловать! Вас приветствует мастер установки игры Assassin's Creed III.';

Можно ли в caption запихать переменную типа AppName или %1 (в messages это типа переменной)...
В голову приходит только править сам Russian.isl...
Никогда не ставьте знак ', почему то инно ругается на него
 

Mailchik

Старожил
Проверенный
RameR, Adil,
Код:
WelcomeLabel1.Caption := 'Добро пожаловать! Вас приветствует мастер установки игры Assassin''s Creed III.';
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху