Newsgroup: it.comp.lang.visual-basic
Titolo: [!]Drag Drop di controlli

Il seguente codice permette di eseguire Drag & Drop a Runtime dei
controlli inseriti su un form.
Lo ScaleMode previsto per i controlli(che lo hanno) e per il form e'
vbTwips.
La proprieta' DragMode dei controlli che possono essere "Draggati" (j.
perdono) deve essere impostata su 1-Automatic.
Il tutto si basa sull'uso di due Sub scritte ad hoc (DoDrag e DoDrop)
che vanno inserite rispettivamente negli eventi DragDrop e DragOver di
*tutti* i controlli presenti sul form (form incluso).
Il codice e' migliorabile (per esempio verificando che non vi siano
sovrapposizioni fra i controlli, ma e' comunque un punto di partenza ;)
Nell'esempio riportato sono inseriti in un form una Label (Label1) ed
una ListBox (List1).
Option Explicit
Private DragX As Single
Private DragY As Single
Private bDragging As Boolean
Private Sub Form_Load()
   bDragging = False
   Me.ScaleMode = vbTwips
End Sub
Private Sub DoDrag(State As Integer, X As Single, Y As Single)
   If State = vbEnter Then
      If Not bDragging Then
         bDragging = True
         DragX = X
         DragY = Y
      End If
   End If
End Sub
Private Sub DoDrop(Source As Control, Destination As Control, X As
Single, Y As Single, AllowDrop As Boolean)
   bDragging = False
   If AllowDrop Then
      If Destination Is Nothing Then
         Source.Left = (X - DragX)
         Source.Top = (Y - DragY)
      Else
         Source.Left = Destination.Left + (X - DragX)
         Source.Top = Destination.Top + (Y - DragY)
      End If
   Else
      If Source Is Destination Then
         Source.Left = Destination.Left + (X - DragX)
         Source.Top = Destination.Top + (Y - DragY)
      End If
   End If
End Sub
Private Sub Form_DragOver(Source As Control, X As Single, Y As Single,
State As Integer)
   Call DoDrag(State, X, Y)
End Sub
Private Sub Label1_DragOver(Source As Control, X As Single, Y As Single,
State As Integer)
   Call DoDrag(State, X, Y)
End Sub
Private Sub List1_DragOver(Source As Control, X As Single, Y As Single,
State As Integer)
   Call DoDrag(State, X, Y)
End Sub
Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)
   'In caso di Drop sul Form la Destinazione deve essere Nothing
   Call DoDrop(Source, Nothing, X, Y, True)
End Sub
Private Sub Label1_DragDrop(Source As Control, X As Single, Y As Single)
   Call DoDrop(Source, Label1, X, Y, True)
End Sub
Private Sub List1_DragDrop(Source As Control, X As Single, Y As Single)
   'Non e' possibile fare il drop degli altri controlli su questo
controllo
   '(Proprieta' AllowDrop della Sub DoDrop = False)
   Call DoDrop(Source, List1, X, Y, False)
End Sub
Lokar
--
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt

 controlli inseriti su un form.
ma tutto questo funziona anche con controlli inseriti a RunTime?
Se si, come???????????
grazie a tutti x l'interesse

 Se si, come???????????
Al prossimo post di questo tipo e' chiaro che finisci con un sonoro
PLONK nella mia Black List.
Se hai problemi con la tastiera, cambiala o perdi un po' del tuo tempo a
rimuovere i caratteri in eccesso.
Se hai problemi a copiare-incollare il codice in un progetto VB e a
"tentare" di adattare il codice ai tuoi scopi, cambia mestiere e anche
ng cortesemente.
Se vuoi la pappa pronta, puoi tornare all'asilo. Io personalmente ho
trovato la cosa stimolante ed ho impegnato molto tempo a tirar fuori un
po' di codice decente per metterti sulla buona strada. Il tuo impegno
dov'e'? (E resisto alla tentazione di scrivere un centinaio di punti
interrogativi)
Cio' detto, puoi contattarmi via e-mail e ti faccio una valida offerta
per sviluppare il programma di cui hai bisogno *oppure* puoi iniziare a
fare le cose da solo e quando incontri difficolta' posti *codice*, anche
non funzionante. Magari *dopo* aver compreso il problema che hai ed
averne individuato qualche possibile soluzione.
Lokar.PlonkingState = vbPending


 [SNIP]
Approposito:
Il primo che si azzarda a postare il codice postato, adattato per farlo
funzionare con controlli inseriti a run-time (io l'ho fatto cambiando
QUATTRO righe di codice rispetto a quelle del post originale) finisce
sulla mia Black List.
Lokar.fumante


 controlli inseriti su un form.
Un altro approccio al problema è quello di usare le API ReleaseCapture
e SendMessage, che permettono anche di ridimensionare i controlli,
però hanno la limitazione di funzionare solo su controlli che abbiano
un hWnd. Quindi no Label e Image, sì Picture e TextBox.
Interessa codice ? Non lo posto senza richieste perché il form di
esempio (commentato) è di 10K.
Sì, lo manderò al SC, ovviamente. :-)
Però lì (sotto Leonardo-DataRaptor) c'è già il controllo del Mes,
che è molto più completo (e usa un altro sistema ancora).
Bye, G.

 rimuovere i caratteri in eccesso.
ok, hai ragione e ti chiedo scusa pubblicamente, davanti a tutto il NG, ma
saresti cosi' genti da rispondere alla domanda precedente?
grazie, e scusa ancora

 saresti cosi' genti da rispondere alla domanda precedente?
   __      ____    __      _____   __  __  __  __      __
 _\ \ _  /\  _`\ /\ \    /\  __`\/\ \/\ \/\ \/\ \    _\ \ _
/\_` ' \ \ \ \_\ \ \ \   \ \ \/\ \ \ `\\ \ \ \/'/'  /\_` ' \
\/_>   <  \ \ ,__/\ \ \  _\ \ \ \ \ \ , ` \ \ , <.  \/_>   <_
  /\_, ,_\ \ \ \/  \ \ \_\ \ \ \_\ \ \ \`\ \ \ \\ \   /\_, ,_\
  \/_/\_\/  \ \_\   \ \____/\ \_____\ \_\ \_\ \_\ \_\ \/_/\_\/
     \/_/    \/_/    \/___/  \/_____/\/_/\/_/\/_/\/_/    \/_/

Forse e' un NO?

sono sufficientemente d'accordo con te, anche perchè stavo seguendo anche
l'altro thread più sotto "spostare una LABEL, ma come??".......
l'ultima richiesta di CICO è: come si recupera il valore di tag di una
label?
domanda che mi lascia quantomeno sbigottito!!!
:-)))
mi dà l'idea di uno che si è buttato a fare codice senza sapere minimamente
come risolverlo......
good coding!!!
Dim Igor as Igor.Damiani
Set Igor = New Igor.Damiani
Igor.Damiani.Angry=Lokar.Angry-25
Igor.PlonkingState=Not Lokar.PlonkingState
--
Igor Damiani
ig...@igordamiani.it
http://www.igordamiani.it
ICQ : 11847262

il problema e' ke non riesco a capire da manuali e quantaltro come
identificare una Label inserita a runtime in una Form.
Sono sicuro ke la difficolta' e' solo nella mia testa, ma ti assicuro ke non
sono tanto stupido,
 Ti chiedo solo un piacere, scrivi e prova tu un po di codice secondo le mie
specifiche:
crea 'n' Label a runtime messe in colonna in una posizione a scelta della
Form, dopodiche fai in modo che siano selezionabili e trascinabili, andrebbe
bene anke solo per due label.
Provaci, poi se gentilmente mi fai sapere come hai fatto te ne saro' grato a
vita
bye

 Igor.PlonkingState=Not Lokar.PlonkingState
Public Enum PlonkingStateConstants
    vbAutoPlonk = 0
    vbPending = 1
    vbPlonk = 2
End Enum
Vediamo, il tuo codice equivale a:
    Igor.PlonkingState = CInt(Not CBool(Lokar.PlonkingState))
ovvero
    CInt(Not CBool(vbPlonk))
ovvero
    CInt (Not True)
ovvero
    CInt (False)
ovvero
    0
ovvero
    vbAutoPlonk
...
Spiacente, ti sei autoplonkato. ;)
Lokar


 esempio (commentato) è di 10K.
hmmm... mi sa che ho un altro motivo per non postarlo, adesso.
Vero Lokar ? ;-)
Bye, G.

minc.........non è giusto!!!! non avevo le specifiche!!!!
ho fatto qualche ricerca, prima, giuro, ma non ho tornato niente, nè su
Google.....
nè sul sito comune.....
persino MSDN è carente, come al solito......
comunque a me il progetto proprio non partiva nemmeno, perchè non riuscivo
ad inizializzare la variabile Lokar: cosa devo aggiungere dei riferimenti?
sei freeware o shareware?
:-)))))))
basta, dai, smettiamola qua, se no andiamo avanti all'infinito!!!!
good coding!!!
(si vede che abbiamo voglia di andarcene a casa, vero?)


 postarlo, adesso. Vero Lokar ? ;-)
Per me puoi pure postarlo, personalemente sono curioso. Del resto dopo
averci perso tutto quel tempo (perso per l'appunto), mi sono anche
incuriosito su soluzioni alternative.
Inutile dire che non mi sono interessato ai vari OLEDragDrop ecc., che
sono senz'altro piu' stimolanti e potenti ;)
Comunque basta vedere il tenore dei suoi post, ma soprattutto delle sue
risposte *ad aiuto ottenuto*, per rendersi conto che non c'e' nulla da
fare:
http://groups.google.it/groups?hl=it&lr=&ie=ISO-8859-1&q=author%3ACICO&m
eta=group%3Dit.comp.lang.visual-basic


 incuriosito su soluzioni alternative.
OK, hai posta :-)
Bye, G.

 sono tanto stupido,
Ragazzo, tira un sospiro e prima di rispondere leggi qualche documento su
come si quota (puoi chiedere anche al Ng, anche se non è quello corretto).
Poi, ancora prima di postare e chiedere riordina le idee: è più facile
chiedere qualcosa quando si sa cosa si vuole chiedere.
Parlare di "controlli creati a runtime" non ha molto senso, primo perchè non
sono distinguibili da quelli messi a design, secondo perchè ci sono più di
un modo di "crearli" e bisogna indovinare quale hai usato tu.
Per ultimo, se le tue lacune in programmazione sono così grosse (non sai
ricavare la proprietà di una label?) forse è meglio che ti fermi un attimo,
ricominci il tuo libro dalla prima pagina, oppure chiedi al NG
*nello*specifico* cosa non ti è chiaro.
A volte anche una ricerca su MSDN (lo sai che la homepage dei CD di MSDN ha
un link alle basi con VB?) o su google non farebbe male.
Ciao
P.S.: se non tieni presenti questi punti sembrerà che non hai voglia di
sbatterti neanche un po' e il NG ti piglierà sempre a sassate :)
--
' // Initialize the expression evaluator
Engines.Evaluator = CreateObject("
http://www.neodatatype.net
")
' // you can find resources for and from the NG here!
Me.SitoComune = "
http://www.it-lang-vb.net
"