Autore Topic: [RISOLTO] gestione array dinamici (come array d'oggetti)  (Letto 416 volte)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
definizione vettore:
Private ButtonMedia As New Button[]
Private Selezionato As Integer

Aggiunta pulsante:
Codice: [Seleziona]
Public Sub Button_AddMedia_Click()
Dim BT As Button
Dim DurataInSecondi As Integer
Dim Fine As Date  

  If FileChooser_Media.SelectedPath = "" Then Return

  CheckBox_Saved.Value = False  'indico al software che la playlist e' stata modificata e e' da salvare

  Label_end_time.Hide

  ScrollView_TimeLine.Arrangement = 0   '0 = none
  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[Indice - 1].Top + ButtonMedia[indice - 1].Height
    Endif
    
    
    .Left = Label_start_time.Left - 5
    .Font.Size = Me.Font.Size - 3
    .Width = Label_start_time.Width + 10
    .Border = 1
    DurataInSecondi = LenghtFromFile(FileChooser_Media.SelectedPath)
    '.Height = (DurataInSecondi / 86400) * ScrollView_TimeLine.Height
    .Height = Max(DurataInSecondi / zoom, 16)
    .Tag = DurataInSecondi
  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[indice - 1].Top + ButtonMedia[Indice - 1].Height + 1
  Label_end_time.Text = DateAdd(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.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


questo il codice dell'eliminazione del pulsante:
Codice: [Seleziona]
Public Sub Button_Remove_Click()
Dim risultato As Integer

  risultato = Message.Question("Vuoi veramente eliminare " & ButtonMedia[Selezionato].Text & " dalla playlist?", "si", "no", "cancel")
  If risultato <> 1 Then Return
  
   ButtonMedia[Selezionato].Delete
   ButtonMedia.Resize(ButtonMedia.Count - 1)    'ho qualche dubbio su questo .. non e' che dal vettore 1 2 3 eliminando il 2  mi ritorna 1 2 invece che 1 3 ?
  
    Selezionato = ButtonMedia.Find(Last)
    
    Dec indice
End
codice che NON funziona se viene eliminato il bottone da codice:
Codice: [Seleziona]
Public Sub Tasto_Click()
Dim I As Integer
Dim BT As Button

  Selezionato = ButtonMedia.Find(Last)
  
  For Each bt In ButtonMedia
    bt.Font.Bold = False            '--------------- qui' mi da' invalid object !!!!!
  Next
  
  ' For i = 0 To ButtonMedia.Count - 1
  '   ButtonMedia[i].Font.Bold = False
  ' Next
  
  ButtonMedia[Selezionato].Font.Bold = True
  
End
PS: il codice funziona bene se non ci sono eliminazioni ma solo aggiunte al vettore



.........
« Ultima modifica: 03 Luglio 2014, 16:38:03 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.608
  • Ne mors quidem nos iunget
    • Mostra profilo
Usando il metodo .Delete tu distruggi l'oggetto presente nell'elemento del vettore, e pur utilizzando il metodo .Resize() non ripristini la presenza di un contenuto nell'indice, in cui è stato distrutto l'oggetto di tipo Button, né elimini l'elemento ormai svuotato del Button.

Suggerirei di utilizzare il metodo .Remove() della Classe Button congiuntamente con il metodo .Delete per cancellare dal contenitore il Button precedentemente creato:
Codice: gambas [Seleziona]
......
 ButtonMedia[Selezionato].Delete()

 ButtonMedia.Remove(Selezionato)
......
« Ultima modifica: 03 Luglio 2014, 16:38:17 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
yes risolve!
se corri, morirai stanco (motto degli sniper)