Bonjour,
J'aimerais créer plusieurs 'set of string' dynamiquement lors du run time.
Qui peut me mettre sur la piste?
Merci d'avance,
Phil.
Version imprimable
Bonjour,
J'aimerais créer plusieurs 'set of string' dynamiquement lors du run time.
Qui peut me mettre sur la piste?
Merci d'avance,
Phil.
Qu'entends-tu par set of string ?
Set of string: variable de type ensemble que je créerais dynamiquement en la nommant puis en la remplissant à partir de chaines.
N'en connaissant pas le nombre à l'avance je cherche à les créer au runtime.
Merci d'avance ;)
Phil.
Un ensemble ne peut contenir que des valeurs ordinales.
Pour des chaînes, ce serait un tableau, array of string, puis IndexStr pour trouver l'index.
je ne vois pas bien ce que tu comptes faire de cela...
sauf à convertir un TStringList en entier...je m'explique
NB: le code a été saisi en ligne sans vérification :)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 function StringsAsInteger(Values, SetOf: TStrings): Integer; var Index: Integer; Value: Integer; begin Result := 0; for Index := 0 to Values.Count - 1 do begin Value := SetOf.IndexOf(Values[Index]); if Value >= 0 then Result := Result or (1 shl Value); end; end; procedure IntegerAsSrings(Value: Integer; SetOf, Values: TStrings); begin for Index := 0 to SetOf.Count - 1 do begin if Value and (1 shl Index) > 0 then Values.Add(SetOf[Index]); end; end; var SetOf: TStringList; Values: TStringList; Value: Integer; begin // liste de valeurs possibles SetOf := TStringList.Create; SetOf.Add('Un'); // 1 SetOf.Add('Deux'); // 2 SetOf.Add('Trois'); // 4 // des valeurs Value := TStringList.Create; Value.Add('Trois'); Value.Add('Cinq'); // sera ignoré // en entier ça devrait donner 4 Value := StringsAsInteger(Values, SetOf); // conversion inverse Values.Clear; IntegerAsString(Value, SetOf, Values); // Values devrait contenir "Trois" end;
Tu peux aussi imaginer un seul TStringList pour héberger les chaînes et tester si déjà présente dans la liste (IndexOf), et créer des ensembles d'entiers représentant leurs index dans cette liste.
Dans une liste triée il est aussi possible d'utiliser la propriété Duplicates.
J'ai en fait contourné le problème.
Je crée la chaîne à la volée juste avant la requête
index étant la colonne de la table AdvStrGrid cliquée.Code:
1
2
3
4
5
6
7
8 S:=''; i:=1; repeat if TestsByPlaceGrid.Cells[index,i]<>'' then S:=S+ TestsByPlaceGrid.Cells[index,i]+','; i:=i+1; until TestsByPlaceGrid.Cells[index,i]=''; S:=copy(S,0,length(S)-1);
puis j'utilise ça:
... et ça marche :yaisse1:Code:Query.SQL.Add('SELECT COUNT(*) AS nombre from tests WHERE T_CODE IN ('+S+')');