Jk Robbin
Jk Robbin

Reputation: 65

Delphi 7: How to use a combination of check boxes

Am working an a small app in Delphi7 but am puzzles on how to use a combination of 3 check boxes Example: if check.box1 and checkbox2 checked run system application with these prefs or if checkbox1 only checked run system application with these prefs or if checkbox2 only checked run with these prefs

Upvotes: 0

Views: 1041

Answers (2)

Tom Brunberg
Tom Brunberg

Reputation: 21033

Inspired by MartynA's solution, and because I prefer compact code, here's how I would do it:

// For the three (sets of?) preferences, define bit values, and
// a variable to hold the combination of the selected preferences:
const
  PrefA=1; PrefB=2; PrefC=4;
var
  prefs: byte;

procedure TForm12.Button2Click(Sender: TObject);
begin
  // whether a preference should be active or not becomes a simple `OR` function
  // based on each checkbox's state
  prefs := 0;
  if CheckBox1.Checked then prefs := prefs or PrefA;
  if CheckBox2.Checked then prefs := prefs or PrefB;
  if CheckBox3.Checked then prefs := prefs or PrefC;

  // then use a `case` statement to run according the preference combination  
  // The values like `PrefA or PrefC` can be used instead of numeric values,
  // since they can be resolved at compile time.
  // Whether they improve readability or not is ... (disputable)

  case prefs of
    0:
      ShowMessage('Running without preferences');
    PrefA:
      ShowMessage('Running with PrefA alone');
    PrefB:
      ShowMessage('Running with PrefB alone');
    PrefA or PrefB:
      ShowMessage('Running with PrefA and PrefB');
    PrefC:
      ShowMessage('Running with PrefC alone');
    PrefA or PrefC:
      ShowMessage('Running with PrefA and PrefC');
    PrefB or PrefC:
      ShowMessage('Running with PrefB and PrefC');
    PrefA or PrefB or PrefC:
      ShowMessage('Running with PrefA and PrefB and PrefC');
  end;
end;

If you need to check in your code whether a preference is active or not, you can do it like:

  if (prefs and PrefB) then
    // do whatever requires PrefB to be selected

Upvotes: 2

MartynA
MartynA

Reputation: 30715

It sounds like you're having trouble getting started writing what you need, which is basically a series of if..then..else flow-control statements based on compound boolean expressions. You probably want a structure like the one below. I'm not going to show you the entire thing, because it's best for you to work it out for yourself, but this should give you the idea:

  if (CheckBox1.Checked) and (CheckBox2.Checked) and not (CheckBox3.Checked) then 
    begin
      // do one thing
    end
  else 
    begin
      if (CheckBox1.Checked) and not (CheckBox2.Checked) and not (CheckBox3.Checked) then 
        begin
          // do another thing
        end
      else
        // etc
    end;

If you're familiar with enumerated types, you might do better to declare one and use that to derive the selected preferences and then act upon them. The point of doing that is twofold: to increase the clarity of your code (at the expense of your code being longer, of course); and to separate the logic for calculating which preference the user has selected from the code which acts upon it.

Something like

type
  TRunPreference = (rpNone, rpOne, rpTwo, rpThree, rpFour,
    rpFive, rpSix, rpSeven, rpEight);

  // rpOne..rpEight are for the 8 permutations of three booleans
  // and the rpNone is to provide for initialising the variable
  // with something which isn't one of the desired values

var
  RunPreference : TRunPreference;

procedure TForm1.Button1Click(Sender: TObject);
begin
  RunPreference := rpNone;

  if (CheckBox1.Checked) and (CheckBox2.Checked) and not (CheckBox3.Checked) then
    begin
      RunPreference := rpOne;
    end
  else
    begin
      if (CheckBox1.Checked) and not (CheckBox2.Checked) and not (CheckBox3.Checked) then
        begin
          RunPreference := rpTwo;
        end
      else
        ; //
    end;
  case RunPreference of
    rpNone :
      ; // do nothing
    rpOne :
      begin
        // Act on rpOne
      end;
    rpTwo :
      begin
        // Act on rpTwo
      end;
     // etc
   end; { Case of RunPreference }
end;

Upvotes: 3

Related Questions