Смотрите видео ниже, чтобы узнать, как установить наш сайт в качестве веб-приложения на домашнем экране.
Примечание: Эта возможность может быть недоступна в некоторых браузерах.

я сделал по такому принципу но это слишком громозко по коду получается. мне бы как то это дело сократить и минимизировать максимально. у меня таких просто и по 20 штук будет например в разделе боевые моды и потом ангарные . потом еще и дополнительные модификации и того там получится капец как много кода. вот и ищу способ как такого же результата добиться но максимально сокращенно.Смотрю на ваш скриншот и не могу понять, какие же действия предусмотрены для главного чекбокса.
И какие действия предусмотрены для дочерних чекбоксов.
если отмечаю главный чекбокс то и первый дочерний с ним отмечается, другие по выбору пользователя если я снимаю с главного чекбокса то со всех выбранных тоже снимается. если я снимаю со всех дочерних чекбоксов то и с главного тоже снимаетсяЯ вас спросил не об этом, много или мало у вас будет чекбоксов, а отом какие функции будет выполнять главный и дочерние чеки.
Мысль ваша понятна, но только как вы хотите так работают радиобатоны, чекбоксы работают сами по себе.
[Setup]
AppName=ISSprite
AppVername=0.1
AppPublisher=Shegorat
OutputBaseFilename=Example
DefaultDirName={sd}\Example
DisableWelcomePage=False
OutputDir=.
[Files]
Source: "Files\*"; Flags: "dontcopy";
Source: "fmt\btn\Btn_03.png"; Flags: "dontcopy";
Source: "fmt\btn\Btn_04.png"; Flags: "dontcopy";
[Modules]
#include "Modules\ISSprite.iss"
[Code]
var
bn: array of HWND;
procedure ClickHandler(Btn: HWND; Event: Word);
var
i, idx, cnt: Integer;
begin
idx:= -1;
for i:= 0 to High(bn) do
if bn[i] = Btn then begin
idx:= i;
Break;
end;
if idx = 0 then begin
for i:= 1 to High(bn) do
if spBtnGetChecked(bn[i]) <> 1 then begin
for i:= 1 to High(bn) do spBtnSetChecked(bn[i], 1);
spBtnSetChecked(bn[0], 2);
spApplyChanges(spBtnGetParent(Btn));
Exit;
end;
for i:= 1 to High(bn) do spBtnSetChecked(bn[i], 0);
spBtnSetChecked(bn[0], 0);
end else if idx > 0 then begin
cnt:= 0;
for i:= 1 to High(bn) do if spBtnGetChecked(bn[i]) = 1 then Inc(cnt);
if cnt = 0 then spBtnSetChecked(bn[0], 0)
else if cnt = High(bn) then spBtnSetChecked(bn[0], 2)
else spBtnSetChecked(bn[0], 1);
end;
spApplyChanges(spBtnGetParent(Btn));
end;
procedure InitializeWizard;
var
i: Integer;
begin
with WizardForm do
begin
OuterNotebook.Hide;
Bevel.Hide;
Width:= 700;
Height:= 540;
Color:= $2C2C2C;
Position:= poScreenCenter;
spInitialize(False, False);
SetArrayLength(bn, 5);
for i:= 0 to High(bn) do begin
if i = 0 then begin
bn[i]:= spBtnCreate(Handle, 'Btn_04.png', 30, 50, 80, 20, BTN_CHECKBOXEX, 0);
spBtnSetText(bn[0], 'parent');
end else begin
bn[i]:= spBtnCreate(Handle, 'Btn_03.png', 50, 50+30*i, 80, 20, BTN_CHECKBOX, 0);
spBtnSetText(bn[i], 'child ' + IntToStr(i));
end;
spBtnSetFontColor(bn[i], $CCFF33, $999966, $FFFFFF, $444444);
spBtnSetEvent(bn[i], spMouseClick, @ClickHandler);
spBtnSetFont(bn[i], Font.Handle);
end;
CancelButton.Left:= (ClientWidth-CancelButton.Width)-20;
CancelButton.Top:= (ClientHeight-CancelButton.Height)-20;
PostMessage(NextButton.Handle, $10, 0, 0);
spApplyChanges(Handle);
end;
end;
procedure DeinitializeSetup;
begin
spShutdown;
end;
Примерно такесли отмечаю главный чекбокс то и первый дочерний с ним отмечается, другие по выбору пользователя если я снимаю с главного чекбокса то со всех выбранных тоже снимается. если я снимаю со всех дочерних чекбоксов то и с главного тоже снимается
function GetCheckIndex(Sender: TObject): Integer;
var
i: Integer;
begin
Result:= -1;
for i := 3 to 8 do
if Sender = TObject(ModCheckBox[i].GetObject) then
begin
Result:= i;
Break;
end;
end;
procedure CheckBoxOnChange(Sender: TObject);
var
i, Idx: Integer;
AnyChecked: Boolean;
begin
Idx:= GetCheckIndex(Sender);
if Idx = 3 then
begin
if ModCheckBox[3].IsChecked then
begin
if not ModCheckBox[4].IsChecked then
ModCheckBox[4].SetChecked(True);
end else
begin
for i:= 4 to 8 do
ModCheckBox[i].SetChecked(False);
end;
Exit;
end;
AnyChecked:= False;
for i:= 4 to 8 do
if ModCheckBox[i].IsChecked then
begin
AnyChecked:= True;
Break;
end;
if not AnyChecked then
ModCheckBox[3].SetChecked(False);
end;
спасибо попробую разобраться хотя не че не понял но буду пытаться может что и получитьсяПримерно так
code_language.pascal:function GetCheckIndex(Sender: TObject): Integer; var i: Integer; begin Result:= -1; for i := 3 to 8 do if Sender = TObject(ModCheckBox[i].GetObject) then begin Result:= i; Break; end; end; procedure CheckBoxOnChange(Sender: TObject); var i, Idx: Integer; AnyChecked: Boolean; begin Idx:= GetCheckIndex(Sender); if Idx = 3 then begin if ModCheckBox[3].IsChecked then begin if not ModCheckBox[4].IsChecked then ModCheckBox[4].SetChecked(True); end else begin for i:= 4 to 8 do ModCheckBox[i].SetChecked(False); end; Exit; end; AnyChecked:= False; for i:= 4 to 8 do if ModCheckBox[i].IsChecked then begin AnyChecked:= True; Break; end; if not AnyChecked then ModCheckBox[3].SetChecked(False); end;
спасибоSalamandra, нужно сделать группу CheckBox'ов одним массивом, привязать их к одному Event, например OnClick. а далее обрабатывать циклами, в зависимости по какому компоненту (Parent или Child) было совершено событие. У меня нет примера на FMXInno, есть пример на Sprite, там логика сделана одной процедурой, там только CheckBox'ы. Там можно подредактировать и подставить свои функции и операторы по аналогии:Код:[Setup] AppName=ISSprite AppVername=0.1 AppPublisher=Shegorat OutputBaseFilename=Example DefaultDirName={sd}\Example DisableWelcomePage=False OutputDir=. [Files] Source: "Files\*"; Flags: "dontcopy"; Source: "fmt\btn\Btn_03.png"; Flags: "dontcopy"; Source: "fmt\btn\Btn_04.png"; Flags: "dontcopy"; [Modules] #include "Modules\ISSprite.iss" [Code] var bn: array of HWND; procedure ClickHandler(Btn: HWND; Event: Word); var i, idx, cnt: Integer; begin idx:= -1; for i:= 0 to High(bn) do if bn[i] = Btn then begin idx:= i; Break; end; if idx = 0 then begin for i:= 1 to High(bn) do if spBtnGetChecked(bn[i]) <> 1 then begin for i:= 1 to High(bn) do spBtnSetChecked(bn[i], 1); spBtnSetChecked(bn[0], 2); spApplyChanges(spBtnGetParent(Btn)); Exit; end; for i:= 1 to High(bn) do spBtnSetChecked(bn[i], 0); spBtnSetChecked(bn[0], 0); end else if idx > 0 then begin cnt:= 0; for i:= 1 to High(bn) do if spBtnGetChecked(bn[i]) = 1 then Inc(cnt); if cnt = 0 then spBtnSetChecked(bn[0], 0) else if cnt = High(bn) then spBtnSetChecked(bn[0], 2) else spBtnSetChecked(bn[0], 1); end; spApplyChanges(spBtnGetParent(Btn)); end; procedure InitializeWizard; var i: Integer; begin with WizardForm do begin OuterNotebook.Hide; Bevel.Hide; Width:= 700; Height:= 540; Color:= $2C2C2C; Position:= poScreenCenter; spInitialize(False, False); SetArrayLength(bn, 5); for i:= 0 to High(bn) do begin if i = 0 then begin bn[i]:= spBtnCreate(Handle, 'Btn_04.png', 30, 50, 80, 20, BTN_CHECKBOXEX, 0); spBtnSetText(bn[0], 'parent'); end else begin bn[i]:= spBtnCreate(Handle, 'Btn_03.png', 50, 50+30*i, 80, 20, BTN_CHECKBOX, 0); spBtnSetText(bn[i], 'child ' + IntToStr(i)); end; spBtnSetFontColor(bn[i], $CCFF33, $999966, $FFFFFF, $444444); spBtnSetEvent(bn[i], spMouseClick, @ClickHandler); spBtnSetFont(bn[i], Font.Handle); end; CancelButton.Left:= (ClientWidth-CancelButton.Width)-20; CancelButton.Top:= (ClientHeight-CancelButton.Height)-20; PostMessage(NextButton.Handle, $10, 0, 0); spApplyChanges(Handle); end; end; procedure DeinitializeSetup; begin spShutdown; end;