1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

Вопрос Создать новый компонент лист

Тема в разделе "Inno Setup", создана пользователем Хамик, 11 май 2014.

  1. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    Приведите, пожалуйста, пример как создать вручную такой компонент лист как в секции [Components], но не используя саму секцию?
     
  2. Тех. админ Администратор

    Регистрация:
    26 дек 2011
    Сообщения:
    514
    Симпатии:
    601
    Пол:
    Мужской
    Код (Text):
    [Setup]
    AppName=Моя программа
    AppVersion=1.5
    DefaultDirName={pf}\Моя программа

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

    [CustomMessages]
    RU.CompSubtitlesLng=Язык субтитров
    RU.CompVoiceLng=Язык озвучки
    RU.CompRussian=Русский
    RU.CompEnglish=Английский

    [Code]
    var
      ComponentsPage: TWizardPage;
      SelectComponentsLabel: TNewStaticText;
      ComponentsList: TNewCheckListBox;

    procedure RedesignWizardForm;
    begin
      ComponentsPage := CreateCustomPage(wpWelcome, SetupMessage(msgWizardSelectComponents), SetupMessage(msgSelectComponentsDesc));

      { SelectComponentsLabel }
      SelectComponentsLabel := TNewStaticText.Create(WizardForm);
      with SelectComponentsLabel do
      begin
        Parent := ComponentsPage.Surface;
        SetBounds(ScaleX(0), ScaleY(0), ScaleX(417), ScaleY(42));
        AutoSize := False;
        WordWrap := True;
        Caption := SetupMessage(msgSelectComponentsLabel2);
      end;

      { ComponentsList }
      ComponentsList := TNewCheckListBox.Create(WizardForm);
      with ComponentsList do
      begin
        Parent := ComponentsPage.Surface;
        SetBounds(ScaleX(0), ScaleY(61), ScaleX(417), ScaleY(169));
        AddCheckBox(CustomMessage('CompSubtitlesLng'), '', 0, True, False, False, True, nil);
          AddRadioButton(CustomMessage('CompRussian'), '', 1, True, True, nil);
          AddRadioButton(CustomMessage('CompEnglish'), '', 1, False, True, nil);
        AddCheckBox(CustomMessage('CompVoiceLng'), '', 0, True, False, False, True, nil);
          AddRadioButton(CustomMessage('CompRussian'), '', 1, True, True, nil);
          AddRadioButton(CustomMessage('CompEnglish'), '', 1, False, True, nil);
      end;
    end;

    procedure InitializeWizard();
    begin
      RedesignWizardForm;
    end;
     
    Хамик нравится это.
  3. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    YURSHAT, Что теперь нужно указывать в секции [Files] чтобы связать данный компонент лист с соответствующими файлами?
     
  4. Тех. админ Администратор

    Регистрация:
    26 дек 2011
    Сообщения:
    514
    Симпатии:
    601
    Пол:
    Мужской
    Хамик, ну самый простой вариант проверка по индексу. Нумерация начинается с нуля
    Код (Text):
    [Setup]
    AppName=Моя программа
    AppVersion=1.5
    DefaultDirName={pf}\Моя программа

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

    [CustomMessages]
    RU.CompSubtitlesLng=Язык субтитров
    RU.CompVoiceLng=Язык озвучки
    RU.CompRussian=Русский
    RU.CompEnglish=Английский

    [Files]
    Source: "compiler:Languages\Russian.isl"; DestDir: "{app}"; DestName: "TextRussian.isl"; Check: IsComponent(1)
    Source: "compiler:Default.isl"; DestDir: "{app}"; DestName: "TextEnglish.isl"; Check: IsComponent(2)
    Source: "compiler:Languages\Russian.isl"; DestDir: "{app}"; DestName: "VoiceRussian.isl"; Check: IsComponent(4)
    Source: "compiler:Default.isl"; DestDir: "{app}"; DestName: "VoiceEnglish.isl"; Check: IsComponent(5)

    [Code]
    var
      ComponentsPage: TWizardPage;
      SelectComponentsLabel: TNewStaticText;
      ComponentsList: TNewCheckListBox;

    procedure RedesignWizardForm;
    begin
      ComponentsPage := CreateCustomPage(wpWelcome, SetupMessage(msgWizardSelectComponents), SetupMessage(msgSelectComponentsDesc));

      { SelectComponentsLabel }
      SelectComponentsLabel := TNewStaticText.Create(WizardForm);
      with SelectComponentsLabel do
      begin
        Parent := ComponentsPage.Surface;
        SetBounds(ScaleX(0), ScaleY(0), ScaleX(417), ScaleY(42));
        AutoSize := False;
        WordWrap := True;
        Caption := SetupMessage(msgSelectComponentsLabel2);
      end;

      { ComponentsList }
      ComponentsList := TNewCheckListBox.Create(WizardForm);
      with ComponentsList do
      begin
        Parent := ComponentsPage.Surface;
        SetBounds(ScaleX(0), ScaleY(61), ScaleX(417), ScaleY(169));
        AddCheckBox(CustomMessage('CompSubtitlesLng'), '', 0, True, False, False, True, nil);
          AddRadioButton(CustomMessage('CompRussian'), '', 1, True, True, nil);
          AddRadioButton(CustomMessage('CompEnglish'), '', 1, False, True, nil);
        AddCheckBox(CustomMessage('CompVoiceLng'), '', 0, True, False, False, True, nil);
          AddRadioButton(CustomMessage('CompRussian'), '', 1, True, True, nil);
          AddRadioButton(CustomMessage('CompEnglish'), '', 1, False, True, nil);
      end;
    end;

    function IsComponent(CompIndex: Integer): Boolean;
    var
      i: Integer;
    begin
      Result := False;
      for i := 0 to ComponentsList.ItemCount - 1 do
      begin
        if CompIndex <= (ComponentsList.ItemCount - 1) then
          Result := ComponentsList.Checked[CompIndex];
      end;
    end;

    procedure InitializeWizard();
    begin
      RedesignWizardForm;
    end;
     
    AtotIK и Хамик нравится это.
  5. Ветеран

    Регистрация:
    2 май 2014
    Сообщения:
    37
    Симпатии:
    3
    Пол:
    Мужской
    YURSHAT, а можно к Вашему примеру ещё добавить отображение картинок-описания из FAQ? Уж больно хороший скрипт получился там, нет "моргания" изображений при движении мыши как в других примерах. Буду очень благодарен за "адаптацию".
     
  6. Тех. админ Администратор

    Регистрация:
    26 дек 2011
    Сообщения:
    514
    Симпатии:
    601
    Пол:
    Мужской
    Конечно можно :)
     

    Вложения:

    Хамик и AtotIK нравится это.
  7. Ветеран

    Регистрация:
    2 май 2014
    Сообщения:
    37
    Симпатии:
    3
    Пол:
    Мужской
    YURSHAT, это просто божественно! Спасибо Вам огромное! А сможете помочь ещё и с этим?
     
  8. Пользователь

    Регистрация:
    12 окт 2013
    Сообщения:
    78
    Симпатии:
    1
    Привет. Смотрите, в игре смена языка в меню (субтитры), а так же есть строчка в реестре, где можно изменить язык. По дефолту в реестре прописано eng, но если к примеру поменять на fra или deu то в меню игры вместо букв написан бред. Если ставить обратно на eng - все нормально. В чем может быть проблема?
     
  9. Пользователь

    Регистрация:
    29 дек 2014
    Сообщения:
    8
    Симпатии:
    0
    Люди добрые, поможИте кто чем можете... Пытались разделить на две страницы вот этот пример:
    но ничего не выходит :unknown:
     

    Вложения:

    • Script.zip
      Размер файла:
      570 КБ
      Просмотров:
      24
  10. Ветеран

    Регистрация:
    22 авг 2012
    Сообщения:
    60
    Симпатии:
    12
    Пол:
    Мужской
    1. Отсутствие файлов локализации.
    2. Кривые руки
    3. Отсутствие шрифтов
    4. Если бред - значит не делай в компонентах выбор данного языка.
     
  11. Пользователь

    Регистрация:
    5 янв 2014
    Сообщения:
    31
    Симпатии:
    0
    А можно ли к этому примеру добавить прозрачность для компонент листа через bmp картинку?
     
  12. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    Tjeyn, через bmp никак.
     
  13. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    896
    Симпатии:
    613
    Хамик, не смеши. мне влом. готового примера под рукой нету. (LoadBGBmpFromBitmap).
     
  14. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    Прозрачность???
     
  15. Пользователь

    Регистрация:
    9 авг 2014
    Сообщения:
    99
    Симпатии:
    5
    Пол:
    Мужской
    [Files]
    Source: dll\innocallback.dll; Flags: dontcopy
    DestName: "подложка для компонентов.bmp"; Source: "подложка для компонентов.bmp"; Flags: dontcopy solidbreak
    DestName: "подложка для таска.bmp"; Source: "подложка для таска.bmp"; Flags: dontcopy solidbreak
    Код (Text):

    const
      WM_MOUSEWHEEL       = $020A;

      WM_HSCROLL          = $0114;
      WM_VSCROLL          = $0115;

      SB_LINEUP = 0;
      SB_LINELEFT = 0;
      SB_LINEDOWN = 1;
      SB_LINERIGHT = 1;
      SB_PAGEUP = 2;
      SB_PAGELEFT = 2;
      SB_PAGEDOWN = 3;
      SB_PAGERIGHT = 3;
      SB_THUMBPOSITION = 4;
      SB_THUMBTRACK = 5;
      SB_TOP = 6;
      SB_LEFT = 6;
      SB_BOTTOM = 7;
      SB_RIGHT = 7;
      SB_ENDSCROLL = 8;

      GWL_WNDPROC = -4;

    type
      TCallbackProc = function(h:hWnd;Msg,wParam,lParam:Longint):Longint;

    #define A defined(UNICODE) ? "W" : "A"

    function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
    function WndProcCallBack(P:TCallbackProc;ParamCount:integer):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
    function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProc{#A}@user32.dll stdcall';

    var
    ComponentsListFon,TasksListFon: Longint;

    function ComponentsListFons(h: HWND; Msg, wParam, lParam: longint): Longint;
    begin
      if Msg=WM_MOUSEWHEEL then begin
        if wParam > 0 then
          SendMessage(h, WM_VSCROLL, SB_LINEUP, 0);
        if (wParam < 0) then
          SendMessage(h, WM_VSCROLL, SB_LINEDOWN, 0);
        Result:= 0;
      end else
        Result:= CallWindowProc(ComponentsListFon, h, Msg, wParam, lParam);
    end;

    function TasksListFons(h: HWND; Msg, wParam, lParam: longint): Longint;
    begin
      if Msg=WM_MOUSEWHEEL then begin
        if wParam > 0 then
          SendMessage(h, WM_VSCROLL, SB_LINEUP, 0);
        if (wParam < 0) then
          SendMessage(h, WM_VSCROLL, SB_LINEDOWN, 0);
        Result:= 0;
      end else
        Result:= CallWindowProc(TasksListFon, h, Msg, wParam, lParam);
    end;

    procedure FonComponentsTasksList; //InitializeWizard
    begin
    ComponentsListFon:= SetWindowLong(WizardForm.ComponentsList.Handle, GWL_WNDPROC, WndProcCallBack(@ComponentsListFons, 4));
    ExtractTemporaryFile('подложка для компонентов.bmp');
    WizardForm.ComponentsList.LoadBGBmpFromFile(ExpandConstant('{tmp}\подложка для компонентов.bmp'), 0, 0);
    //===============================================================================================================\\
    TasksListFon:= SetWindowLong(WizardForm.TasksList.Handle, GWL_WNDPROC, WndProcCallBack(@TasksListFons, 4));
    ExtractTemporaryFile('подложка для таска.bmp');
    WizardForm.TasksList.LoadBGBmpFromFile(ExpandConstant('{tmp}\подложка для таска.bmp'), 0, 0);
    end;

    procedure FonComponentsTasksListDeinitialize; //DeinitializeSetup
    begin
    SetWindowlong(WizardForm.ComponentsList.Handle, GWL_WNDPROC, ComponentsListFon);
    SetWindowlong(WizardForm.TasksList.Handle, GWL_WNDPROC, TasksListFon);
    end;
    [/SPOILER]
     
  16. Пользователь

    Регистрация:
    5 янв 2014
    Сообщения:
    31
    Симпатии:
    0
    У меня пример то есть но никак не могу реализовать это, там случайно botva2 не нужна?
     
  17. Ветеран

    Регистрация:
    16 сен 2012
    Сообщения:
    312
    Симпатии:
    64
    Пол:
    Мужской
    Хамик,
     

    Вложения:

    • components.rar
      Размер файла:
      70,1 КБ
      Просмотров:
      27
    Tjeyn нравится это.
  18. Пользователь

    Регистрация:
    5 янв 2014
    Сообщения:
    31
    Симпатии:
    0
    Shift85, Спасибо большое!
    А задачи, некоторые из секции Components, а некоторые из Tasks получится завалить в один лист?
     
  19. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    896
    Симпатии:
    613
    Хамик, не прозрачность bmp . тут скорее наложение картинки на компонент лист. тут как бы, догадайка :D
     
    Shift85 нравится это.
  20. Новичок

    Регистрация:
    15 мар 2015
    Сообщения:
    5
    Симпатии:
    0
    YURSHAT,
    а можно ли таким способом картинки показывать в компонентах кастомных
    Код (Text):

    #ifdef UNICODE
        #define A "W"
    #else
        #define A "A"
    #endif

    const
        UNDEF_INDEX = -777;
        ALPHA_BLEND_LEVEL = 128; // max=Byte=255
     
        WS_EX_LAYERED = $80000;
        WS_EX_TRANSPARENT = $100;
        LWA_COLORKEY = 1;
        LWA_ALPHA = 2;
        GWL_EXSTYLE = (20);


    var
        InfoPic: TBitmapImage;
        LastIndex: Integer;
        TempPath: String;
        PicForm: TForm;
     
     
    type
        COLORREF = DWORD;
     

    function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
    function SetLayeredWindowAttributes(Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean; external 'SetLayeredWindowAttributes@user32.dll stdcall';
    function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
    function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
    function SetFocus(hWnd: HWND): HWND; external 'SetFocus@user32.dll stdcall';


    procedure ShowPicHint(const PicFilePath: String);
    var
        pt: TPoint;
    begin
        if not GetCursorPos(pt) then Exit;
        InfoPic.Bitmap.LoadFromFile(PicFilePath);
        try
            with PicForm do
            begin
                SetBounds(ScaleX(0), ScaleY(0), InfoPic.Width, InfoPic.Height);
                SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
                SetLayeredWindowAttributes(Handle, 0, ALPHA_BLEND_LEVEL, LWA_ALPHA);
                Show;
            end;
        finally
            SetFocus(WizardForm.Handle);
        end;
    end;


    procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
    var
        UndefPic: String;
    begin
        if Index = -1 then Exit;
        if Index = LastIndex then Exit;
        try
            case TNewCheckListBox(Sender).ItemCaption[Index] of
                'Half-Life 2':             UndefPic := '23.bmp';
                'Half-Life 2 Episode One': UndefPic := 'Background.bmp';
                'Half-Life 2 Episode Two': UndefPic := 'Background2.bmp';
                'Portal':                  UndefPic := '24.bmp';
            else
                begin
                    LastIndex := UNDEF_INDEX;
                    PicForm.Hide;
                    Exit;
                end;
            end;
            if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
            ShowPicHint(TempPath + UndefPic);
        finally
            LastIndex := Index;
        end;
    end;


    procedure CompOnMouseLeave(Sender: TObject);
    begin
        PicForm.Hide;
    end;


    procedure InitInfo();
    begin
        WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;
        WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;
        TempPath := AddBackslash(ExpandConstant('{tmp}'));
        LastIndex := UNDEF_INDEX;
        PicForm := TForm.Create(WizardForm)
        with PicForm do
        begin
            BorderStyle := bsNone;
            FormStyle := fsStayOnTop;
            InfoPic := TBitmapImage.Create(PicForm)
            with InfoPic do
            begin
                Parent := PicForm;
                AutoSize := True;
            end;
        end;
    end;


    procedure InitializeWizard();
    begin
        InitInfo();
    end;
     

Поделиться этой страницей