Utiliser objet d'une autre form..

survcopt Messages postés 224 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 13 mai 2022 - 1 févr. 2007 à 16:54
polar20 Messages postés 6 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 18 février 2007 - 18 févr. 2007 à 10:07
Bonjour,
Je cherche à recuperer des infos d'objets situé dans une autre form que celle ou je travaille:
dans form2 il y a text2 et je veux dans ma form1 pouvoir faire form2.text2.text = "toto"
ou pouvoir faire ca form2.serialport1.read alors que je suis dans form1.

comment utiliser un objet d'une form dans laquelle je ne travaille pas car je suis dans une classe ou une autre form ?

www.survey-copter.com

12 réponses

taoetc Messages postés 346 Date d'inscription lundi 8 septembre 2003 Statut Membre Dernière intervention 3 septembre 2007 3
1 févr. 2007 à 18:16
Il faut que ta deuxieme fenetre soit une fenetre parente ou que tu passes l'instance de ta fenetre au construxteur de ta deuxuieme fenetre.

Si ta deuxieme fenetre est parente ( showdialog(this) ou fnetre MDI), tu peux faire un forcage de type  comme

Frm1 maform1 = (Frm1)this. MdiParent;
ou
Frm1 maform1 = (Frm1) this.Parent; ( la je suis pas sur).

Ensuite, tu peux accèder à toutes les méthode ou objet public de ta première form.

Je te conseille plutot de faire des fonctions ou alors définir des propriètés plutot que de mettre des objets public, c'est plus propres.

 

Be happy , by
Tao
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
1 févr. 2007 à 21:23
Salut,
Jette un coup d'oeil sur cette source, elle va certainement t'aider...

<hr />
-Blog-
0
survcopt Messages postés 224 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 13 mai 2022 3
2 févr. 2007 à 10:15
En fait je veux regrouper des fonctions dans des classes afin de pouvoir les appeler comme les modules en VB6 sauf que dans VB6 dans ton module  tu peux faire mainfrm.text1.text = "toto" et que la ça marche pas. Bidou ton soft marche super mais pour passer des paramètres , il n'y a qu'une seule fenetre ouverte à la fois , moi je veux avoir ma fenêtre principale avec mon objet serialport et une autre fenetre ouverte qui peut utiliser cet objet.
Merci à toi taoetc mais je n'ai pas compris ce que tu m'as dit (je te rassure cela vient de moi ...) :
ma fenêtre principale mainfrm contient serialport1
ma deuxieme fenetre frm2 contient un bouton1 qui agit sur serialport1 :  serialPort1.Write =
"message";
tu dis
"Je te conseille plutot de faire des fonctions ou alors définir des propriètés" comment faire ?
Une fois tout cela mis au clair je ferai une source car je pense ne pas être le seul à avoir ces problèmes
Merci

www.survey-copter.com
0
survcopt Messages postés 224 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 13 mai 2022 3
2 févr. 2007 à 16:28
Avec un classe j'arrive à passer en paramètre mes données dans la fonction de la classe en utilisant
FenetreFille.serialport GestionUart = new FenetreFille.serialport();

Avec FenetreFille comme namespace de ma mainfrm
serialport comme namespace de ma classe
et gestion GestionUart comme fonction dans ma classe
et j'appelle ma fonction comme ca
GestionUart.ReceiveByte(DataByte);

Mais en je cherche toujours pour piloter depuis ma classe  mon serialport1 de ma mainfrm

www.survey-copter.com
0

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

Posez votre question
polar20 Messages postés 6 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 18 février 2007
13 févr. 2007 à 11:11
Salut,
Avez-vous trouvé une solution? J'ai beaucoup de misère en ce moment dans form2:

public






void
button1_Click(

object
sender,

EventArgs
e){


Form1
frm1 =

new



Form1
();// je réussi a copier le texte de form1 dans form2
txt1.Text = frm1.txt1.Text;

// je ne réussi pas a utiliser le meme serialport qui est deja ouvert dans form1 










byte
[] buffer =

new



byte
[1];buffer[0] = (


byte
)

'a'
;frm1.comMicro.Write(buffer, 0, 1);

J'apprécie votre support.
0
survcopt Messages postés 224 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 13 mai 2022 3
13 févr. 2007 à 13:00
désolé je suis passé par un autre moyen , j'utilise une classe dans laquelle je fais ma fonction de decodage en lui passant en paramètre les octets recus .
Dans form2 je sais utilser une fonction de form1 :
Carto étant ma form1
cette fonction est appellée dans ma form2
Carto carto = (
Carto)
this.Owner;
carto.SendDVCommand(vidgrab_NET.
TxDVCommand.dv_Rew);

et quand j'appelle ma form2 ici miscDVCommands , je fais :
miscDVCommands MiscDVCommands =
new
miscDVCommands();
MiscDVCommands.Owner =
this;
MiscDVCommands.Show(
this);

Bonne chance et tiens moi au courant

www.survey-copter.com
0
polar20 Messages postés 6 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 18 février 2007
14 févr. 2007 à 08:02
Je souhaite simplement utiliser le meme serialPort1 du Form1 dans Form2. Voici mon code du bouton de Form2:

private

void button1_Click(
object sender,
EventArgs e){

Form1 frm1 =
new
Form1();

byte[] buffer =
new
byte[1];buffer[0] = (

byte)
'a';frm1.serialPort1.Write(buffer, 0, 1);

}

Je reçois l'erreur: Access to the port 'COM3' is denied. J'ai l'impression qu'il n'utilise pas la meme instance de mon objet serialPort1 situé dans Form1.

J'ai grandement besoin d'aide. La solution est probablement simple.
0
polar20 Messages postés 6 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 18 février 2007
14 févr. 2007 à 08:20
Je suis impressioné. Ça marche! J'ai passé des heures de recherche et la solution était aussi courte que ça. Je me demande maintenant si c'est bien d'utiliser ce serialPort situé dans form1 ou si je devrais créer une autre class uniquement comme base de serialPort. Il est important pour moi d'utiliser le port dans plusieurs forms. Je vais devoir faire
MiscDVCommands.Owner = this;
MiscDVCommands.Show(this);

pour faire apparaitre une autre form, il faut faire Carto carto = (Carto)this.Owner;

au lieu de
Carto carto =
newCarto
();

C# est très sensible a mon avis et si ça continue comme ça je vais passer des heures sur chaque petit problème. Ce sont des passages secrets et c'est émouvant de trouver une des sorties disponible après avoir essayer tant d'autres. Il est parfois trop facile de se décourager. J'ai encore beaucoup de chemin. Merci infiniment survcopt.
0
polar20 Messages postés 6 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 18 février 2007
14 févr. 2007 à 09:52
Et voila. Ça recommence encore. Je met pour un bouton et ça marche mais je met pour un switch et les erreurs se montrent.private

void comMicro_DataReceived(
object sender, System.IO.Ports.
SerialDataReceivedEventArgs e){

byte b = (
byte)comMicro.ReadByte();

switch (b){

case 65:

F3admin adm =
new
F3admin();adm.Owner =

this;adm.ShowDialog(

this);

break;}

Cross-thread operation not valid: Control 'FormMain' accessed from a thread other than the thread it was created on.
0
polar20 Messages postés 6 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 18 février 2007
17 févr. 2007 à 14:28
J'ai enfin réussi à corriger le problème de Cross-thread operation (CheckForIllegalCrossThreadCalls).

Je vais décrire ici brièvement pour aider les gens à accéder aux controls des forms et se diriger au bon chemin.

Donc pour accéder à un bouton (ou n'importe quel control) du form1 à partir de form2 ou form3 de la meilleure façon sécuritaire long-terme, il faut appliquer le threading a votre bouton. 5 étapes simple:

1) ajouter au dessus de votre code source dans form1.cs
using System.Threading;

2) ajouter en dessous de:
public partial class Form1 : Form
{
//ajouter ceci
public Thread demoThread = null;

3) au lieu de mettre l'action du bouton dans le click event, mettez ceci:

public void button1_Click(object sender, EventArgs e)
{
this.demoThread =
new Thread(new ThreadStart(this.ThreadProcSafe));
//ceci va déclencer la prochaine étape
this.demoThread.Start()
}
//votre bouton fonctionnera de la même façon aucun soucis. le .Start au dessus va réellement déclencher ce qu'il y a dessous.
public void ThreadProcSafe()
{
//voici où inclure l'action de votre bouton
}

4) maintenant essayons d'accèder ce bouton à partir de form2: ajouter au dessus de votre code source dans form2.cs
using System.Threading;

5) tout doit apparaître comme ce qui suit:
public partial class Form2 : Form
{

//nous essayons d'accéder la même form1 telle quelle plutôt que créer une autre instance
//de cette facon _form est réellement form1 déja ouverte derrière form2 permettant d'accéder tous ses controls

private Form1 _form;

public Form2(Form1 formform)
{
InitializeComponent();
_form = formform;
}

6) créer un bouton dans form2 et déclencher le .Start de form1 directement en ajoutant ceci:
_form.demoThread =
new Thread(new ThreadStart(_form.ThreadProcSafe));
_form.demoThread.Start();

//et voila. dites-moi si tout va bien ou si vous érouvez des ennuies. j'ai souffert des jours et nuits et j'exige vos commentaires! bonne chance.

polar20
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
17 févr. 2007 à 15:15
Salut,

Il ne faut pas utiliser CheckForIllegalCrossThreadCalls. mais utiliser Invoke ou BeginInvoke / EndInvoke
Lien vers un tuto pour pallier au probleme.

Mx
MVP C# 
0
polar20 Messages postés 6 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 18 février 2007
18 févr. 2007 à 10:07
Je n'ai plus de problème de Cross-thread operation avec la façon de System.Threading;

Je vais bientôt essayer votre conseil de Invoke ou BeginInvoke / EndInvoke

Je suis en train d'apprendre sur Object Oriented Programming.
0
Rejoignez-nous