Creation dynamique d'un ensemble scalaire

Résolu
pierrotk10d Messages postés 110 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 2 février 2024 - 25 janv. 2008 à 16:15
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 - 27 janv. 2008 à 01:11
Bonjour,
Je voudrai à l'aide d'un TCheckListBox ajouter ou supprimer, durant l'éxécution du programme, dans un type ensemble (eByte : set of Byte = [0,10,11,12] au démarrage de la procedure.) les valeurs cochées ou décochées par l'utilisateur pour ensuite comparer lors de la saisie si la valeur est incluse dans l'ensemble eByte.
procedure TForm1.CheckListClick(Sender: TObject);
Un peu comme ça mais sans utiliser un TStringList qui est ici déclaré public.
Merci de votre aide.

Var eByte: set of Byte = [0,10,11,12]; // Déclaré en début de l' unité.pas

Ici je passe par les variables nInd et cIdCol pour bien montrer ce que je veux. On pourrait s'en passer.
Procedure Test;
Var nInd: Integer;
    cIdCol: string;
begin
  cIdCol := Copy(CheckList.Items[CheckList.ItemIndex],1,2);
  nInd := tsIdCol.IndexOf(cIdCol);
  If CheckList.Checked[CheckList.ItemIndex] then
    tsIdCol.Add(cIdCol)
  else
    tsIdCol.Delete(nInd);

pierrot

10 réponses

cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
25 janv. 2008 à 18:10
Tu peux créer un type Record comme cela :

type
  TListofChecks = Record
    Item0: Boolean;
    Item1: Boolean;
    Item2: Boolean;
etc ...
  end;

Ensuite tu déclares une variable ainsi :

var
  Sauv1 : TListofChecks;

Et enfin tu l' utilises ainsi :
Sauv1.Item0 := CheckListBox1.Checked[0];
Sauv1.Item1 := CheckListBox1.Checked[1];
etc ...
Mais utilises un for i := 0 ...

A+
3
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
25 janv. 2008 à 19:40
je n'ai pas trop compris le probleme, mais tu peux eviter de passer par un record en utilisant un FLAG.
en gros, un entier dont chaque byte correspond à un item
par exemple, le 4eme bit correspondra à item3

voici un petit exemple :

var
  S: cardinal;
  i: integer;
begin
  S := 0;

  for i := 0 to CheckListBox1.Count-1 do
  begin
    if CheckListBox1.Checked[i] then
      S := S or (1 shl i);
  end;

  showmessage(inttostr(s));

  // S correspond à ton set of byte, ou chaque bit correspond a 1 si le byte est present
  // "(S or (1 shl 5))" vaut 0 si 5 n'appartient pas a l'ensemble, >0 sinon (2^5 exactement)
  // si S vaut 413, ca fait 110011101 en binaire
  // soit les indices :     ^^  ^^^ ^
  //                        ||  ||| |
  //                        87  432 0

  //les checkbox cochées sont donc la 0, 2, 3, 4, 7 et 8
end;
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
26 janv. 2008 à 17:34
Salut,

je ne sais pas si cela va t'aider mais sache que tu peux faire ceci :

  eByte := eByte + [8];
  eByte := eByte - [3];
  eByte := eByte + [22, 1, 7];
  eByte := eByte - [14, 10, 18];

 
@+
Cirec

<hr siz="" />
3
pierrotk10d Messages postés 110 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 2 février 2024 3
26 janv. 2008 à 17:53
Merci Cirec,
Je vais tester ça.

pierrot
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
26 janv. 2008 à 18:09
Et si ça te convient tu peux faire un truc du genre :

// Déclaration d'un Type (utile pour la procedure AddByteToSet)
Type TSetOfByte = Set Of Byte;

Var    eByte: TSetOfByte = [0,10,11,12];

Procedure AddByteToSet(Var aSet : TSetOfByte; aByte : Byte);
Begin
  aSet := aSet + [aByte];
End;

procedure TForm1.Button1Click(Sender: TObject);
Var
    I : Integer;
begin
  eByte := []; // Mise à Zéro du Set
  For i : = 0 to 22 do // ici on le rempli
  AddByteToSet(eByte, I);
end;

 
@+
Cirec

<hr siz="" />
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
27 janv. 2008 à 01:11
En fait, après réflection
il est préférable d'utiliser les procédures "Include" & "Exclude"
qui, d'après l'aide de Delphi, génèrent un code plus efficace, donc plus rapide, que  les procédures AddByteToSet & DelByteFromSet

Elles s'utilisent de la même manière :

procedure TForm1.CheckListClick(Sender: TObject);
Var nIdCol: Byte;
Begin
  nIdCol := StrToInt(Copy(CheckList.Items[CheckList.ItemIndex],1,2));
  If CheckList.Checked[CheckList.ItemIndex] then
    Include(eSet, nIdCol)
  else
    Exclude(eSet, nIdCol);
end;
 
@+
Cirec

<hr siz="" />
3
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
25 janv. 2008 à 19:48
... zoli, Guillemouze. Merzi !     :)))
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
25 janv. 2008 à 20:52
de rien cari

j'aime bien travailler avec les bits (a ne pas confondre avec byte), s'est super puissant et on peut en tirer beaucoup de choses, pour un peu qu'on puisse l'adapter a notre probleme.

ceci dit, pierrot a accepté ma reponse, mais j'ai toujours pas compris sa question
0
pierrotk10d Messages postés 110 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 2 février 2024 3
25 janv. 2008 à 22:12
Bonjour Guillemouze,
j'ai accepté ta réponse mais ce que je voulait faire c'est en initialisant comme public un ensemble contenant des entiers courts (au départ les valeurs [0,10,11,12]) pouvoir completer cet ensemble avec les valeurs renvoyé par les cases que l'utilisateur coche ou décoche au cours de son travail.
Les valeurs 0,10,11,12 representent les cases cochées par défaut lors de la création de la fiche.
Ensuite l'utilsateur peut très bien décocher la case qui correspond à 10 je veux alors que mon ensemble ne contienne plus que les valeurs [0,11,12].
Si il recoche la case 10 , la case 8, la case 9 je veux que l'ensemble contienne [0,8,9,10,11,12]
Ceci pour pouvoir ensuite controler avec
 If (IdCol   IN   eByte) then
    faire quelque chose
 sinon
    rien faire.
La valeur  IdCol est récuperée dans la champ IdCol d'une table paradox.
J'espère que tu auras compris ma demande.
Merci d' avoir passé un peu de temps à me répondre.

pierrot
0
pierrotk10d Messages postés 110 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 2 février 2024 3
26 janv. 2008 à 21:29
Bonsoir Chirec,
Merci de ton aide. C' est exactement ce que je voulais faire.  La même chose qu'avec la TStringList dans ma question.
J'ai juste rajouté la procédure DelByteToSet pour faire la différence.
Pour tester j'aime bien faire un petit bout de programme qui concerne uniquement ce qe je veux voir.
Merci encore

procedure TForm1.CheckListClick(Sender: TObject);
Var nIdCol: Byte;
Begin
  nIdCol := StrToInt(Copy(CheckList.Items[CheckList.ItemIndex],1,2));
  If CheckList.Checked[CheckList.ItemIndex] then
    AddByteToSet(eSet, nIdCol)
  else
    DelByteToset(eSet, nIdCol);
end;


procedure TForm1.TestIdColClick(Sender: TObject);
Var i: Byte;
begin
  // Juste pour voir si ça marche
  i := StrToInt(EdIdCol.Text);
  if (i in eSet) then
    label1.Caption := EdIdCol.Text + ' est dans IdCol'
  else
    label1.Caption := EdIdCol.Text + ' n''est pas dans IdCol';
end;

pierrot
0
Rejoignez-nous