Membres inscrits :2359
Membres en ligne : 0
Invités en ligne : 1


|
Conversation : DnD, question sur le tutoriel |
PaowZ (Membre)
Inscrit le : 04-02-2008
Messages: 16
Snippets: 0
Tutoriels: 0
Hors ligne |
Bonjour,
j'ai mis une question en guise de commentaire concernant le DnD: http:/www.wxdev.fr/snippet38-D&D_tr … lexes.html
Si vous pouviez y jeter un oeil et m'éclaircir sur un point, ça sera relax 
Merci bien
Dernière modification par PaowZ (11-03-2010 13:56:56)
|
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne |
Salut.
C'est vrai que le code est bizarre : je n'ai pas souvenir de l'avoir testé à l'époque.
Par contre, j'ai eut récemment besoin de faire du copier/coller avec des données bien spécifiques. Il m'a donc fallu créer une classe dérivée de wxDataObject personnalisée.
Pour le principe de fonctionnement du DnD avec wxWidgets: Lorsque l'on fait "copier" (ou que l'on démarre un DnD) : un objet dérivé de wxDataObject (appelons-le "wxMyDataObject-source" ) est à créer depuis l'application source. Il suffit d'appeler les bonnes méthodes de cet objet, avec les bons paramètres, pour lui transmettre les données à transférer.
Lorsque l'on fait "coller" (ou que l'on termine un DnD) : un second objet dérivé de wxDataObject (appelons-le "wxMyDataObject-destination" ) est à créer depuis l'application destination. Il faut ensuite appeler la méthode "GetData" de l'objet "wxTheClipboard", avec en paramètre une référence vers l'objet "wxMyDataObject-destination".
Le système va se charger de demander à "wxMyDataObject-source" la taille des données à transférer. Il va ensuite créer une zone tampon ayant cette taille, et il va pouvoir demander à "wxMyDataObject-source" de copier les donner dans ce tampon (méthode GetDataHere(void *buf) ). Il lui reste ensuite à demander à "wxMyDataObject-destination" de récupérer les données en lui indiquant où elles se trouvent, et leur taille (méthode SetData(size_t len, const void *buf) ).
Dans l'exemple du snippet, il passe comme données le pointeur vers l'objet "wxMyDataObject-source". C'est très risqué : si il ne récupère pas les données que contient cet objet, et qu'il relance un Dnd avant de la faire, l'objet "wxMyDataObject-source" est détruit, afin d'être remplacé par un autre, et du coup, un appel au premier pointeur mènera vers un joli crash.
J'espère avoir été à peu près clair dans mes explications : si ce n'est pas le cas, n'hésites pas... @+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà ... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
|
PaowZ (Membre)
Inscrit le : 04-02-2008
Messages: 16
Snippets: 0
Tutoriels: 0
Hors ligne |
Merci Xaviou.
Dans le principe, je saisis à peu près ce qu'il faut faire. En ce qui me concerne, c'est le transfert de données complexes (instance de classe) qui m'intéresserait, mais autant ce système fonction avec des struct en mémoire, autant avec des classes, je suis plus sceptique, sans compter qu'effectivement, il faut que l'instance soit toujours en vie au moment où on accède au pointeur depuis la destination. Je vais creuser un peu.. 
EDIT: j'ajoute que j'ai tenté de compiler cette tournure (*pBuf) mais j'obtiens error: `void*' is not a pointer-to-object type.. ptetre une option à activer dans le compilo ou quoi.. quoiqu'il en soit, le compilateur n'est pas censé s'y retrouver, si on déréférence un pointeur de type void pour y placer des données.. C'est une erreur à mon avis.
Dernière modification par PaowZ (12-03-2010 10:31:35)
|
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne |
Salut.
Il me semble bien que c'est indiqué dans la doc (la flemme de relire...) : il n'est pas conseillé de passer une classe avec cette méthode. D'ailleurs, l'exemple DnD utilise une struct.
Pour palier à ce problème, voici ce que j'ai récemment fait : Les données à copier/coller sont en fait une arborescence de classes : une classe qui peut avoir un ou plusieurs enfants sur un ou plusieurs niveaux. Comme mes classes possèdent ce qu'il faut pour pouvoir être enregistrées dans un fichier xml, et lues depuis ce même fichier, je me suis servi de ce format pour passer les données d'un wxDataObject à un autre : Lorsque l'objet source est créé, je lui passe la classe de plus haut niveau, et il se charge d'en faire une représentation xml en mémoire Lorsque l'objet destination demande les données, on lui passe la représentation xml présente en mémoire, et il décode tout ça comme il le ferait pour lire le fichier xml depuis le disque dur.
Et ça marche du feu de dieu !...
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà ... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
|
PaowZ (Membre)
Inscrit le : 04-02-2008
Messages: 16
Snippets: 0
Tutoriels: 0
Hors ligne |
Tu as fait une forme de sérialisation, en fin de compte. J'avais pensé à ça aussi.. faut passer par un système formaté, de toute manière, apparement. La transmission directe d'instances est exclue. Je vais y jeter un oeil ici http:/wiki.wxwidgets.org/Object_seriali … TI_and_XML
Dernière modification par PaowZ (13-03-2010 15:57:04)
|
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne |
C'est un peu le principe, sauf que je ne connaissais pas cette méthode : j'ai tout fait "à la main" 
Mais le résultat est le même.
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà ... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
|
|