Heritage entre class [Résolu]

Signaler
Messages postés
216
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
12 avril 2017
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
Salut,

je sais que ma question va paraitre super simple pour la plupart mais pour moi c'est un vrai casse-tête.

Voilà, j'ai un projet dans lequel j'appelle une classe textbox_byte. Dans le constructeur de cette classe je crée des TextBox à un endroit donné. Chaque TextBox genere un evenement/interruption lorsue l'on clique dessus.
Le probleme c'est que dans cet evenement je voudrais appeler des fonction se trouvant dans la class mère ...

Comme c'est pas evident de déchiffrer ce que j'ai chercher à dire, je pense qu'un exemple sera peut-être plus parlant...

ex:
/////////////////////////// Classe principale //////////////////////////////////////////

namespace Hexa
{


public class Hexa_MainForm : System
.Windows
.Forms
.Form



{


public Hexa_MainForm()


public textbox_byte [] tb;


void MainForm_Load(object sender
, System
.EventArgs e
)


{


tb
= new tb_byte
[3];


tb
[2] =new textbox_byte
(28,42);


tb
[1]= new textbox_byte
(96,42);


tb
[0] =new textbox_byte
(168,42);


foreach(textbox_byte t
in tb
) this
.Controls
.Add(t
.tb
);

}

void TOTO()
{


}

/////////////////////////// Classe fille //////////////////////////////////////////


namespace Hexa


{


public class textbox_byte



{


public System
.Windows
.Forms
.TextBox tb
;


//Constructeur


public textbox_byte(int X
,int Y
)


{


this
.tb
= new System
.Windows
.Forms
.TextBox();


this
.tb
.Location
= new System
.Drawing
.Point(X
, Y
);


this.tb.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Tb_byte1KeyDown);


this .tb
.Text
= "F";


}


void tb_KeyDown(object sender
, System
.Windows
.Forms
.KeyEventArgs e
)


{


//ICI JE VOUDRAI APPELER LA FONCION TOTO();
}

finalement je ne suis pas sur que ce sera plus clair avec l'exemple....

20 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
// Tableau

TextBox[ ] boxes = new TextBox[ 10 ];

// ArrayList

Arralist list = new ArrayList( );
list.Add( new TextBox( ) );

// Hastable ou parcourir la propriété "Controls" d'une forme.

http://www.csharpfr.com/forum.v2.aspx?ID=538853
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
Je voyais pourtant dans ton code :
"et tu retrouves ton TextBox de cette manière :
(TextBox)mesTextBox["tbTel1"]"
> Oui : TextBox txtBox (TextBox)mesTextBox["tbTel1"]";
txtBox.Location...

Dans ton cas ça donne :
(
(TextBox)tb_byte["byte7"])
.Location = new System.Drawing.Point(28,42);
etc...

/*
coq
MVP Visual C#
*/
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
La méthode associée à l'event possède un paramètre nommé sender, il s'agit du contrôle TextBox concerné dans ton cas.

TextBox txtBox = (TextBox)sender;
...

/*
coq
MVP Visual C#
*/
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
Salut,

Le niveau d'accessibilité par défaut des membres d'une classe est private.

Pour le prototype de la fonction :
protected void TOTO()
{


}



/*
coq
MVP Visual C#
*/
Messages postés
216
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
12 avril 2017
2
Comme tu t'en es surement apperçu, je ne suis pas super balaise en programmation.

J'ai rajouté dans ma Form principale "protected" devant ma fonction void Toto(), mais j'ai toujours une erreur de compilation lorsque j'essaye d'appeller cette fonction dans ma classe "fille"...

"The name 'Toto' does not exist in the class textbox_byte"
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
Ah oui, je m'étais focalisé sur le terme héritage sans vérifier.
Ca n'a rien a voir avec l'héritage, il s'agit d'une relation entre un contrôle et son conteneur.

Dans l'optique que tu as prise, si tu es sûr que ton "textbox" sera uniquement utilisé sur ton formulaire Haxa_MainForm il te suffit de faire :

internal void TOTO()
{
}

void tb_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
((Hexa_MainForm)this.Parent).TOTO();
}

Mais il vaudrais mieux exposer un event KeyDown, et t'y abonner sur le formulaire, plutot que de faire ce genre de chose qui induit une dépendance du "controle" envers un type de formulaire donné.

/*
coq
MVP Visual C#
*/
Messages postés
216
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
12 avril 2017
2
Merci beaucou de ton aide.

Je suis conscient que j'ai peut-être pas codé ça de la façon la plus propre.
J'aimerai bien mettre en pratique ta solution mais je dois avouer que je ne comprends pas bien comment faire...
Mais il vaudrais mieux exposer un event KeyDown, et t'y abonner sur le formulaire, plutot que de faire ce genre de chose qui induit une dépendance du "controle" envers un type de formulaire donné.

Sinon je vais essayer d'implementer ta premiere solution :
void tb_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
((Hexa_MainForm)this.Parent).TOTO();
}

Je fermerai ce topic très bientot une fois testé, en tous les cas merci beaucoup de ton aide..
Comment faisaient-ils avant internet pour demarrer la programmation????
Messages postés
216
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
12 avril 2017
2
Bon je vais peut-être repartir depuis le début car je sens bien que la façon dont jai codé n'est pas terrible et pourrait être amélioré.

En fait mon besoin initial etait de mon créer un tableau de textbox pour pouvoir y accéder rapidement grace à des boucles for du type:

for(int i=0;i<30;i++) tb[i].Text="";

Je faisais ça facilement en VB en placant tout mes textbox à la main dans un groupbox, mais je n'arrive pas à faire ça facilement en C#.
Si quelqu'un pouvais me donner la solution, je pourrai supprimer ma classe textbox_byte qui me sert juste à pouvoir faire un tableau de textbox. Le probleme c'est que du coup mes fonctions keyevent de ma classe textbox ne peuvent pas acceder facilement à des fonctions de ma MainForm.

En fait dans ma classe TextBox_byte je créé juste des textbox avec les même propriétés à part la position. Dans mon code MainForm je crée un tableau de Textbox que j'ajoute à ma MainForm.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
Le contrôle GroupBox existe aussi en .Net.
Dans ton cas tu peux tout simplement placer tes TextBox dans un ArrayList.

/*
coq
MVP Visual C#
*/
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
Coq, je crois que tu t'es trompé, il fait de l'agrégation pas de l'héritage.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
Oui, dans un premier temps j'avais fait confiance au titre...
"Ah oui, je m'étais focalisé sur le terme héritage sans vérifier.
Ca n'a rien a voir avec l'héritage, il s'agit d'une relation entre un contrôle et son conteneur."

/*
coq
MVP Visual C#
*/
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
Nan je parle de : ((Hexa_MainForm)this.Parent).TOTO();
Messages postés
216
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
12 avril 2017
2
Merci, je vais essayer.

Si j'ai bien tout compris je crée un groupbox dans lequel je place tous mes textbox? et ensuite qu'est-ce que je fais de l'ArrayList?
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
haaaaaa
Exact :-)

((Hexa_MainForm)this.tb.Parent).TOTO();

Décidément j'ai du mal sur ce sujet

/*
coq
MVP Visual C#
*/
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
TheBigBoss, si tu veux une collection de TextBox un ArrayList ou une Hashtable te suffit, ou alors tu crées une fonction pour les retrouver dans la propriété "Controls" de ta forme." Sinon voilà le code de ce que tu voulais faire dans ton premier message, mais avec une classe heritée et non aggrégée cette fois.



namespace Hexa
{
class MainForm : Form
{
private TextBoxByte[ ] boxes;


private MainForm( ) : base( )
{
boxes = new TextBoxByte[ 3 ];
boxes[ 0 ] = new TextBoxByte( 28, 42 );
boxes[ 1 ] = new TextBoxByte( 96, 42 );
boxes[ 2 ] = new TextBoxByte( 168, 42 );


this.ClientSize = new Size( 640, 480 );
this.Controls.AddRange( boxes );
}


internal void DoSomething( )
{
MessageBox.Show( "Hello!!" );
}


[ STAThread ]
private static void Main( )
{
Application.Run( new MainForm( ) );
}
}


public class TextBoxByte : TextBox
{
public TextBoxByte( int x, int y )
{
this.Location = new Point( x,y );
}


protected override void OnKeyDown( KeyEventArgs e )
{
//base.OnKeyDown( e );


( ( MainForm )this.Parent ).DoSomething( ); // Toto !!
}
}
}
Messages postés
216
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
12 avril 2017
2
J'ai changé le titre pour qu'il se rapproche un peu plus du sujet...

par contre, j'ai honte d'avouer que je ne sais toujours pas comment faire.

J'ai créé un groupbox dans lequel j'ai ajout plusieurs textbox. Deux problemes m'apparaissent:
- J'ai un cadre Groupbox que je ne veux pas voir dans mon IHM et que je ne peux pas rendre invisible sans rendre invisible les textbox qu'il contient
- Mes textbox s'appellent textbox1, textbox2... et non pas comme en VB textbox[1], textbox[2]...

Je suis un peu boulet mais ce que je souhaite faire etait tellement simple en VB que je ne comprend pas comment dois-je utiliser l'ArrayList.

Pour simplifier (et peut-être clore) ce sujet, ma question est la suivante (oublions tout ce qui a été dit avant):

Comment dans une même fenêtre (et un seul fichier plus de classes) créer un tableau de Textbox?

En tous les cas je vous remercie tous les deux de perdre du temps à expliquer à un boulet comme moi comment programmer.
Messages postés
216
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
12 avril 2017
2
merci encore de votre aide (et de votre pateience) à tous les deux. Je ne connaissais pas les hastable mais le lien que tu as donné montre exectement ce que je cherchais à faire.
Messages postés
216
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
12 avril 2017
2
voici ce que j'ai fait:


private Hashtable tb_byte
;


void init_tb_byte(int X
,int Y
)


{


tb_byte
= new Hashtable ();


for(int i
= 1; i
< 8; i
++)


{


TextBox Tb
= new TextBox ();


Tb
.Name
= "byte"+ i
.ToString();


Tb
.Size
= new System
.Drawing
.Size(32, 21);


Tb
.Text
= "F";


tb_byte
.Add("byte"+ i
.ToString(), Tb
);


this
.Controls
.Add(Tb
);


}


void MainForm_Load(object sender
, System
.EventArgs e
)


{


TextBox
[] tb
= new TextBox
[8];


init_tb_byte(28,42);


(TextBox
)tb_byte
["byte7"].Location
= new System
.Drawing
.Point(28,42);


(TextBox
)tb_byte
["byte6"].Location
= new System
.Drawing
.Point(96,42);


(TextBox
)tb_byte
["byte5"].Location
= new System
.Drawing
.Point(168,42);


(TextBox
)tb_byte
["byte4"].Location
= new System
.Drawing
.Point(240,42);


(TextBox
)tb_byte
["byte3"].Location
= new System
.Drawing
.Point(28,110);


(TextBox
)tb_byte
["byte2"].Location
= new System
.Drawing
.Point(96,110);


(TextBox
)tb_byte
["byte1"].Location
= new System
.Drawing
.Point(168,110);


(TextBox
)tb_byte
["byte0"].Location
= new System
.Drawing
.Point(240,110);

}

Le probleme c'est que je n'arrive pas à compiler j'ai un message:" 'object' does not contain a definition for 'Location'"

Je voyais pourtant dans ton code :
"et tu retrouves ton TextBox de cette manière :
(TextBox)mesTextBox["tbTel1"]"
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
Décidément elle est WYSIN(ot)WYG cette FTB, j'avais pas mit cette taille aux parenthèses -_-

/*
coq
MVP Visual C#
*/
Messages postés
216
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
12 avril 2017
2
Une dernière petite question pour finir. (promis)

Dans ma fonction init_tb_byte() j'ai rajouté un evenement lorsque l'on appuie sur une touche. Le probleme c'est qu'à l'appelle de cette fonction d'interruption, je suis incapable de savoir lequel des Textbox à généré cet appel...

Je pourrai bien sur faire comme j'ai fait pour passer la Localisation en indiquant une fonction differentes par textbox, mais je suis sur qu'il y'a une autre façon... non?