survcopt
Messages postés224Date d'inscriptionmardi 27 mai 2003StatutMembreDernière intervention13 mai 2022
-
1 févr. 2007 à 16:54
polar20
Messages postés6Date d'inscriptionmardi 13 février 2007StatutMembreDernière intervention18 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 ?
survcopt
Messages postés224Date d'inscriptionmardi 27 mai 2003StatutMembreDernière intervention13 mai 20223 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
survcopt
Messages postés224Date d'inscriptionmardi 27 mai 2003StatutMembreDernière intervention13 mai 20223 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
survcopt
Messages postés224Date d'inscriptionmardi 27 mai 2003StatutMembreDernière intervention13 mai 20223 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);
polar20
Messages postés6Date d'inscriptionmardi 13 février 2007StatutMembreDernière intervention18 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.
polar20
Messages postés6Date d'inscriptionmardi 13 février 2007StatutMembreDernière intervention18 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.
polar20
Messages postés6Date d'inscriptionmardi 13 février 2007StatutMembreDernière intervention18 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.