wxDev.fr, le portail francophone consacr  wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Pseudo
Mot de passe


Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

Membres en ligne : 0
Invits en ligne : 1

Valid XHTML 1.0 Transitional

Valid CSS2

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Utilisation générale wxWidgets
» DnD, question sur le tutoriel
Conversation : DnD, question sur le tutoriel
11-03-2010 13:56:14  DnD, question sur le tutoriel #1
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 :)

Dernire modification par PaowZ (11-03-2010 13:56:56)

11-03-2010 22:06:07  Re: DnD, question sur le tutoriel #2
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....
12-03-2010 10:19:29  Re: DnD, question sur le tutoriel #3
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.

Dernire modification par PaowZ (12-03-2010 10:31:35)

12-03-2010 17:39:34  Re: DnD, question sur le tutoriel #4
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....
13-03-2010 15:56:32  Re: DnD, question sur le tutoriel #5
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 :)

Dernire modification par PaowZ (13-03-2010 15:57:04)

13-03-2010 17:15:53  Re: DnD, question sur le tutoriel #6
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....
Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Utilisation générale wxWidgets
» DnD, question sur le tutoriel