Jeden parametr i właściwość Checked dla wielu CheckBox-ów.

0

Witam.
Mam na formie Panel, 13 CheckBoxów i 2 przyciski
Zapis właściwości Checked dla wszystkich przechowuję w zmiennej Private Pot4: Integer.
Kod dla zapisu do zmiennej:

procedure TForm1.Dalej3Click(Sender: TObject);
begin
P4.Visible:=False;
Pot4:=0;
CHB6Click(Self);
CHB7Click(Self);
CHB8Click(Self);
CHB9Click(Self);
CHB10Click(Self);
CHB11Click(Self);
CHB12Click(Self);
CHB13Click(Self);
CHB14Click(Self);
CHB15Click(Self);
CHB16Click(Self);
CHB17Click(Self);
CHB18Click(Self);
end;

procedure TForm1.CHB6Click(Sender: TObject);
begin
if CHB6.Checked then Pot4:=Pot4+1;
end;

procedure TForm1.CHB7Click(Sender: TObject);
begin
if CHB7.Checked then Pot4:=Pot4+2;
end;

procedure TForm1.CHB8Click(Sender: TObject);
begin
if CHB8.Checked then Pot4:=Pot4+4;
end;

procedure TForm1.CHB9Click(Sender: TObject);
begin
if CHB9.Checked then Pot4:=Pot4+8;
end;

procedure TForm1.CHB10Click(Sender: TObject);
begin
if CHB10.Checked then Pot4:=Pot4+16;
end;

procedure TForm1.CHB11Click(Sender: TObject);
begin
if CHB11.Checked then Pot4:=Pot4+32;
end;

procedure TForm1.CHB12Click(Sender: TObject);
begin
if CHB12.Checked then Pot4:=Pot4+64;
end;

procedure TForm1.CHB13Click(Sender: TObject);
begin
if CHB13.Checked then Pot4:=Pot4+128;
end;

procedure TForm1.CHB14Click(Sender: TObject);
begin
if CHB14.Checked then Pot4:=Pot4+256;
end;

procedure TForm1.CHB15Click(Sender: TObject);
begin
if CHB15.Checked then Pot4:=Pot4+512;
end;

procedure TForm1.CHB16Click(Sender: TObject);
begin
if CHB16.Checked then Pot4:=Pot4+1024;
end;

procedure TForm1.CHB17Click(Sender: TObject);
begin
if CHB17.Checked then Pot4:=Pot4+2048;
end;

procedure TForm1.CHB18Click(Sender: TObject);
begin
if CHB18.Checked then Pot4:=Pot4+4096;
end;

Kod dla odczytu ustawień, który po raz pierwszy wskazuje błędne dane, a po powtórnym wywołaniu prawidłowe.

procedure TForm1.OdczytPot4;
begin
if Pot4>=4096 then
  begin
  CHB18.Checked:=True;
  Pot4:=Pot4-4096;
  end else CHB18.Checked:=False;
if Pot4>=2048 then
  begin
  CHB17.Checked:=True;
  Pot4:=Pot4-2048;
  end else CHB17.Checked:=False;
if Pot4>=1024 then
  begin
  CHB16.Checked:=True;
  Pot4:=Pot4-1024;
  end else CHB16.Checked:=False;
if Pot4>=512 then
  begin
  CHB15.Checked:=True;
  Pot4:=Pot4-512;
  end else CHB15.Checked:=False;
if Pot4>=256 then
  begin
  CHB14.Checked:=True;
  Pot4:=Pot4-256;
  end else CHB14.Checked:=False;
if Pot4>=128 then
  begin
  CHB13.Checked:=True;
  Pot4:=Pot4-128;
  end else CHB13.Checked:=False;
if Pot4>=64 then
  begin
  CHB12.Checked:=True;
  Pot4:=Pot4-64;
  end else CHB12.Checked:=False;
if Pot4>=32 then
  begin
  CHB11.Checked:=True;
  Pot4:=Pot4-32;
  end else CHB11.Checked:=False;
if Pot4>=16 then
  begin
  CHB10.Checked:=True;  
  Pot4:=Pot4-16;
  end else CHB10.Checked:=False;
if Pot4>=8 then
  begin
  CHB9.Checked:=True;
  Pot4:=Pot4-8;
  end else CHB9.Checked:=False;
if Pot4>=4 then
  begin
  CHB8.Checked:=True;
  Pot4:=Pot4-4;
  end else CHB8.Checked:=False;
if Pot4>=2 then
  begin
  CHB7.Checked:=True;
  Pot4:=Pot4-2;
  end else CHB7.Checked:=False;
if Pot4>=1 then  
  begin
  CHB6.Checked:=True;
  Pot4:=Pot4-1;
  end else CHB6.Checked:=False;
end;

Zamiast konkretnych potęg można oczywiście skorzystać z funkcji math POWER(pods,wykł).
Czy robię jakiś błąd?
Dzięki z góry za jakąś poradę.

0

sugerował bym Ci utworzenie tablicy zawierającej wskaźniki do wszystkich obiektów typu TcheckBox i operować na elementach tej tablicy bo wtedy można to elegancko zrobić w pętli

unit Unit5;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm5 = class(TForm)
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    CheckBox5: TCheckBox;
    CheckBox6: TCheckBox;
    Button1: TButton;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure CheckBoxClick(Sender: TObject);
  private
    checkbox_array: array of TCheckBox;
    pot4: integer;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form5: TForm5;

implementation

{$R *.dfm}

procedure TForm5.CheckBoxClick(Sender: TObject);
begin
  if TCheckBox(Sender).Checked then
    /// ustawienie właściwego bitu na 1 
    self.pot4 := self.pot4 or (TCheckBox(Sender).Tag)
  else
    /// ustawienie właściwego bitu na 0  
    self.pot4 := self.pot4 and ($FFFFFFFF - (TCheckBox(Sender).Tag));
   /// podgląd wartości zmiennej  pot4
  self.Label1.caption := inttohex(self.pot4, 4);
end;

procedure TForm5.FormCreate(Sender: TObject);
var
  i, i_tag: integer;
begin
  i_tag := 1;
  self.pot4 := 0;
  setlength(self.checkbox_array, 0);
  // wyszukanie na formie komponentów klasy TCheckBox
  for i := 0 to self.ComponentCount - 1 do
    if self.Components[i] is TCheckBox then
    begin
      /// dodanie do tablicy wskaźnika do znelezionego komponetu 
      setlength(self.checkbox_array, length(self.checkbox_array) + 1);
      self.checkbox_array[ high(self.checkbox_array)] := TCheckBox(self.Components[i]);
      /// podstawienie pod  TCheckBox(self.Components[i]).Tag kolejnych potęg liczby 2 (1,2,4,8,16...)
      TCheckBox(self.Components[i]).Tag := i_tag;
      i_tag := i_tag * 2;
      // ustawienie obsługi zdarzenia onclick 
      TCheckBox(self.Components[i]).OnClick := self.CheckBoxClick;
      // wywołanie obsługi zdarzenia w celu wyliczenia wartości zmiennej pot4
      self.CheckBoxClick(self.Components[i]);

    end;
end;

end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1