Drag'n Drop de données

Programmation d'applications complexes
ZapMan

Drag'n Drop de données

Message par ZapMan »

Je suis en train de réaliser un éditeur de sons multifenêtres. J'ai déjà implanté le Drag'n Drop de fichiers sans problèmes. Je voudrais pouvoir réaliser un Drag'n Drop de données entre mes fenêtres ou vers d'autres éditeurs de sons (équivalent d'un copier/coller) mais je n'arrive vraiment pas à savoir comment faire. Le IDataObject du OLE API est-il implémenté dans Pure Basic ? Et si oui, comment l'utiliser ?
Merci de votre aide, j'ai passé des heures à décortiquer ce problème sans résultat. :evil:

ZapMan - Bleupiscines@lagoon.nc
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Essaye avec le presse-papier et les commandes PureBasic

GetClipboardText()

SetClipboardText(Texte$)

ClearClipboard()
ZapMan*

Drag'n Drop de données

Message par ZapMan* »

J'ai déjà implanté un copier/coller à l'aide des commandes API. Ce que je veux faire, c'est ajouter un DRAG AND DROP. Petite précision : ma fenêtre contient un dessin (une courbe représentant le signal son) réalisé à l'aide des commandes graphiques standards (plot, line, etc...). Mais les données qui sont copiées/collées et que je veux pouvoir déplacer à l'aide d'un drag and drop sont des extraits de son. La fonction permettant à l'utilisateur de sélectionner une partie du son pour pouvoir le "dragger" est déjà réalisée.
ZapMan
Messages : 393
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Drag'n Drop de données

Message par ZapMan »

Encore quelques précisions (et la prochaine fois, c'est promis, j'essayerai de rendre ma question plus claire au départ) :
- dans un gadget de type RichEdit, le Drag and drop marche automatiquement sans que l'on ait quoi que ce soit à gérer. :D
- pour les gadgets de type "Tree", Freak propose sur son site un code qui gère trés bien le Drag and Drop en entrée ou en sortie (windows comporte des API spécifiques pour le Drag and Drop sur les objets de ce type). :D
- mais quand les données à manipuler ne sont pas des données "standard", il semble que seules les fonctions proposées par OLE puissent faire l'affaire. Ces fonctions sont accessibles par l'intermédiaire d'un objet nommé IDataObject (ou IDataTarget ou IDataSource). Mais je ne sait pas du tout si (et comment) ces objets sont accessibles depuis PureBasic. Le header du C qui défini ces objets s'appelle objdli.h. Mais quand j'utilise le convertisseur de header fourni avec PureBasic, il néglige de traduire 90% du code inclu dans objdli.h :mad:
Tout obstacle est un point d'appui potentiel.
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Pour les questions principales je ne sais pas, mais pourquoi s'être embêté à utiliser les apis pour le copier/coller ? Y a-t-il des fonctions + interressantes que

GetClipboardData()
SetClipboardData()

?? Merci
ZapMan
Messages : 393
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Drag'n Drop de données

Message par ZapMan »

La doc dit :
. SetClipboardData()

Syntaxe

. SetClipboardData(Datatype, DataID)

Description

. Stocke les données dans le presse-papier. La valeur DataID doit être un ID valide d'objet.

. A ce jour un seul type de donnée est supporté:

#PB_ClipboardImage: colle l'image spécifiée dans le presse-papier. Pour obtenir un ID d'image utilisez la fonction ImageID().
et effectivement, comme mes données (un fichier WAVE) résident dans une zone mémoire, rien ne permet à SetClipboardData de connaître la longueur du segment à transférer dans le presse-papier.
Tout obstacle est un point d'appui potentiel.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

bon si j'ai bien compris :
tu ouvre le clipboard avec OpenClipboard_(WindowID(*)) où * = num de ta fenetre (tu peut tres bien directement metre le handle au lieu de passer par WindowID)
ensuite si tu veut metre ton son dans le clipboard tu utilise SetClipboardData_(#Type, *Buffer) où #Type peut prendre l'une des valeurs suivantes : Liste
biensur, il faut que *Buffer soit du meme type. Donc ici c'est #CF_WAVE qui nous interesse j'imagine :)
ensuit tu fait CloseClipboard_() de façon a partager le clipboard avec toutes les autre fenetre, si tu ne le met pas, le clipboard le refusera "l'acces".
et pour recuperer ton son, tu fait pareil avec *buffer = GetClipboardData_(#type)

voila, je suis pas un pro de l'api windows et j'ai pa essayer donc si ça marche pas, apelle Denis, c'est un crack lui dans ce domaine :D

en esperant que ça aurra repondu a ton atente :)
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

d'ailleur je pense a un truc, Fred, pourquoi tu n'a pas mis les autre type? tu etait presser ce jour là? lol d'apres ce que j'ai vu, il y a juste des constantes a rajouter :)
ZapMan
Messages : 393
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Message par ZapMan »

Tu n'y es pas tout à fait, Cederavic, parcequ'il faut commencer par vider le Clipboard avant de l'utiliser, ensuite il faut bloquer une zone de la mémoire dynamique dans laquelle on copie les données. Pour finir, on libère la mémoire au profit du clipboard. Je n'ai pas le code avec moi et il est un peu trop complexe pour que je me rappelle toutes les instructions. Mais si quelqu'un à un problème avec le clipboard, qu'il n'hésite pas à me mailer à bleupiscines@lagoon.nc, je lui envoi le code complet.
Mon copier/coller marche trés bien, merci.

Par contre, ce charmant échange ne règle pas mon problème : EST-CE QUE QUELQU'UN SAIT UTILISER IOBJECTDATA ???? ou saurait comment faire un Drag and drop (on dit en français, glisser/déposer) de données entre deux fenêtres (je rappelle que c'était ça, ma demande, pas le copier/coller) ? Siouplait, aidez-moi.....
Tout obstacle est un point d'appui potentiel.
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

j'avais pas fait attention, merci
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

essay de paser par les interface :)
ZapMan
Messages : 393
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Message par ZapMan »

Qu'est-ce que tu veux dire ?
Tout obstacle est un point d'appui potentiel.
Fred
Site Admin
Messages : 2651
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

cederavic a écrit :d'ailleur je pense a un truc, Fred, pourquoi tu n'a pas mis les autre type? tu etait presser ce jour là? lol d'apres ce que j'ai vu, il y a juste des constantes a rajouter :)
Explique moi juste comment on le fait sur Linux et je rajoute ces constantes 8)

ZapMan: Ca doit etre possible de le controler avec les interfaces, mais ca reste compliqué. Essaye de voir sur le forum anglais, y'a quelques personnes qui ont deja fait des choses similaires.
ZapMan
Messages : 393
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Drag'n Drop de données

Message par ZapMan »

Merci Fred et Cederavic, mais pardon d'être aussi ignorant : qu'est-ce que c'est que ces "interfaces" ???
Tout obstacle est un point d'appui potentiel.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

Explique moi juste comment on le fait sur Linux et je rajoute ces constantes
euh... ben euh... :roll:
Répondre