Search code examples
delphicheckboxmultiple-value

Multiple value in CheckListBox


How to implement this case: I have CheckListBox with 20 items: Symptomp 1, Symptomp 2,.., Symptomp 20. User can select more than one symptomp. Something that make me confuse is, how to give multiple value for each of symptomp. Here is my code:

  for i := 0 to CheckListBox1.Items.Count - 1 do
  begin
    if CheckListBox1.Checked[i] = True then
    begin
      Memo1.Lines.Append(CheckListBox1.Items.Strings[i]);
      if i = 0 
        p1 := 'Disease 1';
        p2 := 'Disease 2';
        p3 := 'Disease 3';
      if i = 1 then
        p1 := 'Disease 2';
      if i = 2 then
        p1 := 'Disease 1';
      if i = 3 then
        p1 := 'Disease 3';
      if i = 4 then
        p1 := 'Disease 2';
        p2 := 'Disease 3';
      if i = 5 then
        p1 := 'Disease 1';
        p2 := 'Disease 5';
        p3 := 'Disease 6';
      if i = 6 then
        p1 := 'Disease 5';

      Memo1.Lines.Add('Disease:' + p1+', '+p2+', '+p3);
      Memo1.Lines.Add('');
    end;
  end;
end;

But the result is not as i expected. How to make p1,p2,p3 dinamically ?

Here is the result when i check at index 2,4,6:

Symptomp 3
Disease:Disease 1, Disease 5, Disease 6

Symptomp 5
Disease:Disease 2, Disease 5, Disease 6

Symptomp 7
Disease:Disease 5, Disease 5, Disease 6

Solution

  • Declare a list of diseases and a constant string array to match:

    // List of diseases
    type
      // Note: Use descriptive names instead of a numbers
      TDisease = (td1,td2,td3,{..,}tdMaxDiseases);
      TDiseaseSet = set of TDisease;
    
      TSymptom = (ts1,ts2,ts3,{..,}tsMaxSymptoms);
    
    const
      // A list of disease names
      sDisease: array[TDisease] of String =
        ('Disease 1','Disease 2','Disease 3',{..,}'Disease xx');
      // An array of disease sets corresponding to each symptom
      cMyDiseaseSet : array[TSymptom] of TDiseaseSet = ([td1,td2,td3],[td3],[td1],[td2]);
    

    The set constant array declares a set of diseases for each symptom.


    To get a resulting string for each symptom and a set with diseases matching the symptom:

    // A Function to retrieve the diseases from a symptom
    function DiseaseFromSymptom(aSymptom: TSymptom; var diseaseSet: TDiseaseSet): String;
    var
      aDisease: TDisease;
    begin
      diseaseSet := cMyDiseaseSet[aSymptom];
      Result := '';
      for aDisease in diseaseSet do
        Result := Result + sDisease[aDisease] + ', ';
      SetLength(Result,Length(Result)-2);
    end;
    

    var
      diseases,diseasesSummary: TDiseaseSet;
      s: String;
    
      diseasesSummary := [];
      for i := 0 to CheckListBox1.Items.Count - 1 do
      begin
        if CheckListBox1.Checked[i] = True then
        begin
          s := DiseaseFromSymptom(TSymptom(i),diseases);
          Memo1.Lines.Append(CheckListBox1.Items.Strings[i]);
          Memo1.Lines.Add('Disease:' + s);
          Memo1.Lines.Add('');
          // Insert diseases
          diseasesSummary := diseasesSummary + diseases;
        end;
      end;
      // A complete set of diseases in diseasesSummary
    

    It seems as you want a set of diseases matching all checked symptoms. The latest update shows how to do that.