FMXInno

DLL FMXInno October 27, 2024

Нет прав для скачивания
ну или если не кто подсказать не может хотя бы скажите как надпись что бы одна была без самого чекбокса вот как на сриншоте
Screenshot_3.jpg
 
добавил функцию ModCheckBox[3].OnClick(@CommonOnClick); все заработало отмечается вроде как. но теперь другая проблема стала
если я снимаю выбранные чекбоксы из четырех то главный не снимается выбирать отмечать отмечается но если убрать просто отмеченные чекбоксы то с последним по идее и главный должен сниматься он не снимается а остается выбранным. на скрине показал что с четырех снял а главный основной остался. вот как прописать или может функцию какую нужно добавить что бы когда не остается на других чекбоксов отметки и главный с последнего которого убираешь тоже снимался???
Screenshot_3.jpg
 
Смотрю на ваш скриншот и не могу понять, какие же действия предусмотрены для главного чекбокса.
И какие действия предусмотрены для дочерних чекбоксов.
 
Смотрю на ваш скриншот и не могу понять, какие же действия предусмотрены для главного чекбокса.
И какие действия предусмотрены для дочерних чекбоксов.
я сделал по такому принципу но это слишком громозко по коду получается. мне бы как то это дело сократить и минимизировать максимально. у меня таких просто и по 20 штук будет например в разделе боевые моды и потом ангарные . потом еще и дополнительные модификации и того там получится капец как много кода. вот и ищу способ как такого же результата добиться но максимально сокращенно.

TObject(ModCheckBox[3].GetObject):
begin
if not ModCheckBox[3].IsChecked then
begin
ModCheckBox[4].SetChecked(True);
ModCheckBox[5].SetChecked(False);
ModCheckBox[6].SetChecked(False);
ModCheckBox[7].SetChecked(False);
ModCheckBox[8].SetChecked(False);
end else
begin
ModCheckBox[4].SetChecked(False);
ModCheckBox[5].SetChecked(False);
ModCheckBox[6].SetChecked(False);
ModCheckBox[7].SetChecked(False);
ModCheckBox[8].SetChecked(False);
end;
end;

TObject(ModCheckBox[4].GetObject):
begin
if not ModCheckBox[4].IsChecked then ModCheckBox[3].SetChecked(True) else
begin
if (not ModCheckBox[5].IsChecked) and (not ModCheckBox[6].IsChecked) and (not ModCheckBox[7].IsChecked)
and (not ModCheckBox[8].IsChecked) then ModCheckBox[3].SetChecked(False);
end;
end;

TObject(ModCheckBox[5].GetObject):
begin
if not ModCheckBox[5].IsChecked then ModCheckBox[3].SetChecked(True) else
begin
if (not ModCheckBox[4].IsChecked) and (not ModCheckBox[6].IsChecked) and (not ModCheckBox[7].IsChecked)
and (not ModCheckBox[8].IsChecked) then ModCheckBox[3].SetChecked(False);
end;
end;

TObject(ModCheckBox[6].GetObject):
begin
if not ModCheckBox[6].IsChecked then ModCheckBox[3].SetChecked(True) else
begin
if (not ModCheckBox[4].IsChecked) and (not ModCheckBox[5].IsChecked) and (not ModCheckBox[7].IsChecked)
and (not ModCheckBox[8].IsChecked) then ModCheckBox[3].SetChecked(False);
end;
end;

TObject(ModCheckBox[7].GetObject):
begin
if not ModCheckBox[7].IsChecked then ModCheckBox[3].SetChecked(True) else
begin
if (not ModCheckBox[4].IsChecked) and (not ModCheckBox[5].IsChecked) and (not ModCheckBox[6].IsChecked)
and (not ModCheckBox[8].IsChecked) then ModCheckBox[3].SetChecked(False);
end;
end;

TObject(ModCheckBox[8].GetObject):
begin
if not ModCheckBox[8].IsChecked then ModCheckBox[3].SetChecked(True) else
begin
if (not ModCheckBox[4].IsChecked) and (not ModCheckBox[5].IsChecked) and (not ModCheckBox[6].IsChecked)
and (not ModCheckBox[7].IsChecked) then ModCheckBox[3].SetChecked(False);
end;
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;
 

Вложения

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

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;
 

Вложения

  • Check.7z
    Check.7z
    4.5 MB · Просмотры: 1
Примерно так

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;
спасибо
 
Назад
Сверху