Inno Setup Определение клиента

tihiy_don

Старожил
@audiofeel, ну да. Через обычные чекбоксы и радиобаттоны я делал, но там много кода получается, чтобы проходить через все дочерние чекбоксы и отрубать или включать родительский. Надеюсь блакфаер скоро очухается и добавит то что я просил.
 

audiofeel

Старожил
"Привет. Подскажи, пожалуйста, делаю сейчас свой инсталл, похожий на твой, но никак не получается сделать прямоугольник, который ездит по разделам с прозрачностью. Не подскажешь или может дашь свой пример" На втором скриншоте как раз раздел Конфиг XVM подсвечен о чем речь идет.
Посмотреть вложение 9059
Посмотреть вложение 9060
"прямоугольник, который ездит по разделам с прозрачностью" :D
примерно так
customTab.gif
 

Вложения

Последнее редактирование:

hitman797

Новичок
Как это примерно все организовать есть в Example_MainMenu + TreeView.iss
Вы имеете ввиду вот так?
Посмотреть вложение 9064

Скорее всего придется предложить что то добавить автору
Я не знаю как это сделать СЕЙЧАС.
Возможно поможет @hitman797
Ingredients:
1. FTreeView (1).
2. FTreeViewItem (7).
3. FCheckBox (6).

Код:
procedure TForm1.CheckBox1Change(Sender: TObject);
begin
  if CheckBox1.IsChecked then
  begin
    CheckBox3.IsChecked:= True;
    CheckBox4.IsChecked:= True;
  end else
  begin
    CheckBox3.IsChecked:= False;
    CheckBox4.IsChecked:= False;
  end;
end;

procedure TForm1.CheckBox2Change(Sender: TObject);
begin
  if CheckBox2.IsChecked then
  begin
    CheckBox5.IsChecked:= True;
    CheckBox6.IsChecked:= True;
  end else
  begin
    CheckBox5.IsChecked:= False;
    CheckBox6.IsChecked:= False;
  end;
end;

procedure TForm1.CheckBox3Change(Sender: TObject);
begin
  CheckBox1.OnChange:= nil;
  if CheckBox3.IsChecked or CheckBox4.IsChecked then
  begin
    CheckBox1.IsChecked:= True;
  end else
  begin
    CheckBox1.IsChecked:= False;
  end;
  CheckBox1.OnChange:= CheckBox1Change;
end;

procedure TForm1.CheckBox4Change(Sender: TObject);
begin
  CheckBox1.OnChange:= nil;
  if CheckBox3.IsChecked or CheckBox4.IsChecked then
  begin
    CheckBox1.IsChecked:= True;
  end else
  begin
    CheckBox1.IsChecked:= False;
  end;
  CheckBox1.OnChange:= CheckBox1Change;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  TreeView1.ExpandAll;
end;
 
Последнее редактирование:

tihiy_don

Старожил
Ingredients:
1. FTreeView (1).
2. FTreeViewItem (7).
3. FCheckBox (6).

Код:
procedure TForm1.CheckBox1Change(Sender: TObject);
begin
  if CheckBox1.IsChecked then
  begin
    CheckBox3.IsChecked:= True;
    CheckBox4.IsChecked:= True;
  end else
  begin
    CheckBox3.IsChecked:= False;
    CheckBox4.IsChecked:= False;
  end;
end;

procedure TForm1.CheckBox2Change(Sender: TObject);
begin
  if CheckBox2.IsChecked then
  begin
    CheckBox5.IsChecked:= True;
    CheckBox6.IsChecked:= True;
  end else
  begin
    CheckBox5.IsChecked:= False;
    CheckBox6.IsChecked:= False;
  end;
end;

procedure TForm1.CheckBox3Change(Sender: TObject);
begin
  CheckBox1.OnChange:= nil;
  if CheckBox3.IsChecked or CheckBox4.IsChecked then
  begin
    CheckBox1.IsChecked:= True;
  end else
  begin
    CheckBox1.IsChecked:= False;
  end;
  CheckBox1.OnChange:= CheckBox1Change;
end;

procedure TForm1.CheckBox4Change(Sender: TObject);
begin
  CheckBox1.OnChange:= nil;
  if CheckBox3.IsChecked or CheckBox4.IsChecked then
  begin
    CheckBox1.IsChecked:= True;
  end else
  begin
    CheckBox1.IsChecked:= False;
  end;
  CheckBox1.OnChange:= CheckBox1Change;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  TreeView1.ExpandAll;
end;
Спасибо за описания подобного метода. Но думаю всё-таки дождаться улучшения FCheckBoxTree. Так как тут тоже нужно кучу проверок делать :)
 

audiofeel

Старожил
Спасибо за описания подобного метода. Но думаю всё-таки дождаться улучшения FCheckBoxTree. Так как тут тоже нужно кучу проверок делать :)
вы не боитесь количества кода, это ПОКА влияет только на время компиляции. у меня есть примеры и с 0.5 мб, где 129 лейблов и 100 FRectangle
 

tihiy_don

Старожил
@audiofeel, это понятно. Но всё-равно хочется использовать более подходящий для этого компонент. А так конечно тема с FTreeView интересная.
 

hitman797

Новичок
@audiofeel, это понятно. Но всё-равно хочется использовать более подходящий для этого компонент. А так конечно тема с FTreeView интересная.
here is example for TreeView.
copy the file in "FMXInno + SKIA + Blend2D - Final Release [2024-June-10]" folder and compile.
Код:
type
  TCheckBoxTree = record
  Item: FTreeViewItem;
  Box: FCheckBox;
  Btn: FRadioButton;
end;

var
  AForm   : FForm;
  ATreeView: FTreeView;
  CheckBoxTree: array [1..20] of TCheckBoxTree;

procedure FMXInnoInit;
var
  i: Integer;
begin
  AForm   := InitFormHandle;
  ATreeView := InitTreeViewHandle;
  for i:= 1 to 20 do
  begin
    CheckBoxTree[i].Item := InitTreeViewItemHandle;
    CheckBoxTree[i].Box := InitCheckBoxHandle;
    CheckBoxTree[i].Btn := InitRadioButtonHandle;
  end;
end;

function InitializeSetup(): Boolean;
begin
  FMXInnoInit;
  Result := True;
end;

procedure FMXDesigning; forward;

procedure InitializeWizard();
begin
  EmptyWizardForm(False, 640, 480);

  FMXDesigning;
  AForm.Show;
end;

procedure DeinitializeSetup();
begin
  FMXInnoShutDown;
end;

procedure FMXDesigning;
var
  i: Integer;
begin
  AForm.FCreateFluent(WizardForm.Handle, False, False, 0.56, 0);
  if not IsOSMatched(B_WIN11_21H2) then
    AForm.Win10FluentRedrawOnUpdate(True);
  AForm.SetCursor(ExtractAndLoad('Dark.cur'));
  AForm.LoadStyleFromFile(ExtractAndLoad('LightStyle.style'));

  ATreeView.FCreate(AForm.Handle);
  ATreeView.SetBounds(40, 40, 200, 400);
  ATreeView.ItemHeight(20);

  CheckBoxTree[1].Item.FCreate(ATreeView.Handle);
  CheckBoxTree[1].Item.Text('Root 1'); //Root 1

  CheckBoxTree[2].Item.FCreate(ATreeView.Handle);
  CheckBoxTree[2].Item.Text('Root 2'); //Root 2

  CheckBoxTree[3].Item.FCreate(ATreeView.Handle);
  CheckBoxTree[3].Item.Text(''); //Parent 1
  CheckBoxTree[3].Box.FCreate(CheckBoxTree[3].Item.Handle, True, 'Parent 1');
  CheckBoxTree[3].Box.SetBounds(20, 0, 180, 20);

  CheckBoxTree[4].Item.FCreate(ATreeView.Handle);
  CheckBoxTree[4].Item.Text(''); //Parent 2
  CheckBoxTree[4].Box.FCreate(CheckBoxTree[4].Item.Handle, True, 'Parent 2');
  CheckBoxTree[4].Box.SetBounds(20, 0, 180, 20);

  CheckBoxTree[5].Item.FCreate(ATreeView.Handle);
  CheckBoxTree[5].Item.Text(''); //Parent 1
  CheckBoxTree[5].Box.FCreate(CheckBoxTree[5].Item.Handle, True, 'Parent 1');
  CheckBoxTree[5].Box.SetBounds(20, 0, 180, 20);

  CheckBoxTree[6].Item.FCreate(ATreeView.Handle);
  CheckBoxTree[6].Item.Text(''); //Parent 2
  CheckBoxTree[6].Box.FCreate(CheckBoxTree[6].Item.Handle, True, 'Parent 2');
  CheckBoxTree[6].Box.SetBounds(20, 0, 180, 20);

  CheckBoxTree[7].Item.FCreate(ATreeView.Handle);
  CheckBoxTree[7].Item.Text(''); //Child 1
  CheckBoxTree[7].Box.FCreate(CheckBoxTree[7].Item.Handle, True, 'Child 1');
  CheckBoxTree[7].Box.SetBounds(20, 0, 180, 20);

  CheckBoxTree[8].Item.FCreate(ATreeView.Handle);
  CheckBoxTree[8].Item.Text(''); //Child 2
  CheckBoxTree[8].Box.FCreate(CheckBoxTree[8].Item.Handle, True, 'Child 2');
  CheckBoxTree[8].Box.SetBounds(20, 0, 180, 20);

  CheckBoxTree[9].Item.FCreate(ATreeView.Handle);
  CheckBoxTree[9].Item.Text(''); //Child 1
  CheckBoxTree[9].Box.FCreate(CheckBoxTree[9].Item.Handle, True, 'Child 1');
  CheckBoxTree[9].Box.SetBounds(20, 0, 180, 20);

  CheckBoxTree[10].Item.FCreate(ATreeView.Handle);
  CheckBoxTree[10].Item.Text(''); //Child 2
  CheckBoxTree[10].Box.FCreate(CheckBoxTree[10].Item.Handle, True, 'Child 2');
  CheckBoxTree[10].Box.SetBounds(20, 0, 180, 20);

  CheckBoxTree[11].Item.FCreate(ATreeView.Handle);
  CheckBoxTree[11].Item.Text(''); //Child 1
  CheckBoxTree[11].Btn.FCreate(CheckBoxTree[11].Item.Handle, True, 'Child 1');
  CheckBoxTree[11].Btn.SetBounds(20, 0, 180, 20);
  CheckBoxTree[11].Btn.GroupName('Parent 1');

  CheckBoxTree[12].Item.FCreate(ATreeView.Handle);
  CheckBoxTree[12].Item.Text(''); //Child 2
  CheckBoxTree[12].Btn.FCreate(CheckBoxTree[12].Item.Handle, False, 'Child 2');
  CheckBoxTree[12].Btn.SetBounds(20, 0, 180, 20);
  CheckBoxTree[12].Btn.GroupName('Parent 1');

  CheckBoxTree[13].Item.FCreate(ATreeView.Handle);
  CheckBoxTree[13].Item.Text(''); //Child 1
  CheckBoxTree[13].Btn.FCreate(CheckBoxTree[13].Item.Handle, False, 'Child 1');
  CheckBoxTree[13].Btn.SetBounds(20, 0, 180, 20);
  CheckBoxTree[13].Btn.GroupName('Parent 2');

  CheckBoxTree[14].Item.FCreate(ATreeView.Handle);
  CheckBoxTree[14].Item.Text(''); //Child 2
  CheckBoxTree[14].Btn.FCreate(CheckBoxTree[14].Item.Handle, True, 'Child 2');
  CheckBoxTree[14].Btn.SetBounds(20, 0, 180, 20);
  CheckBoxTree[14].Btn.GroupName('Parent 2');

  // AddRoot
  ATreeView.AddItem(CheckBoxTree[1].Item.Handle);
  ATreeView.AddItem(CheckBoxTree[2].Item.Handle);
  // AddParent
  CheckBoxTree[1].Item.AddItem(CheckBoxTree[3].Item.Handle);
  CheckBoxTree[1].Item.AddItem(CheckBoxTree[4].Item.Handle);
  CheckBoxTree[2].Item.AddItem(CheckBoxTree[5].Item.Handle);
  CheckBoxTree[2].Item.AddItem(CheckBoxTree[6].Item.Handle);
  // AddChild
  CheckBoxTree[3].Item.AddItem(CheckBoxTree[7].Item.Handle);
  CheckBoxTree[3].Item.AddItem(CheckBoxTree[8].Item.Handle);
  CheckBoxTree[4].Item.AddItem(CheckBoxTree[9].Item.Handle);
  CheckBoxTree[4].Item.AddItem(CheckBoxTree[10].Item.Handle);
  // AddChild 2
  CheckBoxTree[5].Item.AddItem(CheckBoxTree[11].Item.Handle);
  CheckBoxTree[5].Item.AddItem(CheckBoxTree[12].Item.Handle);
  CheckBoxTree[6].Item.AddItem(CheckBoxTree[13].Item.Handle);
  CheckBoxTree[6].Item.AddItem(CheckBoxTree[14].Item.Handle);

  ATreeView.ExpandAll;
end;

Example_TreeView.iss
 
Последнее редактирование:

audiofeel

Старожил

hitman797

Новичок
OpenWG - WOT

Код:
procedure OnTimer(Sender: TObject);
var
  ClientIndex: Integer;
begin
  ClientIndex:= 0;
  AMemo.AddLine('WOT Add Client: ' + IntToStr(WOT_AddClientW(WOT_GetClientPathW(ClientIndex))));
  AMemo.AddLine('WOT Launcher Get Preferred Client: ' + IntToStr(WOT_LauncherGetPreferredClient(WOT_GetClientLauncherFlavour(ClientIndex))));
  AMemo.AddLine('WOT Launcher Rescan: ' + IntToStr(WOT_LauncherRescan));
  AMemo.AddLine('WOT Launcher Set Default: ' + IntToStr(WOT_LauncherSetDefault(WOT_GetClientVendor(ClientIndex), WOT_GetClientVendor(ClientIndex))));
  AMemo.AddLine('WOT Client Find: ' + IntToStr(WOT_ClientFind(WOT_GetClientPathW(ClientIndex))));
  if WOT_ClientIsStarted(ClientIndex) = True then
  begin
    AMemo.AddLine('WOT Client Is Started: ' + 'True');
  end else
  begin
    AMemo.AddLine('WOT Client Is Started: ' + 'False');
  end;
  if WOT_ClientIsVersionMatch(ClientIndex , WOT_GetClientVersionW(ClientIndex)) = True then
  begin
    AMemo.AddLine('WOT Client Is Version Match: ' + 'True');
  end else
  begin
    AMemo.AddLine('WOT Client Is Version Match: ' + 'False');
  end;
  if WOT_ClientTerminate(ClientIndex) = True then
  begin
    AMemo.AddLine('WOT Client Terminate: ' + 'True');
  end else
  begin
    AMemo.AddLine('WOT Client Terminate: ' + 'False');
  end;
  AMemo.AddLine('WOT Get Clients Count: ' + IntToStr(WOT_GetClientsCount));
  AMemo.AddLine('WOT Get Client Branch: ' + IntToStr(WOT_GetClientBranch(ClientIndex)));
  AMemo.AddLine('WOT Get Client Launcher Flavour: ' + IntToStr(WOT_GetClientLauncherFlavour(ClientIndex)));
  AMemo.AddLine('WOT Get Client Locale: ' + WOT_GetClientLocaleW(ClientIndex));
  AMemo.AddLine('WOT Get Client Path: ' + WOT_GetClientPathW(ClientIndex));
  AMemo.AddLine('WOT Get Client Path Mods: ' + WOT_GetClientPathModsW(ClientIndex));
  AMemo.AddLine('WOT Get Client Path Resmods: ' + WOT_GetClientPathResmodsW(ClientIndex));
  AMemo.AddLine('WOT Get Client Realm: ' + WOT_GetClientRealmW(ClientIndex));
  AMemo.AddLine('WOT Get Client Type: ' + IntToStr(WOT_GetClientType(ClientIndex)));
  AMemo.AddLine('WOT Get Client Vendor: ' + IntToStr(WOT_GetClientVendor(ClientIndex)));
  AMemo.AddLine('WOT Get Client Version: ' + WOT_GetClientVersionW(ClientIndex));
  AMemo.AddLine('WOT Get Client Exe Version: ' + WOT_GetClientExeVersionW(ClientIndex));
  AMemo.AddLine('WOT Client Get Record: ' + CLIENT_FormatString(CLIENT_GetRecord(ClientIndex)));
  ATimer.Enabled(False);
end;
OpenWG_Utils_Demo_FMX.7z
 
Последнее редактирование:

Salamandra

Новичок
OpenWG - WOT

Код:
procedure OnTimer(Sender: TObject);
var
  ClientIndex: Integer;
begin
  ClientIndex:= 0;
  AMemo.AddLine('WOT Add Client: ' + IntToStr(WOT_AddClientW(WOT_GetClientPathW(ClientIndex))));
  AMemo.AddLine('WOT Launcher Get Preferred Client: ' + IntToStr(WOT_LauncherGetPreferredClient(WOT_GetClientLauncherFlavour(ClientIndex))));
  AMemo.AddLine('WOT Launcher Rescan: ' + IntToStr(WOT_LauncherRescan));
  AMemo.AddLine('WOT Launcher Set Default: ' + IntToStr(WOT_LauncherSetDefault(WOT_GetClientVendor(ClientIndex), WOT_GetClientVendor(ClientIndex))));
  AMemo.AddLine('WOT Client Find: ' + IntToStr(WOT_ClientFind(WOT_GetClientPathW(ClientIndex))));
  if WOT_ClientIsStarted(ClientIndex) = True then
  begin
    AMemo.AddLine('WOT Client Is Started: ' + 'True');
  end else
  begin
    AMemo.AddLine('WOT Client Is Started: ' + 'False');
  end;
  if WOT_ClientIsVersionMatch(ClientIndex , WOT_GetClientVersionW(ClientIndex)) = True then
  begin
    AMemo.AddLine('WOT Client Is Version Match: ' + 'True');
  end else
  begin
    AMemo.AddLine('WOT Client Is Version Match: ' + 'False');
  end;
  if WOT_ClientTerminate(ClientIndex) = True then
  begin
    AMemo.AddLine('WOT Client Terminate: ' + 'True');
  end else
  begin
    AMemo.AddLine('WOT Client Terminate: ' + 'False');
  end;
  AMemo.AddLine('WOT Get Clients Count: ' + IntToStr(WOT_GetClientsCount));
  AMemo.AddLine('WOT Get Client Branch: ' + IntToStr(WOT_GetClientBranch(ClientIndex)));
  AMemo.AddLine('WOT Get Client Launcher Flavour: ' + IntToStr(WOT_GetClientLauncherFlavour(ClientIndex)));
  AMemo.AddLine('WOT Get Client Locale: ' + WOT_GetClientLocaleW(ClientIndex));
  AMemo.AddLine('WOT Get Client Path: ' + WOT_GetClientPathW(ClientIndex));
  AMemo.AddLine('WOT Get Client Path Mods: ' + WOT_GetClientPathModsW(ClientIndex));
  AMemo.AddLine('WOT Get Client Path Resmods: ' + WOT_GetClientPathResmodsW(ClientIndex));
  AMemo.AddLine('WOT Get Client Realm: ' + WOT_GetClientRealmW(ClientIndex));
  AMemo.AddLine('WOT Get Client Type: ' + IntToStr(WOT_GetClientType(ClientIndex)));
  AMemo.AddLine('WOT Get Client Vendor: ' + IntToStr(WOT_GetClientVendor(ClientIndex)));
  AMemo.AddLine('WOT Get Client Version: ' + WOT_GetClientVersionW(ClientIndex));
  AMemo.AddLine('WOT Get Client Exe Version: ' + WOT_GetClientExeVersionW(ClientIndex));
  AMemo.AddLine('WOT Client Get Record: ' + CLIENT_FormatString(CLIENT_GetRecord(ClientIndex)));
  ATimer.Enabled(False);
end;
OpenWG_Utils_Demo_FMX.7z
Тему брали с сайта Korean Random???
 

hitman797

Новичок
@hitman797 зачем ты это слил в паблик ??
Извини. ;(
А что плохого в том что человек решил поделиться скриптом адаптированным под FMX Для поиска игры Мир Танков?
Он является владельцем этого сценария. Мне следовало спросить его, прежде чем делиться сценарием. :scratchhead:
 

Salamandra

Новичок
Извини. ;(

Он является владельцем этого сценария. Мне следовало спросить его, прежде чем делиться сценарием. :scratchhead:
Так удалите тогда все равно те кто тут если и есть делает модпаки на стандартном инно ну кто то еще ботву2 задействует и использует оригинал OpenWG_Utils_Demo скачанный с сайта Korean Random где ее автор выкладывает. А этот вариант был переделан спецом под FMX audiofeel и возможно еще кем то, за что отдельная благодарность.
 

audiofeel

Старожил
Представляю вот такой вариант.
22.png
По сути там ни в чем разбираться не нужно, все редактируется и настраивается в файле Setup.ini.

* Количество модов
* Путь для установки мода
* Превью картинка для мода
* Описание мода
* Краткое название мода
* Приблизительный размер

Всего четыре секции (A B C D)

Пример...
Форматирование (BB-код):
[ModsA]

[ModsA\Mod1]
Name=«Выбор Джова» - OverCross Over
SubName=Прицел из серии OverCross! Достаточно минималистичен. Показывает время перезарядки и запас прочности. Получил популярность благодоря бла бла бла 
Picture=A1.jpg
File=ModFiles\A\1\*
Dest={app}\mods
SizeMB=3.1
Name - Краткое название мода
SubName - Краткое описание мода
Picture - Превью картинка для мода
File- Путь где располагается мод
Dest - Путь куда копируется мод
SizeMB - Примерный размер

Если для работы мода нужен шрифт то...

Форматирование (BB-код):
[Fonts]

[Fonts\Font1]
Name=Archive
File=ModFonts\Archive.ttf
Тут думаю все понятно.

Количество модов (плиток) наверное не ограничено
В примере представлено только секция А
Скрипт - Lesta Mod Installer | Форум Krinkels.org
 
Последнее редактирование:

tihiy_don

Старожил
@audiofeel, предложил бы кому на форуме танкистов работу, может денег бы заработал. Может кто захочет себе модпак или еще чего.
 

audiofeel

Старожил
Может кто захочет себе модпак или еще чего
конечно захотят... предыдущий продан:greeting:

Вопрос и тема не в этом
Все ли понятно? и зайдет ли это все, когда все настройки в .INI
Инан батаге
 
Последнее редактирование:
Сверху