cs_thebigboss
Messages postés216Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention12 avril 2017
-
25 nov. 2005 à 23:39
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014
-
26 nov. 2005 à 23:40
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....
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 26 nov. 2005 à 22:51
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...
cs_thebigboss
Messages postés216Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention12 avril 20172 26 nov. 2005 à 14:27
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"
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 26 nov. 2005 à 14:38
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 :
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é.
cs_thebigboss
Messages postés216Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention12 avril 20172 26 nov. 2005 à 15:37
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????
cs_thebigboss
Messages postés216Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention12 avril 20172 26 nov. 2005 à 17:03
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.
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 26 nov. 2005 à 17:31
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."
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 26 nov. 2005 à 17:56
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 );
cs_thebigboss
Messages postés216Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention12 avril 20172 26 nov. 2005 à 18:24
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.
cs_thebigboss
Messages postés216Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention12 avril 20172 26 nov. 2005 à 20:59
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.
cs_thebigboss
Messages postés216Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention12 avril 20172 26 nov. 2005 à 23:37
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?