pierrotk10d
Messages postés110Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention 2 février 2024
-
25 janv. 2008 à 16:15
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 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);
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 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 ...
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 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;
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 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
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 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;
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 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
pierrotk10d
Messages postés110Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention 2 février 20243 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.
pierrotk10d
Messages postés110Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention 2 février 20243 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;