Gambas-it

Gambas3 => Programmazione => Topic aperto da: Gilby - 09 Maggio 2018, 16:51:57

Titolo: drag and drop su array di oggetti
Inserito da: Gilby - 09 Maggio 2018, 16:51:57
Salve ragazzi!
Ho creato un array di oggetti di tipo PictureBox, una cosa del genere:

For i = 0 To max - 1
    For j = 0 To max - 1
 With pos[i, j] = New PictureBox(Me)
        .Background = Color.White
        .W =123
        .H = 123
        .x = 123
        .Y = 123
        .Drop = True
        .Picture = Picture.Load("nomeimg.xxx")
 
       
      End With
 next
next

Avete una soluzione per fare un drag and drop tra le varie picturebox dell'array?  Creando direttamente l'oggetto dal form mi basta creare semplicemente la funzione "public sub pictureboxX_mousedrag()", ho provato così ma nulla, ho provato altre soluzioni ma con scarso successo, grazie in anticipo a chi mi aiuterà.
Titolo: Re:drag and drop su array di oggetti
Inserito da: Gianluigi - 09 Maggio 2018, 19:08:32
Potresti allegare un progettino che esemplifichi quello che vai cercando.
Sarà senz'altro colpa mia, ma non ho capito cosa vuoi fare  e cos'è che già hai.

 :ciao:
Titolo: Re:drag and drop su array di oggetti
Inserito da: vuott - 09 Maggio 2018, 22:54:08
Avete una soluzione per fare un drag and drop tra le varie picturebox dell'array?

A mio avviso devi basarti soprattutto sul 2° esempio presente in questa agina della nostra WIKI:
http://www.gambas-it.org/wiki/index.php?title=Codice_essenziale_per_effettuare_il_Drag-Drop_di_un%27immagine
Titolo: Re:drag and drop su array di oggetti
Inserito da: Gilby - 10 Maggio 2018, 09:24:00
Potresti allegare un progettino che esemplifichi quello che vai cercando.
Sarà senz'altro colpa mia, ma non ho capito cosa vuoi fare  e cos'è che già hai.

 :ciao:

Certo, prima di tutto ho fatto un po' di confusione, è una matrice e non un array, devo creare questa matrice di picturebox come se fosse una dama, ho scritto giusto un codice di esempio.


Avete una soluzione per fare un drag and drop tra le varie picturebox dell'array?

A mio avviso devi basarti soprattutto sul 2° esempio presente in questa agina della nostra WIKI:
http://www.gambas-it.org/wiki/index.php?title=Codice_essenziale_per_effettuare_il_Drag-Drop_di_un%27immagine

L'avevo già vista ed ho già provato in questo modo, purtroppo non va, ho provato a dare un nome ad ogni elemento della matrice (es. .name=picturebox1) così da poter applicare l'esempio che hai condiviso, ma purtroppo nulla...
Titolo: Re:drag and drop su array di oggetti
Inserito da: vuott - 10 Maggio 2018, 14:01:53
Potresti allegare un progettino che esemplifichi quello che vai cercando.

Certo, prima di tutto ho fatto un po' di confusione, è una matrice e non un array, devo creare questa matrice di picturebox come se fosse una dama, ho scritto giusto un codice di esempio.
Gianluigi ha inteso chiederti di mostrarci la parte "importante" del progetto, ossia il meccanismo da te escogitato per ottenere il Drag and Drop fra le varie PictureBox della matrice, non il codice per creare la matrice di PictureBox !



...ho provato a dare un nome ad ogni elemento della matrice (es. .name=picturebox1)
A mio avviso un punto fondamentale è l'assegnazione delle PictureBox ad un unico Gruppo di Eventi.
Titolo: Re:drag and drop su array di oggetti
Inserito da: allegfede - 10 Maggio 2018, 14:13:07
tempo fa' ebbi un problema simile, risolsi "acchiappando" l'id dell'oggetto:
Codice: [Seleziona]
' Gambas class file

'per gestire i TASTI virtuali
Private Indice As Integer
Private ButtonMedia As New Button[]

Private Selezionato As Integer


Public Sub Button_AddMedia_Click()
Dim BT As Button

  With BT = New Button(ScrollView_TimeLine) As "Tasto"
    .Text = File.Name(FileChooser_Media.SelectedPath)
    .Tooltip = FileChooser_Media.SelectedPath
   
    If ButtonMedia.Count = 0 Then
      .Top = Label_start_time.Top + Label_start_time.Height + 1 'ma come e' che sembra vadano una dopo l'altra anche se non ho inserito il codice opportuno?
      Else
        .Top = ButtonMedia[ButtonMedia.Count - 1].Top + ButtonMedia[ButtonMedia.Count - 1].Height
    Endif
   
    .Left = Label_start_time.Left - 5
    .Font.Size = Me.Font.Size - 3
    .Width = Label_start_time.Width + 10
    .Border = 1

  End With

  ButtonMedia.Add(BT)
  Inc Indice

  'e sposta la label di fine programmazione in coda a questo ultimo evento ... aggiornando il display della fine
  Label_end_time.Top = ButtonMedia[ButtonMedia.Count - 1].Top + ButtonMedia[ButtonMedia.Count - 1].Height + 1
  Label_end_time.Text = DateAdd(CDate(Label_end_time.Tag), gb.Second, DurataInSecondi)   'mhhh se sommi con la fine oltre la mezzanotte da' errore!!!!!
  If Not (Label_end_time.Text Like "[0-2][0-9]:[0-5][0-9]:[0-5][0-9]") Then
    'se c'e' un errore probabilemnte e' perche'ì con questo video si scavalla la mezzanotte! Questo e' L'ULTIMO video che si puo' inserire per questa giornata!!!!
    ' Fine = (DateAdd(DateChooser_Giornata.Value, gb.Day, 1))
    ' Label_end_time.Text = Day(Fine) & "-" & Month(fine) & "-" & Year(fine)
    Label_end_time.Text = Format(DateAdd(DateChooser_Giornata.Value & " " & Label_end_time.Tag, gb.second, DurataInSecondi), "dd/mm/yyyy hh:nn:ss")
    Label_end_time.Background = Color.Red
    Label_end_time.Show
    Button_AddMedia.Enabled = False
    Else
        Label_end_time.Background = Color.LightForeground
        Label_end_time.Show
  Endif
  Label_end_time.Tag = Label_end_time.Text
 
  'SALVA l'ultima cartella aperta come default per la prossima esecuzione
  Settings["FileChooser/LastFolder"] = FileChooser_Media.SelectedPath
End



Public Sub Tasto_Click()
Dim BT As Button

  Selezionato = ButtonMedia.Find(Last)

  If Selezionato = -1 Then Return

    For Each bt In ButtonMedia
      bt.Font.Bold = False
    Next
 
  ButtonMedia[Selezionato].Font.Bold = True
 
End
Titolo: Re:drag and drop su array di oggetti
Inserito da: vuott - 10 Maggio 2018, 14:25:13
Guardate........ il problema di Gilby - lo ripeto - sta nella mancata assegnazione di ogni PictureBox creata ad un unico Gruppo di Eventi (come descritto nel 2° esempio della pagina della Wiki da me sopra citata).
Titolo: Re:drag and drop su array di oggetti
Inserito da: Gilby - 10 Maggio 2018, 15:23:18
Potresti allegare un progettino che esemplifichi quello che vai cercando.

Certo, prima di tutto ho fatto un po' di confusione, è una matrice e non un array, devo creare questa matrice di picturebox come se fosse una dama, ho scritto giusto un codice di esempio.
Gianluigi ha inteso chiederti di mostrarci la parte "importante" del progetto, ossia il meccanismo da te escogitato per ottenere il Drag and Drop fra le varie PictureBox della matrice, non il codice per creare la matrice di PictureBox !



...ho provato a dare un nome ad ogni elemento della matrice (es. .name=picturebox1)
A mio avviso un punto fondamentale è l'assegnazione delle PictureBox ad un unico Gruppo di Eventi.

In poche parole devo creare una matrice come se fosse una dama, il meccanismo utilizzato è lo stesso dell'esempio che tu mi hai proposto, l'unica differenza è che non ho inserito le picturebox in un unico gruppo,



tempo fa' ebbi un problema simile, risolsi "acchiappando" l'id dell'oggetto:
Codice: [Seleziona]
' Gambas class file

'per gestire i TASTI virtuali
Private Indice As Integer
Private ButtonMedia As New Button[]

Private Selezionato As Integer


Public Sub Button_AddMedia_Click()
Dim BT As Button

  With BT = New Button(ScrollView_TimeLine) As "Tasto"
    .Text = File.Name(FileChooser_Media.SelectedPath)
    .Tooltip = FileChooser_Media.SelectedPath
   
    If ButtonMedia.Count = 0 Then
      .Top = Label_start_time.Top + Label_start_time.Height + 1 'ma come e' che sembra vadano una dopo l'altra anche se non ho inserito il codice opportuno?
      Else
        .Top = ButtonMedia[ButtonMedia.Count - 1].Top + ButtonMedia[ButtonMedia.Count - 1].Height
    Endif
   
    .Left = Label_start_time.Left - 5
    .Font.Size = Me.Font.Size - 3
    .Width = Label_start_time.Width + 10
    .Border = 1

  End With

  ButtonMedia.Add(BT)
  Inc Indice

  'e sposta la label di fine programmazione in coda a questo ultimo evento ... aggiornando il display della fine
  Label_end_time.Top = ButtonMedia[ButtonMedia.Count - 1].Top + ButtonMedia[ButtonMedia.Count - 1].Height + 1
  Label_end_time.Text = DateAdd(CDate(Label_end_time.Tag), gb.Second, DurataInSecondi)   'mhhh se sommi con la fine oltre la mezzanotte da' errore!!!!!
  If Not (Label_end_time.Text Like "[0-2][0-9]:[0-5][0-9]:[0-5][0-9]") Then
    'se c'e' un errore probabilemnte e' perche'ì con questo video si scavalla la mezzanotte! Questo e' L'ULTIMO video che si puo' inserire per questa giornata!!!!
    ' Fine = (DateAdd(DateChooser_Giornata.Value, gb.Day, 1))
    ' Label_end_time.Text = Day(Fine) & "-" & Month(fine) & "-" & Year(fine)
    Label_end_time.Text = Format(DateAdd(DateChooser_Giornata.Value & " " & Label_end_time.Tag, gb.second, DurataInSecondi), "dd/mm/yyyy hh:nn:ss")
    Label_end_time.Background = Color.Red
    Label_end_time.Show
    Button_AddMedia.Enabled = False
    Else
        Label_end_time.Background = Color.LightForeground
        Label_end_time.Show
  Endif
  Label_end_time.Tag = Label_end_time.Text
 
  'SALVA l'ultima cartella aperta come default per la prossima esecuzione
  Settings["FileChooser/LastFolder"] = FileChooser_Media.SelectedPath
End



Public Sub Tasto_Click()
Dim BT As Button

  Selezionato = ButtonMedia.Find(Last)

  If Selezionato = -1 Then Return

    For Each bt In ButtonMedia
      bt.Font.Bold = False
    Next
 
  ButtonMedia[Selezionato].Font.Bold = True
 
End

Mi leggo bene il tuo codice e ti faccio sapere se risolvo, grazie!
Titolo: Re:drag and drop su array di oggetti
Inserito da: vuott - 10 Maggio 2018, 16:44:07
....l'unica differenza è che non ho inserito le picturebox in un unico gruppo,

Puoi anche differenziare i "Gruppi" degli Eventi, senza inficiare il funzionamento principale desiderato, utilizzando per i diversi raggruppamenti di PictureBox il Metodo .Attach( ) della Classe Object (https://www.gambas-it.org/wiki/index.php/Assegnare_da_codice_pi%C3%B9_oggetti_ad_un_Gruppo_di_eventi).
Titolo: Re:drag and drop su array di oggetti
Inserito da: Gianluigi - 10 Maggio 2018, 19:04:32
Intanto potresti dare un'occhiata a questa finestra, se la vedi come da immagine allora puoi seguire i suggerimenti di vuott sugli spostamenti (drag e drop) e guardare anche questo (http://www.gambas-it.org/smf/index.php?topic=6238.msg43580#msg43580) , pensare a come limitare gli spostamenti in base al pezzo; ad esempio il cavallo si trova in 4x4 (contando da zero) le caselle a disposizione per lo spostamento, se libere dai pezzi bianchi, sono:
2x3 e 2x5 - 3x2 e 3x6 - 5x2 e 5x6 - 6x3 e 6x5.
Poi ... e poi...

Si lo so il cavallo fa schifo e anche la tastiera...  ;D

 :ciao: :ciao:
Titolo: Re:drag and drop su array di oggetti
Inserito da: vuott - 10 Maggio 2018, 19:42:14
Si lo so il cavallo fa schifo ....

Ti sei fatto "auto-scacco matto" !    ;D
Titolo: Re:drag and drop su array di oggetti
Inserito da: Gilby - 11 Maggio 2018, 10:48:25
Intanto potresti dare un'occhiata a questa finestra, se la vedi come da immagine allora puoi seguire i suggerimenti di vuott sugli spostamenti (drag e drop) e guardare anche questo (http://www.gambas-it.org/smf/index.php?topic=6238.msg43580#msg43580) , pensare a come limitare gli spostamenti in base al pezzo; ad esempio il cavallo si trova in 4x4 (contando da zero) le caselle a disposizione per lo spostamento, se libere dai pezzi bianchi, sono:
2x3 e 2x5 - 3x2 e 3x6 - 5x2 e 5x6 - 6x3 e 6x5.
Poi ... e poi...

Si lo so il cavallo fa schifo e anche la tastiera...  ;D

 :ciao: :ciao:

Mi sa che la tua è la migliore soluzione, non avevo pensato alla griglia!! Oggi provo con questa!! Grazie mille!!
Titolo: Re:drag and drop su array di oggetti
Inserito da: Gianluigi - 11 Maggio 2018, 12:03:34
Naturalmente la mia era solo una dimostrazione per far comprendere il meccanismo.
Immagino che la finestra dovrà contenere altre cose oltre la scacchiera, dovrai usare un altro contenitore che non sia la Form io consiglierei la drawing area.
Prima ti devi studiare bene il funzionamento dei contenitori nelle form che poi è la peculiarità e la forza di Gambas.
Se invece decidi di usare una finestra a parte tipo la dimostrazione allora cerca di dare tutte le misure tramite codice per evitarti sorprese in fase di visualizzazione tra le diverse distro.
 
:ciao: :ciao:
Titolo: Re:drag and drop su array di oggetti
Inserito da: Gianluigi - 11 Maggio 2018, 23:36:02
Da una febbricitante idea di vuott  ;D

Vedi file allegato

 :ciao: :ciao:
Titolo: Re:drag and drop su array di oggetti
Inserito da: vuott - 11 Maggio 2018, 23:40:05
...la febbre porta consiglio !    ;D
Titolo: Re:drag and drop su array di oggetti
Inserito da: vuott - 11 Maggio 2018, 23:50:05
Se alla proprietà ".Drop" della GridView nella routine " Public Sub Form_Open() "assegnamo il valore " True ", e se poi in fondo al tuo codice aggiungiamo queste due righe:

Codice: [Seleziona]
Public Sub GridView1_MouseDrag()
 
' Preleviamo e trasciniamo il testo individuando precisamente la cella della "GridView":'
  GridView1.Drag(GridView1[GridView1.RowAt(Mouse.Y), GridView1.ColumnAt(Mouse.X)].Text, "text/html")
 
  GridView1[GridView1.RowAt(Mouse.Y), GridView1.ColumnAt(Mouse.X)].Text = Null

End


Public Sub GridView1_Drop()
 
' Rilasciamo nella nuova cella della "GridView" il testo prelevato nell'altra cella:
  GridView1[GridView1.RowAt(Drag.Y), GridView1.ColumnAt(Drag.X)].Text = Drag.Data
 
End
sostanzialmente ci siamo.  :D