Gambas France BETA


Pas de compte ? Incription

toujours sur la POO...

Ce sujet est résolu.

1
AuteurMessages
spheris#1 Posté le 13/11/2021 à 11:45:00
Une autre question poo:

Je crée une classe appartement avec la propriété taille comme ceci:
1
2
3
4
5
6
7
8
9
10
PROPERTY taille AS INTEGER
PRIVATE $taille AS INTEGER

PRIVATE FUNCTION taille_Read() AS INTEGER
RETURN $taille
END

PRIVATE SUB taille_Write(Value AS INTEGER)
$taille = Value
END


et dans une form, je créé 10 instances de cette classe comme ceci :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
PUBLIC t1 AS NEW appartement
PUBLIC t2 AS NEW appartement
PUBLIC t3 AS NEW appartement
PUBLIC t4 AS NEW appartement
PUBLIC t5 AS NEW appartement
PUBLIC f1 AS NEW appartement
PUBLIC f2 AS NEW appartement
PUBLIC f3 AS NEW appartement
PUBLIC f4 AS NEW appartement
PUBLIC f5 AS NEW appartement

t1.taille = 23
t2.taille = 26
t3.taille = 85
t4.taille = 210
t5.taille = 45
f1.taille = 12
f2.taille = 48
f3.taille = 59
f4.taille = 77
f5.taille = 156


maintenant dans une form Fmain, form de démarrage, je souhaite afficher la taille de tous les appartements dans une gridview.

je fais :

1
2
gridview1[ligne1, colonne].Text = t1.taille
gridview1[ligne2, colonne].Text = t2.taille
etc...

n'y a-t-il pas la possibilité de mettre tout ça dans une boucle for next pour automatiser la chose?

Merci pour votre réponse.
;)
Patrick#2 Posté le 13/11/2021 à 15:43:00
Dans Fmain :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PRIVATE $apart AS Class1

PUBLIC SUB Form_Open()

DIM essai AS Class1

$apart = NEW Class1(Class1.fin, 5)
$apart.add(Class1.t, [23, 26, 85, 210, 45])
essai = Class1(12)
$apart.add(Class1.f, [essai, 48, 59, 77, 156])

END

PUBLIC SUB GridView1_Data(Row AS INTEGER, Column AS INTEGER)

GridView1.Data.Text = Str($apart.tableau[row, Column].taille)

END


Puis dans une classe que j'ai nomé Class1 :

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
' Gambas class file

CREATE STATIC
INHERITS Array

PROPERTY taille AS INTEGER
PROPERTY tableau AS Class1[]

PRIVATE $taille AS INTEGER
PRIVATE $tableau AS Class1[]

PUBLIC ENUM t, f, fin

PUBLIC SUB _new(OPTIONAL row AS INTEGER, Column AS INTEGER)

IF row <> 0 OR Column <> 0 THEN $tableau = NEW Class1[row, Column]

END

PUBLIC SUB _call(OPTIONAL tl AS INTEGER) AS Class1 ''tl = taille de l'appartement

DIM cl AS NEW Class1

cl.taille = tl
RETURN cl

END

PUBLIC SUB add(row AS INTEGER, Value AS Variant[])

DIM val AS VARIANT
DIM i AS INTEGER

FOR EACH val IN Value
IF TypeOf(Val) = gb.Integer THEN 'si val est un integer c'est que l'on passe la taille de l'appartement sinon on passe une class1
$tableau[row, i] = class1(val)
ELSE
$tableau[row, i] = val
ENDIF
i += 1
NEXT

END

PRIVATE FUNCTION taille_Read() AS INTEGER
RETURN $taille
END

PRIVATE SUB taille_Write(Value AS INTEGER)
$taille = Value
END

PRIVATE FUNCTION tableau_Read() AS Class1[]

RETURN $tableau

END

PRIVATE SUB tableau_Write(Value AS Class1[])

$tableau = Value

END

spheris#3 Posté le 16/11/2021 à 20:53:20
Patrick, je n'ai pas tout compris mais ça marche super.
Encore merci.
Patrick#4 Posté le 17/11/2021 à 18:07:18
On peut aller un peut plus loin, si tu rajoute dans class1 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PUBLIC SUB _next() AS Class1

IF IsNull($tableau) THEN 'si le tableau a une valeur null on ne peur pas l'énumérer
Enum.Stop
RETURN NULL
ENDIF
IF Enum.Index = NULL THEN Enum.Index = [0, -1] 'si enum.index a une valeur null c'est que c'est la 1° fois qu'on passe dans la boucle => on donne donc une valeur à l'index
Enum.Index[1] += 1
IF Enum.Index[1] = $Column THEN
Enum.Index[0] += 1
IF Enum.Index[0] = fin THEN Enum.Stop
Enum.Index[1] = 0
ENDIF
IF Enum.Index[0] < fin THEN RETURN $tableau[Enum.Index[0], Enum.Index[1]]

END


On obtient une classe énumérable dans une boucle for each :
1
2
3
FOR EACH essai IN $apart
PRINT essai.taille
NEXT


Pour les tableaux il y a aussi les méthodes _put et _get mais je ne les ais pas encore employées.

Patrick
1