botva2

DLL botva2 0.9.9.156

Нет прав для скачивания

zavul0n

Новичок
Аким, штатными средствами - никак. Я юзаю такой костыль:
Создаешь кнопку
Создаешь панель
Вешаешь картинки (если нужно)
На панели создаешь компонент-лист из радиобатонов (предварительно добавив новый класс clbAddRadioBtnItem, где для RadioBtnImg ты будешь использовать прозрачную картинку 1x8)
На кнопку вешаешь событие отображения панели
На окно инсталла и выбор компонента вешаешь событие скрытия панели


еще вариант - полностью свой компонент
Ага, вот бы кто еще научил писать свои компоненты :D
 

Аким

Новичок
zavul0n, Эх, как жеж это муторно. :(
Вот бы добрый автор прикрутил бы ComboBox в ботву... :$
 

zavul0n

Новичок
Блин. Как плохо, что нельзя родителя задать для чекбокса. А то если в реальном времени добавлять - всегда в конец добавляется. :(
 

Le9ent

Новичок
Доброго времени суток уважаемые пользователи.
Хотел бы обратиться к автору South

Дело вот в чем, многие пользователи стали жаловаться на сам файл библиотеки botva2.dll
Использую крайнюю версию 0.9.9.156

Так вот в чем проблема заключается, многие начали репортить о блокировке установщика на моменте инициализации (в тот момент когда мы выгружаем ddl-ку во временную директорию). Блокируют его работу различные антивирусы (в основном Symantec Endpoint Protection).

Крайняя версия библиотеки проходящая проверку под номером 0.9.7.151
Возможно ли обновить актуальную версию библиотеки с фиксом для распознавания антивирусами.
 
Последнее редактирование:

ChiffaFox

Мимокрокодил
Привет всем! Скажите, пожалуйста, можно ли каким-то образом прицепить к чекбоксу, созданному через CheckBoxCreate(), событие OnClick? Или иным способом получить возможность реагировать на изменение состояния чекбокса, т.е. если его чекнули - выполнить какой-то код.
Интуиция подсказывает, что для этого может пригодиться функция CheckBoxSetEvent(), но непонятно, как ей пользоваться. :(
 

Krinkels

Он где то тут
Администратор
Для чекбоксов делаем по аналогии с кнопками:
Код:
procedure BtnClick(hBtn:HWND);
begin
// Какой то код
end;

procedure BtnSetEvent(h :HWND; EventID :integer; Event :Longword); external 'BtnSetEvent@{tmp}\botva2.dll stdcall delayload';
//устанавливает событие для кнопки
//h       - хэндл кнопки (результат возвращенный BtnCreate)
//EventID - идентификатор события, заданный константами   BtnClickEventID, BtnMouseEnterEventID, BtnMouseLeaveEventID, BtnMouseMoveEventID
//Event   - адрес процедуры выполняемой при наступлении указанного события
//пример использования - BtnSetEvent(hBtn, BtnClickEventID, WrapBtnCallback(@BtnClick,1));
 

Nemko

Дилетант
Модератор
ChiffaFox, вот пример, с выводом сообщения на экран (возможно поможет):

Код:
#include "Modules\botva2.iss"

[Setup]
AppName=botva2 by South.Tver
AppVerName=botva2 by South.Tver
DefaultDirName={sd}\botva2 by South.Tver

[Files]
Source: Files\*; Flags: dontcopy

[Code]
var
  Test: hWnd;

function InitializeSetup:boolean;
begin
  if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
  Result:=True;
end;

procedure BtnClick(h: hWnd);
begin
  if CheckBoxGetChecked(Test) then MsgBox('Какое-то действие.', mbInformation, MB_OK) else
  MsgBox('Противоположное действие.', mbInformation, MB_OK);
end;

procedure InitializeWizard;
begin
  WizardForm.OuterNotebook.Hide; WizardForm.InnerNotebook.Hide; WizardForm.NextButton.Width:=0; WizardForm.Bevel.Hide;

  Test:=CheckBoxCreate(WizardForm.Handle, 100, 100, 200, 25, 'CheckBox.png', 0, 4)
  CheckBoxSetEvent(Test, 1, CallBackAddr('BtnClick'));
  CheckBoxSetText(Test, 'Проверка');
end;

P.S.: Krinkels все правильно написал (не хочу задеть), просто решил дополнить проверкой на выбор (Checked).
 

ChiffaFox

Мимокрокодил
И ещё один вопрос - есть ли возможность прикрутить tooltip к контролу, созданному через ботву? Просто всплывающая подсказка с расширенным описанием действия контрола, текстовая строка безо всяких рюшечек?
 

Nemko

Дилетант
Модератор
ChiffaFox, не знаю как прикрутить Hint'ы к элементам botva2, на ум пришел один "костыль":

Код:
#include "Modules\botva2.iss"

[Setup]
AppName=Тест
AppVerName=Тест
DefaultDirName={sd}\Тест

[Custommessages]
HintText=Подсказка:%nДанный компонент ничего не делает%nи не выполняет.

[Files]
Source: Files\*; Flags: dontcopy

[Code]
var
  Test: hWnd;
  HintLabel: TLabel;
  HintShape: TShape;
  aLeft, aTop, aWidth, aHeight: Integer;
  lbWidth, lbHeight: Integer;

function InitializeSetup:boolean;
begin
  if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
  Result:=True;
end;

procedure HintVisable(aVisable: Boolean);
begin
  HintLabel.Visible:=aVisable;
  HintShape.Visible:=aVisable;
end;

procedure CheckBoxEnter(Sender: hWnd);
begin
case Sender of
  Test: HintVisable(True);
 end;
end;

procedure CheckBoxLeave(Sender: hWnd);
begin
case Sender of
  Test: HintVisable(False);
 end;
end;

procedure InitializeWizard;
begin
WizardForm.OuterNotebook.Hide;WizardForm.InnerNotebook.Hide;WizardForm.NextButton.Width:=0;WizardForm.Bevel.Hide;

Test:=CheckBoxCreate(WizardForm.Handle, ScaleX(100), ScaleY(100), ScaleX(80), ScaleY(25), 'CheckBox.png', 0, 4)
CheckBoxSetEvent(Test, BtnMouseEnterEventID, CallBackAddr('CheckBoxEnter'));
CheckBoxSetEvent(Test, BtnMouseLeaveEventID, CallBackAddr('CheckBoxLeave'));
CheckBoxGetPosition(Test, aLeft, aTop, aWidth, aHeight);
CheckBoxSetText(Test, 'Проверка');

HintShape:=TShape.Create(WizardForm);
with HintShape do
begin
  Parent:=WizardForm;
end;

HintLabel:=TLabel.Create(WizardForm);
with HintLabel do
begin
  Parent:=WizardForm;
  Left:=ScaleX(100+aWidth+4);
  Top:=ScaleY(100+aHeight+2);
  Caption:=CustomMessage('HintText');
end;
  lbWidth:=HintLabel.Width;
  lbHeight:=HintLabel.Height;
  HintShape.SetBounds(ScaleX(aLeft+aWidth), ScaleY(aTop+aHeight), ScaleX(lbWidth+8), ScaleY(lbHeight+4));
  HintVisable(False);
end;

procedure DeinitializeSetup;
begin
  gdipShutdown;
end;
 

Awalder

Новичок
Всем привет! Подскажите, возможно ли на клик кнопки выводить описание с прокруткой текста скроллом? (мануалы) Спасибо!
 

Nemko

Дилетант
Модератор
Awalder, через ботву не знаю, могу только это предложить, с помощью окна и просто загрузка из файла, да и не совсем понятно что нужно-то конкретно(наверно я старею и тупею), но надеюсь что это:

Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
var
  Buttons: array [1..3] of TNewButton;
  TextBuf: AnsiString;
  MemoText: TNewMemo;
  i: integer;

procedure ButonsLoadText(Sender: TObject);
var
  i: integer;
begin
for i:=1 to Length(Buttons) do begin
case Sender of
  Buttons[i]: begin
    if not FileExists(ExpandConstant('{src}\'+IntToStr(i)+'.txt')) then MemoText.Text:='Отсутствует файл: '+IntToStr(i)+'.txt'+'. (рядом с исполнительным файлом)' else begin
    LoadStringFromFile(ExpandConstant('{src}\'+IntToStr(i)+'.txt'), TextBuf);
    MemoText.Text:=TextBuf;
    end;
   end;
  end;
 end;
end;

procedure InitializeWizard;
begin
  WizardForm.InnerNotebook.Hide;WizardForm.OuterNotebook.Hide;WizardForm.Bevel.Hide;WizardForm.NextButton.Width:=0;

for i:=1 to 3 do begin
Buttons[i]:=TNewButton.Create(WizardForm);
with Buttons[i] do begin
  Parent:=WizardForm;
  SetBounds(ScaleX(10), ScaleY(i*25-15), ScaleX(75), ScaleY(25));
  Caption:='Монуал'+' '+InttoStr(i);
  OnClick:=@ButonsLoadText;
 end;
end;

MemoText:=TNewMemo.Create(WizardForm);
with MemoText do begin
  Parent:=WizardForm;
  SetBounds(ScaleX(Buttons[1].Left+84), ScaleY(Buttons[1].Top), ScaleX(390), ScaleY(300));
  ScrollBars:=ssVertical;
end;
end;
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
var
  Buttons: array [1..3] of TNewButton;
  BtnExit: TButton;
  FormInfo: TSetupForm;
  TextBuf: AnsiString;
  MemoText: TNewMemo;
  i: integer;

procedure FormClose(Sender: TObject; var Action: TCloseAction);
begin
  WizardForm.Enabled:=true;
end;

procedure ButonsCloseForm(Sender: TObject);
begin
  FormInfo.Close;
end;

procedure ButonsLoadText(Sender: TObject);
var
  i: integer;
begin
for i:=1 to Length(Buttons) do begin
case Sender of
  Buttons[i]: begin
    FormInfo.Show;
    if not FileExists(ExpandConstant('{src}\'+IntToStr(i)+'.txt')) then MemoText.Text:='Отсутствует файл: '+IntToStr(i)+'.txt'+'. (рядом с исполнительным файлом)' else begin
    LoadStringFromFile(ExpandConstant('{src}\'+IntToStr(i)+'.txt'), TextBuf);
    MemoText.Text:=TextBuf;
    end;
   end;
  end;
 end;
end;

procedure InitializeWizard;
begin
  WizardForm.InnerNotebook.Hide;WizardForm.OuterNotebook.Hide;WizardForm.Bevel.Hide;WizardForm.NextButton.Width:=0;

for i:=1 to 3 do begin
Buttons[i]:=TNewButton.Create(WizardForm);
with Buttons[i] do begin
  Parent:=WizardForm;
  SetBounds(ScaleX(10), ScaleY(i*25-15), ScaleX(75), ScaleY(25));
  Caption:='Монуал'+' '+InttoStr(i);
  OnClick:=@ButonsLoadText;
  end;
end;

 FormInfo:=CreateCustomForm();
with FormInfo do
begin
  ClientWidth:=354;
  ClientHeight:=324;
  OnClose:=@FormClose;
  CenterInsideControl(WizardForm, True);
end;

MemoText:=TNewMemo.Create(FormInfo);
with MemoText do
begin
  Parent:=FormInfo;
  SetBounds(ScaleX(5), ScaleY(5), ScaleX(345), ScaleY(280));
  ScrollBars:=ssVertical;
  FormInfo.Close;
end;

BtnExit:=TButton.Create(FormInfo);
with BtnExit do
begin
  Parent:=FormInfo;
  SetBounds(ScaleX(5), ScaleY(294), ScaleX(345), ScaleY(24));
  Caption:='Закрыть';
  OnClick:=@ButonsCloseForm;
end;
end;
 

vint56

Ветеран
Проверенный
Anna,
#include "Modules\botva2.iss"

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: InstallFiles\*; Flags: dontcopy sortfilesbyextension

Код:
var
  Edit: Longint;

function InitializeSetup: Boolean;
begin
  if not FileExists(ExpandConstant('{tmp}\b2p.dll')) then
    ExtractTemporaryFile('b2p.dll');
  if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then
    ExtractTemporaryFile('botva2.dll');
  if not FileExists(ExpandConstant('{tmp}\CallbackCtrl.dll')) then
    ExtractTemporaryFile('CallbackCtrl.dll');
  Result:=True;
end;

procedure InitializeWizard();
begin
    with WizardForm do begin
    ClientWidth:=ScaleX(829);
    ClientHeight:=ScaleY(435);
    InnerNotebook.Hide;
    OuterNotebook.Hide;
    Bevel.Hide;
   
  end;
  ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\fon.png'),0,0,WizardForm.Width,WizardForm.Height,True,True);  // названия просто картинка загружается
  Edit:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}\Edit.png'),ScaleX(150), ScaleY(205),ScaleX(460),ScaleY(22),True,True); //  с названием  Edit
  ImgApplyChanges(WizardForm.Handle);
end;

procedure HideComponents;
begin
  ImgSetVisibility(Edit, False); // скрываем изображения  False
end;

procedure ShowComponents(CurPageID: integer);
begin
  HideComponents;
  case CurPageID of
  wpWelcome:
  begin
  end;
  wpSelectDir: begin
  ImgSetVisibility(Edit, True); // Показываем изображения True
 end;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  HideComponents;
  ShowComponents(CurPageID);
  ImgApplyChanges(WizardForm.Handle);
end;

procedure DeinitializeSetup();
begin
gdipShutdown;
end;
[/SPOILER]



и в моем примере там есть косяк не большой
было так
function InitializeSetup: Boolean;
begin
#ifdef Skin
if not FileExists(ExpandConstant('{tmp}\b2p.dll')) then
ExtractTemporaryFile('b2p.dll');
if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then
ExtractTemporaryFile('botva2.dll');
if not FileExists(ExpandConstant('{tmp}\CallbackCtrl.dll')) then
ExtractTemporaryFile('CallbackCtrl.dll');
if not FileExists(ExpandConstant('{tmp}\ISSkin.dll')) then ExtractTemporaryFile('ISSkin.dll');
if not FileExists(ExpandConstant('{tmp}\{#Styles}')) then ExtractTemporaryFile('{#Styles}');
LoadSkin(ExpandConstant('{tmp}\{#Styles}'), '');
#endif
Result:=True;
end;
а надо так
function InitializeSetup: Boolean;
begin
if not FileExists(ExpandConstant('{tmp}\b2p.dll')) then
ExtractTemporaryFile('b2p.dll');
if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then
ExtractTemporaryFile('botva2.dll');
if not FileExists(ExpandConstant('{tmp}\CallbackCtrl.dll')) then
ExtractTemporaryFile('CallbackCtrl.dll');
#ifdef Skin
if not FileExists(ExpandConstant('{tmp}\ISSkin.dll')) then ExtractTemporaryFile('ISSkin.dll');
if not FileExists(ExpandConstant('{tmp}\{#Styles}')) then ExtractTemporaryFile('{#Styles}');
LoadSkin(ExpandConstant('{tmp}\{#Styles}'), '');
#endif
Result:=True;
end;
 

Darksoul

Новичок
Всем привет, вопрос по радиобаттонам, которые выводятся с помощью скрипта из примером (дополненного функциями по надобности) и самой последней библы ботвы. Теперь кратко суть проблемы (в тестовом варианте, ибо немогу допереть, как объяснить что не так, уж простите). Представьте список компонентов на нескольких листах, выводимых с помощью ботвы, с компонентами и подкомпонентами, которые являются радиобаттонами.
Пример (компоненты расположены на одной странице, страниц для примера 6):
Компонент 1 - чекбокс W
Подкомпонент компонента №1 - радиобаттон A
Подкомпонент компонента №2 - радиобаттон B
Компонент 2 -чекбокс S
Подкомпонент компонента №2 - радиобаттон C
Подкомпонент компонента №2 - радиобаттон D

Что нужно от библиотеки со скриптом чеклистбокса: чтобы если выбран чекбокс W и, например, радиобаттон A, а потом чекбокс S, и радиобаттон С к примеру, то выбранными оставались все ВЫБРАННЫЕ пользователем чекбоксы и радиобаттоны.

Что получается сейчас: если сделать выбор, как в примере выше, в итоге получится, что тот радиобаттон, который выбрали первым, останется неактивным, и так по всему списку, тоесть если выбрать радиобаттон в следующем компоненте, то выбранный радиобаттон в предыдущем компоненте становится неактивным почему-то, пробовал всякое, не получается поправить, помогите кто нибудь пожалуйста. Скрипт чеклистбокса, и пример кода с прописанными компонентами прилагаю ниже:

Код:
clbAddChkBoxItem(List[0], 'CheckBox03', 'Карусель танков', 0, False);
    clbAddChkBoxItem(List[0], 'CheckBoxA13',  'Карусель танков в три ряда', 1, False);
    clbAddChkBoxItem(List[0], 'CheckBoxA14',  'Карусель Смайл', 1, False);
    clbAddRadioBtnItem(List[0], 'RadioButtonA15',  'Карусель танков прозрачная P.S.Enot', 1, False, 2);
    clbAddRadioBtnItem(List[0], 'RadioButtonA16',  'Карусель танков от игрока НЕКРОМАНТ', 1, False, 2);

   clbAddChkBoxItem(List[0], 'CheckBox04', 'Маркеры смерти', 0, False);
    clbAddRadioBtnItem(List[0], 'RadioButtonA17',  'Маркеры смерти P.S.Enot', 1, False, 2);
    clbAddRadioBtnItem(List[0], 'RadioButtonA18',  'Маркеры смерти Anatoly TT', 1, False, 2);
    clbAddRadioBtnItem(List[0], 'RadioButtonA19',  'Маркеры смерти EXPROMT', 1, False, 2);
 

Вложения

Darksoul

Новичок
Спс, помогло, я почему-то подумал, что последний параметр отвечает за другое немного, ибо нумерацию подбирал с 0 , потом с 1 и тд, спс большое за помощь.
 

Darthame

Новичок
Здравствуйте, при создании инсталлятора я столкнулся с проблемой. Мне нужно сделать несколько кастомных страниц с выбором компонентов, а также с превью и описанием компонентов, желательно через botva2. Кто-нибудь знает, как это можно реализовать?
 
Сверху