Gambas France BETA


Pas de compte ? Incription

[RESOLU]Transmission tableau à une class

Ce sujet est résolu.

1
AuteurMessages
LanoueC#1 Posté le 17/9/2010 à 17:43:00
Bonjour

j'ai un tableau de picture box crée dans ma form
Public tabFORM As New PictureBox[indice]

je le rempli dans form_open : c ok

declaration de la class dans la form
hVoirTableau as new voirTableau

dans la class : voirTableau
deux fonctions se servent de ce tableau qui doit prendre la valeur de départ au niveau de fom_open

donc, dans la class je crée un tableau public tel que : Public tabCLASS As New PictureBox[indice]

Comment faire pour que ce tableau tabCLASS soit initialisé avec la valeur de tabOBJECTIF ?
dans la form faire hVoirTableau.tabCLASS = tabFORM ? j'ai essayé mais ce n'est pas bon a priori!

==>il y a bien la solution , à partir de la class de faire Form.tabFORM :
ca évite de recréer un tableau tabCLASS, mais j'aurai préferé faire sans avoir à modifier le tableau de la form!

j'espère avoir été assez explicative

Prokopy#2 Posté le 17/9/2010 à 18:30:00
Kinder PinguiSi j'ai bien compris, tu as un tableau dans ton formulaire (tabFORM) que tu souhaites utiliser pour initialiser ton autre tableau (tabCLASS).

Dans la classe, il faut juste que tu crées un objet de type tableau "vide", et tu lui affectes le tableau tabFORM :

1
PUBLIC tabCLASS AS PictureBox[] = Form.tabFORM


Voilà. :)
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
LanoueC#3 Posté le 17/9/2010 à 22:03:00
merci Prokopy
c'est bien ce que j'avais essayé de faire mais

quand je déclare pour initialiser Public tabCLASS As PictureBox[] = Form.tabFORM

form.tabFORM ne prend pas !
apres avoir taper form puis . l'indentation ne se met pas en place comme si ce n'etait pas reconnu

par contre si je fais form.tabFORM à l'intérieure d'une des fonctions de la class alors c OK ! mais j'ai besoin d'une iniitialisation avant l'utilisation des fonctions

de même entre deux class ==> initialisation impossible
ex : tabCLASS2 as new integer[] = class1.tabCLASS1 c pas ok
par conte là aussi c ok à l'intérieure des fonctions!
Prokopy#4 Posté le 17/9/2010 à 22:32:00
Kinder PinguiAh oui oups, parlé trop vite … :roll:

L'initialisation de ta variable doit se faire dans le constructeur de ta classe, c'est-à-dire la fonction _new() :

1
PUBLIC tabCLASS AS PictureBox[]PUBLIC SUB _new() tabClass = Form.tabFORMEnd


Ça devrait mieux marcher comme ça. ;)
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
LanoueC#5 Posté le 17/9/2010 à 23:09:00
ah oui effectivement l'initialisation fonctionne bien

merci prokopy

question autre : est il possible de créer un tableau de pictureBox à partir d'une class?

'class
Public tbl As New PictureBox[10]

public sub creationPictureBox()
for i = 0 to 9
tbl = New PictureBox(Panel1Parcours)
next
end

pour l'instant j'ai pas réussi!

en fait je voudrais re-organiser mon petit prog et mettre un maximum en class afin que je puisse m'en resservir ailleurs!
Prokopy#6 Posté le 18/9/2010 à 07:54:00
Kinder PinguiCréer un tableau de PictureBox à partir d'une classe ? Tu veux dire créer ta propre classe PictureBox[] ?

Dans ce cas c'est simple, il te suffit d'hériter ta classe de PictureBox[], en mettant au début de ta classe :

1
INHERITS PictureBox[]


:)
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
gambix#7 Posté le 19/9/2010 à 16:18:00
Faire simple !oui lanouec...

ça ressemble a une classe d'encapsulation ça



' Gambas class file
'Class C9Case

Public Sub _New(hCont As Container)

Dim hPicBox As PictureBox
Dim i, j As Integer
For i = 0 To 2
For j = 0 To 2
hPicBox = New PictureBox(hCont) As "PicBox"
hPicBox.Move((hCont.ClientWidth / 3) * i, (hCont.ClientHeight / 3) * j, hCont.ClientWidth / 3, hCont.ClientHeight / 3)
hPicBox.Border = Border.Sunken

Next
Next


End


Public Sub PicBox_Enter()

Last.BackGround = Color.Yellow

End

Public Sub PicBox_Leave()

Last.BackGround = Color.Transparent

End





'==========================

Utilisation

'Form


Public sub Form_Open()

dim hClass as C9Case = new C9Case(ME)

end



et hop j'ai 9 cases :)

et c'est une classe réutilisable dans tout projet et dans tout type de container.

c'est parfoit plus pratique qu'un heritage.
Moins de texte dans une signature c'est agrandir son espace.
LanoueC#8 Posté le 19/9/2010 à 19:52:00
ouaaiiiii c'est génial comme çà

merci Gambix


Mais une précision : comment faire si je veux changer par exemple la couleur de fond mais pas avec un évènement souris , au cours du déroulement du programme?

if hpicbox.tag = 5 then hpicbox.background = color.blue?

a moins de remprendre ce que tu as écris et de faire un tableau de picbox?

Dim hPicBox As new PictureBox
Dim i, j As Integer
For i = 0 To 2
For j = 0 To 2
hPicBox = New PictureBox(hCont) As "PicBox"
hPicBox.Move((hCont.ClientWidth / 3) * i, (hCont.ClientHeight / 3) * j, hCont.ClientWidth / 3, hCont.ClientHeight / 3)
hPicBox.Border = Border.Sunken
inc i
Next
Next
LanoueC#9 Posté le 19/9/2010 à 22:07:00
j'ai bien trouvé cela :

For Each PicBox In hcontainer.Children
If PicBox.Tag > 2 Then picBox.Background = color.blue
Next

mais cela oblige de repasser à chaque fois par la boucle for each !

une simple dénomination comme picBox n° i : j'ai pas réussi
gambix#10 Posté le 20/9/2010 à 11:43:00
Faire simple !oui soit tu passe par un tableau... que tu appelle via ta classe

avec un _get par exemple.

Public function _Get(Value as integer) as PictureBox


return aPicBox

end


mais si j'en savait plus sur ton programme je suis certain qu'il y a de grande chance pour que tu n'ai pas a appeller les picbox directment ... souvent les event et Last suffisent.



Pour l'utilisation de get ensuite


Private hCPic as C9Case

Public sub Form_Open()

hCpic = New C9Case(Me)

hCPic[2].BackGround = Color.Blue

end
Moins de texte dans une signature c'est agrandir son espace.
LanoueC#11 Posté le 20/9/2010 à 17:32:00
Bonjour ou soir

OK j'ai bien réussi à créer un tableau de pictureBox à partir d'une class mais l'accès à ce tableau depuis la form est quelque peu confus pour moi

voilà ce que j'ai fais :

dans form
*déclaration : Public TabClassPic As New ClassPic[nbreMax]
* appel : TabClassPic = New ClassPic(Panel1)

dans ClassPic

*déclaration : Public tableau As New PictureBox[nbreMax]
* public SUB _new(hcontainer as container)
dim i as integer
for i = 0 to nbreMax -1
tableau = New PictureBox(hcontainer) As "foto"
tableau.picture = picture.load("image1.jpg")
etc....
end

L'accès à tableau depuis la Class ne pose aucun souci
l'accès au tableau depuis la form oui :

si depuis la form je fais :
TabClassPic.tableau[20].picture = picture.load("toto") : C OK

si je fais depuis la form :

dim toto as picture = picture.load("toto")
for j = to to TabClassPic.tableau.max
if TabClassPic.tableau[j].picture = toto then listBox.add("ok") : resultat listbox vierge alors que toto est là
next

OU bien
avec dans form un autre tableau telque : Public tableau2 As New PictureBox[nbreMax]

For j = 0 To TabClassPic.tableau.Max

tableau2[j] = New PictureBox(Panel2)

tableau2[j].Picture = TabClassPic.tableau[j].Picture : resultat = erreur reference d'objet NULL
Next

en fait l'accès aux pictures des pictureBox est impossible
j'ai rajouté dans la class : _get comme tu me disais mais là , ben çà ne change rien

Public Function _get(Value As Integer) As PictureBox
Return tableaul
End


je voudrais pouvoir accéder aux picture des picturesBox de ce tabClassPic.tableau à partir de la form mais aussi d'autres class

LanoueC
Merci
gambix#12 Posté le 20/9/2010 à 17:52:00
Faire simple !déja pour la comparaisont des picture du doit passer par un tampon ou par la comparaison des chemin des picture (stocké dans le tag par exemple)

pour le tempon

PictureBox.Picture = Picture["chemin"] va en quelque sorte stocké une reférence a l'objet picture dans la classe picture

si on rappelle Picture["chemin"] ça va nous retourner un référence a l'objé déja créé (si le fichier source n'a pas changé.

dans ce cas on peu comparer les reference

if picturebox.picture = Picture["toto"] then ...



mais je le déconseille ... il vaut mieux comparer des chemin ou des reference.



Moins de texte dans une signature c'est agrandir son espace.
LanoueC#13 Posté le 20/9/2010 à 20:24:00
MERCI gambix

ben c'est impecc, il me reste que a changer les déclarations des pictures comme cela!

Bonne soirée à tous
LanoueC
1