IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Pb d'insertion dynamique de composants dans fct CALLBACK


Sujet :

MFC

  1. #1
    Membre confirm�
    Inscrit en
    Mars 2003
    Messages
    103
    D�tails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 103
    Par d�faut Pb d'insertion dynamique de composants dans fct CALLBACK
    Voila, j'ai un serieux souci.

    Dans un Framework en C#.
    Je souhaite ajouter dynamiquement un composant dans un panel.
    Le composant en question est un composant utilisateur qui n'ai constitu� que de labels, boutons et panel (un truc simple).

    Dynamiquement je souhaite en ins�rer plusieurs (un par un) dans un panel.
    Et lors du panel.Controls.Add(myComponent) j'ai le message d'erreur suivant qui apparait.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    Une exception non gérée du type 'System.ArgumentException' s'est produite dans system.windows.forms.dll
     
    Informations supplémentaires : Les contrôles créés sur un thread ne peuvent pas être parents d'un contrôle d'un autre thread.
    Je ne comprend pas grand chose � l'erreur.

    L'ajout de ce composant se fait apres l'appel d'une fonction CallBack dans un framework C++ qui fait ensuite appel a ma fonction d'ajout de composant, je ne sais pas si pas peut venir de ca.



    Le pire est que j'ai d�j� r�ussi a ajout� plusieurs fois ce composant dans un autre panel apres l'appui sur un bouton.

    Voici mon code:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    						myComponent = new ControlNoteComponent(this, iControlNoteMidi);
    						if( null != myComponent )
    						{
    							panelPlay.Controls.Add(myComponent);
     
    							//positionnement du control
    							int width = myComponent.Width;
    							myComponent.Location = new Point( (myChannel - 1) * Width ,0);
    						}
    Petite info suppl�mentaire:
    L'ajout du composant via un bouton ce fait dans un panel qui se trouve dans une tabpage. Et l'ajout du composant par la fonction CallBack se fait sur un autre panel d'une autre tabpage. Est ce que ca peut venir de ca?


    Je suis un peu pomm� l�

    Merci

  2. #2
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par d�faut
    a rien dit

  3. #3
    mat.M
    Invit�(e)
    Par d�faut
    Citation Envoy� par hiko-seijuro
    t dans le mauvais forum la
    :s
    Et si parce qu'il parle de C++...

    Citation Envoy� par Akta3d
    L'ajout de ce composant se fait apres l'appel d'une fonction CallBack dans un framework C++ qui fait ensuite appel a ma fonction d'ajout de composant, je ne sais pas si pas peut venir de ca.
    Ok mais quel est le code C++ ?
    POur exploiter .NET il faut utiliser _gc comme directive , voir les nombreuses FAQ sur DVP

    Les fonctions CALLBACK c'est en g�n�ral utiliser pour les proc�dures de messages pour fen�tre de type dialogue et je doute qu'on puisse utiliser cela avec le framework .NET

  4. #4
    Membre confirm�
    Inscrit en
    Mars 2003
    Messages
    103
    D�tails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 103
    Par d�faut
    Oui d�sol�, j'aurais surement du me mettre dans le forum .Net, mais comme d'hab je suis un peu pr�ss� et je cherchais C# comme intitul� de forum.


    En fait j'utilise une fonction CALLBACK midiInProc pour recevoir des signaux midi. Tout ceci ce passe dans un framework C++.

    Mon framework C# ne me sert que pour g�rer mon IHM.

    Voici le code C++:
    le .h

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    void CALLBACK midiInProc( HMIDIIN hMidiIn, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2 );
    dans le .cpp
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    	void CALLBACK midiInProc( HMIDIIN hMidiIn, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2 )
    	{
    		int toto;
     
    		if( MIM_DATA == uMsg )
    		{	
    			NoMidiProject* myNoProj = (NoMidiProject*)dwInstance;
    			if( 0 != myNoProj )
    			{
    				MidiProject* myProj = myNoProj->GetMidiProject();
    				if( 0 != myProj )
    				{
    					if( 0 != myProj->_Itf )
    					{
    						int channel = (dwParam1 & 0x0000000F) + 1;
    						int control = (dwParam1>>8) & 0x000000FF;
    						int valeur = dwParam1 >> 16;
    						int status = (dwParam1 & 0x000000F0) >> 4;
     
    						//affichage de la valeur recu
    						myProj->_Itf->AfficherMessage(channel, control, valeur, status);
     
    						//recherche du ControlNoteMidi concernant le message
    						ControlNoteMidi* myControlNoteMidi = myProj->GetControlNoteMidi(channel, control);
    						if( 0 != myControlNoteMidi )
    						{
    							myProj->_Itf->AfficherControlMidi(myControlNoteMidi);
    						}
    					}
    				}
    			}
    		}
    	}
    Il y a t-il moyen de d�clarer la fonction en manag�??? ce qui m'�tonnerai.

    Sinon la fonction AfficherMessage ne fait que afficher les valeurs channel, control, valeur, status dans des labels. Cette fonction est dans le framewok C# et elle marche nickel.
    Par contre c'est la fonction AfficherControlMidi qui plante.


    et voici le code C# qui gere mon IHM:
    (legerement simplifi� pour expos� mon probleme)

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    		public void AfficherControlMidi(ControlNoteMidi iControlNoteMidi)
    		{
    			if( (null != iControlNoteMidi) )
    			{
    				int myChannel = iControlNoteMidi.GetChannel();
     
    				ControlNoteComponent myComponent = new ControlNoteComponent(this, iControlNoteMidi);
    				if( null != myComponent )
    				{
    					panelPlay.Controls.Add(myComponent);
     
    					//positionnement du control
    					int width = myComponent.Width;
    					myComponent.Location = new Point( (myChannel - 1) * width ,0);
    				}
    			}
    		}

    J'ai essayer de contourn� le probleme en cr�ant tous les ControlNoteComponent avant de commencer a acquerir mes signaux midi. Ce qui �tait faisable car je sais que j'aurais au maximum 16 ControlMidiComponent. Puis quand je recois mon signal je met simplement a jour le bon ControlNoteComponent.

    Ce coup ci le code va un peu plus loin. Mais dans la mise a jour de ce composant, il doit cr�er d'autres composants (NoteMidiComponent) � inserer dans ce ControlNoteComponent. Et la j'ai le meme message d'erreur. Par contre je ne peu plus contourn� le probleme car ce coup ci je ne peux pas pr�voir le nombre max de composant qu'il y aura a ins�rer.

    Auriez vous une piste pour contoun� une nouvelle fois le probleme. Ou se qui serait encore mieux, une solution a mon erreur.


    Sinon pour en revenir a ma fonction callback. J'ai decid� d'utiliser cette methode car la fonction openMidiPort me le permettait avec le flag CALLBACK_FONCTION. Mais elle permet aussi d'autre type de flag que je n'ai pas explorer comme CALLBACK_THREAD et CALLBACK_WINDOWS. Cela pourrai -t- il me regler le probleme?

  5. #5
    mat.M
    Invit�(e)
    Par d�faut
    Pas trop le temps d�sol� ; mais en C# c'est pas possible d'appeler directement les fonctionnalit�s MIDI et multim�dia ?

Discussions similaires

  1. Insertion dynamique d'images dans crystal report avec c# 3.5
    Par devvanjier dans le forum Windows Forms
    R�ponses: 0
    Dernier message: 08/12/2009, 18h35
  2. Insertion dynamique de textbox dans un gridview
    Par ahmedmido dans le forum ASP.NET
    R�ponses: 1
    Dernier message: 06/08/2008, 13h11
  3. R�ponses: 3
    Dernier message: 02/06/2008, 08h42
  4. Ajouter dynamiquement un composant dans un panel ou une popup
    Par ludogoal dans le forum Windows Presentation Foundation
    R�ponses: 4
    Dernier message: 21/04/2008, 16h08
  5. insertion dynamique de lignes dans un tableau
    Par lorele�85 dans le forum G�n�ral JavaScript
    R�ponses: 4
    Dernier message: 22/06/2006, 17h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo