Liens entre form et class, je sais c souvent demander, mais je ne comprend pas t

Résolu
red_doudou Messages postés 14 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 15 juin 2005 - 14 juin 2005 à 00:07
red_doudou Messages postés 14 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 15 juin 2005 - 14 juin 2005 à 22:26
Bonjour voila mon probleme tout bete, et qui m empeche de poursuivre



J ai une form principal, j aimerais pouvoir acceder aux boutons ou certaine methode depuis une autre forme, ou classe



J ai essayer plein de chose poster ici, meme les tordus



j ai tenter sa



static frm_log MaForm = new frm_log();

[STAThread]

static void Main()

{



Application.Run(MaForm);





}



J ai tenter en mettan public a la place de static ... aucun changement



J en suis reduit a passer en paramettre au constructeur des immence structure ou je resume ce dont j ai besoin .........



J ai trouer plein de sujet sue cela sur le net... et les reponse finisse toujours en queue de poisson...



Personne n aurai une reponse clair et net sur comment lié les form entre elle?




En delphi et vb suffit de mettre le_nom_de_la_form.control_voulu
........ ici, en c# doit bien y avoir une methode equivalente.... suis
desesperer sa fait 3 jour que je cherche...

16 réponses

Troborg Messages postés 65 Date d'inscription samedi 24 avril 2004 Statut Membre Dernière intervention 1 août 2005 6
14 juin 2005 à 01:30
Houla !
Vouloir accéder directement à des boutons d'une forme depuis ailleurs...

Bon, déjà dans la form à laquelle tu veux accéder, plutôt que de passer les méthodes private en public,
il vaut sans doute mieux les redéfinir... Quitte à faire de bêtes :


public void Button1_Click()
{
button1_Click(null, null);
}

Ensuite, le problème est de retrouver la forme principale...
Ce que tu essaies de faire correspond à mon 3ème cas...
J'te mets les 2 autres solutions possibles pour infos !

Méthode 1 : cas des MDI
Si ta forme principale est une MDI (multiple document interface : il faut pour cela qu'elle ait la propriété "IsMdiContainer" à vrai), tu peux indiquer à ta 2ème forme que c'est son parent ("form2.MdiParent = this;"), tu pourras ensuite accéder à la forme principale depuis la 2nde forme en faisant par exemple : "(ParentForm as Form1 ).Button1_Click();"

Méthode 2 : cas courant
Bon, en fait je doute que tu utilises une MDI..
Dans ce cas tu peux tout simplement ajouter un attribut "myParent" dans ta forme 2...
Au moment de créer ta forme 2, tu pourras faire "form2.MyParent = this;",
l'appel se fera comme ci-dessus ! "(myParent as Form1).Button1_Click();"

Méthode 3 : retrouver la forme principale de n'importe où
Ce à quoi il faut faire attention dans ce cas, c'est que tu crées ta forme principale dans une autre classe, par convention la classe "Program".
Pour pouvoir y accéder, il faut donc mettre ta forme en static (pour pouvoir y accéder sans notion d'instance !) et en public (pour pouvoir y accéder !).
On obtient ainsi un truc de ce genre pour la classe Program :
static class Program
{
public static Form1 form1;

[STAThread]
static void Main()
{
form1 = new Form1();
Application.Run(form1);
}
}

Tu pourras maintenant accéder à ta forme principale depuis n'importe où; en appelant "Program.form1",
l'exemple précédent devient ainsi : "Program.form1.Button1_Click();"

J'avoue que cette dernière méthode me plait beaucoup moins...

Voila...
J'espère que ça t'aidera !!
3
Troborg Messages postés 65 Date d'inscription samedi 24 avril 2004 Statut Membre Dernière intervention 1 août 2005 6
14 juin 2005 à 21:16
J'avais pas fait gaffe à la seconde question !

En fait C# ne permet pas de mettre du code en dehors des classes (contrairement à C++ qui a conservé ainsi une grande compatibilité avec le C classique....)

Le principe des langages objets est de travailler sur des objets...
C++ permet de faire quelques petites entorses cette règle du "tout objet"...
(Mais je pense qu'on peut en fait considérer que les fonctions qui sont développées en C++ en dehors des classes, sont en fait comme des fonctions static développées dans une classe qui engloberait le programme..)

Pour travailler proprement, il est important que tu sépares bien chacun de tes objets...
Concernant les parties du code que tu mettais avant dans d'autres fichiers, tu as deux possibilités :
- soit elles sont liées à des objets (déjà existants ou à définir), dans ce cas tu peux les intégrer dans les classes adéquates (mais bon, je pense que ce ne doit pas être le cas... sinon tu n'aurais sans doute pas poser la question !)
- soit tu peux créer une ou plusieurs librairies de fonctions sous formes de classes dans lesquelles tes fonctions seront static (puisque ne dépendant d'aucun objet... Donc ne nécessitant pas d'instances de la classe).

Si tu développes des librairies de fonctions avec le framework 2.0, tu peux mettre la propriété static directement à ta classe pour indiquer que tu ne créeras jamais aucune instance de celle-ci..

Exemple concret :
Tu peux te créer une librairie de fonctions de maths comme ça :

static class MaLibMath // <!> On ne peut pas mettre dire qu'une class est static sur framework 1.0...
{
static public int Min (int a, int b)
{
return (a < b ? a : b);
}

static public int Max (int a, int b)
{
return (a < b ? b : a);
}
}

Et tu pourras ensuite accéder aux fonctions en appelant "MaLibMath.Min" et "MaLibMath.Max"
3
Troborg Messages postés 65 Date d'inscription samedi 24 avril 2004 Statut Membre Dernière intervention 1 août 2005 6
14 juin 2005 à 22:04
On n'avait pas convenu que tu arrétais de regarder ces méthodes, pour faire une gestion par évènements ?

En fait pour la "méthode 2", tu dois obtenir quelquechose comme ça :

Dans la form qui souhaite référencer une autre form, tu ajoutes l'attribut "myParent" : (ou un autre nom..)
public class frm_user : Form
{
private Form myParent; // NB : ce nom n'est pas forcément adapté...
// car on peut référencer ce qu'on veut.. pas forcément le parent !
public Form MyParent
{
get { return myParent; }
set { myParent = value; }
}

// ... Suite de ton formulaire....
}

Il faut ensuite que tu remplisses myParent , dans ton cas ça donne :

using(frm_user f = new frm_user(BaseDonne))
{
f.myParent=this;
f.ShowDialog();
}

Pour finir, tu pourras utiliser la propriété que tu viens de créer...
Par exemple en appelant dans une méthode de frm_user :
(myParent as frm_log).Button1_Click();

Notes :
1. J'aurais pu affecter directement le type frm_log à l'attribut myParent, afin d'éviter le cast finale...
Mais si j'avais fait ça, je me serais interdit de référencer d'autres forms.. ce qui est dommage..

2. au moment de l'appel, je te conseille d'entourer ce que tu feras par un try...catch !

Voila !

PS : Concernant les efforts d'organisation nécessaires pour gérer tes classes et libs...
C'est une bonne habitude à prendre... Après ça deviendra un automatisme !
3
Troborg Messages postés 65 Date d'inscription samedi 24 avril 2004 Statut Membre Dernière intervention 1 août 2005 6
14 juin 2005 à 02:04
En relisant ton message et ma réponse,
j'me disais que ma réponse est sans doute inutilement longue... lol...

Bon, pour la résumer :
1. ajoute "public" en plus de "static" devant ton "frm_log MaForm = new frm_log();"
2. pour appeler ta forme, utilises "Program.MaForm"

...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
14 juin 2005 à 09:29
dans tous les cas, ce n'est pas conforme au modèle objet.
Il vaut mieux utiliser les évènements, voir : http://www.csharpfr.com/forum.v2.aspx?ID=484044

Sébastien FERRAND

Blog : http://blogs.developpeur.org/sebmafate
</FO< body>
0
red_doudou Messages postés 14 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 15 juin 2005
14 juin 2005 à 12:03
Merci tout le monde, vos reponses , sont assez clair, je vais tenter
mais je pense que sa va marcher je vous tiens au courant, merci
0
red_doudou Messages postés 14 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 15 juin 2005
14 juin 2005 à 12:23
La troisieme methode est celle que je tenter d utiliser mais cela refuse toujours



Pour les deu premier, je ne trouve pas ou taper pour definir le parent



J ai beau essayer partout, je n ai jamai assez dans le menu deroualan a my parent ....



suis un peu perdu la



Comment et ou se declarer les parent?



svp , merci pour l aide
0
red_doudou Messages postés 14 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 15 juin 2005
14 juin 2005 à 12:43
Je retire, la methode 1 marche, la methode 2 je pense que je vai y arriver, puisque j ai trouver pour la1



La trois je laisse tomber pour l instant



Sinon question au passage, mais je crée peu etre un nouveau topic



En c++ mes classe n avait que des methodes, et je metter le code dans d autre fichier sources.



Ici je n arrive pas a faire autrement que mettre le code dans les classe... c affreu.....
0
Troborg Messages postés 65 Date d'inscription samedi 24 avril 2004 Statut Membre Dernière intervention 1 août 2005 6
14 juin 2005 à 14:04
Réflexion faite, c'est vrai que j'aurais sans doute dû éviter de poster les 3 solutions que j'ai mises..
Car ce ne sont pas des habitudes à prendre...


La bonne solution est bien celle de Seb...
Les MDI ne sont sans doute pas du tout adaptés à ton pb, et tant qu'à passer du temps sur ton projet pour obtenir ce que tu veux, autant regarder quelque chose de propre !
0
red_doudou Messages postés 14 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 15 juin 2005
14 juin 2005 à 15:19
Merci ca tombe bien si methode 3 marche pas



Sinon pour mon deuxieme prob ?
0
red_doudou Messages postés 14 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 15 juin 2005
14 juin 2005 à 21:26
Merci énormement, cela apparement va demander pas mal d effort d organisation, mais cela sera surement surmontable



Merci pour toutes ses reponses de tres bonnes qualités
0
red_doudou Messages postés 14 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 15 juin 2005
14 juin 2005 à 21:33
Quoique j ai un soucie, la methode avec les mdi j y arrive, je fait sa dans la forme 1





using(frm_user f = new frm_user(BaseDonne))



{




f.MdiParent=this;



f.ShowDialog();




}



Pour sans les mdi, je tape tou le f.myparent, parcque il me le propose
pas la ... snif ....je trouve pas la proprieter pour la form .myparen
et surtout ou la mettre??



T aurai un petit exemple concret ? merci
0
red_doudou Messages postés 14 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 15 juin 2005
14 juin 2005 à 21:57
J ai trouver le probleme, ce n est pas MyParent la proprieter mes Parent et donc on obtionet sa pour la creation







frm_user f = new frm_user();



f = (frm_user)this.Parent;





f.ShowDialog();



et pour l utilisation on obtion sa



(Parent as frm_log).mescontroloumethode.....



Bonne journé a tous, désolé pour le derangement
0
red_doudou Messages postés 14 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 15 juin 2005
14 juin 2005 à 21:59
Rectification, le f.showdialog explose, mais le prob vient peut etre de chez moi



Une exception non gérée du type 'System.NullReferenceException' s'est produite dans BDaveFormEtMaj.exe



Informations supplémentaires : Object reference not set to an instance of an object.
0
Troborg Messages postés 65 Date d'inscription samedi 24 avril 2004 Statut Membre Dernière intervention 1 août 2005 6
14 juin 2005 à 22:17
Hum.... Le code suivant est pas très beau... :
frm_user f = new frm_user();
f = (frm_user)this.Parent;
f.ShowDialog();

En faisant ça tu as essayé de remplacer la forme "frm_user" que tu avais créé par le parent de ta forme courrante (this.Parent)..... Qui dans le cas de la forme principale est null... d'où le crash...
La propriété Parent que tu essaies d'utiliser ici n'est vraiment pas adapté à ce que tu veux faire......
Mais c'est un peu de ma faute... Je n'aurais pas du appeler ma propriété myParent...

Par mon "myParent", j'entendais la forme qui appelle !.. (Ce qui n'était pas un choix de nom très judicieux, vu qu'il servait à référencer une forme... Mais pas spécialement le parent....)
Alors que la propriété "Parent" que tu essaies d'utiliser ici fait référence au container parent....

Je crois que je t'ai un peu embrouillé.... désolé....
0
red_doudou Messages postés 14 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 15 juin 2005
14 juin 2005 à 22:26
Merci ca a l air d aller
0
Rejoignez-nous