Gambas-it

Gambas3 => Programmazione => Topic aperto da: kicco - 08 Gennaio 2016, 11:07:26

Titolo: Come istanziare più oggetti con eventi diversi?
Inserito da: kicco - 08 Gennaio 2016, 11:07:26
 :ciao:
Come posso creare una serie di oggetti simili ma che rispondano a eventi diversi? Mi spiego meglio.
Ho creato:
Codice: [Seleziona]
' Gambas class file

Public But As Button

Public Sub PictureBox1_Drop()
  'VUOTO PER RICEVERE
End
Public Sub Button1_MouseDown()
  With But = New Button(Me) As "Bottone1"
   .H = 50
   .W = 50
   .X = 150
   .Y = 150
  End With
  Print But.name 'per controllo
End
Public Sub Bottone1_MouseDrag()
But.Drag("")
End
Public Sub PictureBox1_DragMove()
    With But
  .X = Drag.X
  .Y = Drag.Y
  End With
End
 
che ovviamente prevede una PictureBox1 e un Button1 nel form relativo.
Quando premo Button1 creo un nuovo pulsante se premo di nuovo, un'altro, ma rispondono tutti e due allo stesso evento (Button1).
Come faccio a creare una sequenza di Pulsanti che rispondano ad eventi diversi?
Spero di essere stato chiaro!
Nel wiki ho trovato un capitolo che forse vorrebbe spiegare questo caso:
http://www.gambas-it.org/wiki/index.php?title=Creare_pi%C3%B9_oggetti_del_medesimo_tipo (http://www.gambas-it.org/wiki/index.php?title=Creare_pi%C3%B9_oggetti_del_medesimo_tipo)
ma è in attesa di riempimento :)

 :ciao:
Titolo: Re:Come istanziare più oggetti con eventi diversi?
Inserito da: vuott - 08 Gennaio 2016, 11:32:55
Io non ho capito cosa vuoi dire con: "Pulsanti che rispondano ad eventi diversi".    ???
Titolo: Re:Come istanziare più oggetti con eventi diversi?
Inserito da: Gianluigi - 08 Gennaio 2016, 11:38:50
Se intendi sapere quale pulsante è stato premuto devi usare Last

 :ciao:
Titolo: Re:Come istanziare più oggetti con eventi diversi?
Inserito da: Gianluigi - 08 Gennaio 2016, 11:45:13
Questa (http://www.gambas-it.org/smf/index.php?topic=4615.msg37507#msg37507) recente discussione forse potrebbe ispirarti.

 :ciao:
Titolo: Re:Come istanziare più oggetti con eventi diversi?
Inserito da: kicco - 08 Gennaio 2016, 11:49:27
 :ciao: a tutti e due, premendo il pulsante Button1, creo un nuovo pulsante che poi posso draggare e droppare(!) sulla picturebox1.
Quel nuovo pulsante può generare  eventi Bottone1 (Bottone1_xxx ecc).
Ora, se lo premo una seconda volta, mi genera un nuovo bottone ma questo nuovo elemento genera sempre eventi Bottone1, vorrei che generasse eventi Buttone2 ecc. in modo da usare i due nuovi Bottoni separatamente.
 :)
Titolo: Re:Come istanziare più oggetti con eventi diversi?
Inserito da: vuott - 08 Gennaio 2016, 11:58:56
un nuovo pulsante che poi posso draggare e droppare(!) sulla picturebox1.
A me 'sta cosa non funziona.    ???
Titolo: Re:Come istanziare più oggetti con eventi diversi?
Inserito da: kicco - 08 Gennaio 2016, 12:01:54
 :P..a me si!

Ti allego "tutto" il progetto! ;D
Titolo: Re:Come istanziare più oggetti con eventi diversi?
Inserito da: vuott - 08 Gennaio 2016, 12:16:50
..a me si!
Ah, lo spostamento del bottone stando all'interno della PictureBox. Sì, provando il tuo esempio, funziona.

Dunque, per quel che riguarda il problema che hai posto, se ho capito bene, mi pare che tu voglia sostanzialmente che ogni nuovo Bottone sia attribuito ad un Gruppo degli eventi diverso.
Questa circostanza però ti impone la presenza nel codice di sub-routine preesistenti con i nomi di ciascun Gruppo che eventualmente andrai a creare.... ma come fai a sapere a priori  :-\ quanti nuovi Bottoni, e dunque quanti eventi, saranno creati ?   

Ritengo che il suggerimento di Gianluigi sia il più adeguato.
Titolo: Re:Come istanziare più oggetti con eventi diversi?
Inserito da: Gianluigi - 08 Gennaio 2016, 12:27:54
Non so se questo ti può aiutare, devi scrivere "bottone" in group del button1 ma non l'ho provato sul tuo progetto perché devo andare a mangiare:
Codice: [Seleziona]
Private i As Integer

Public Sub bottone_Click()

   Dim But As Control
 
  Inc i
  If Last.Name = "Button1" Then
    With But = New Button(Me) As "bottone"
     .H = 50
     .W = 50
     .X = 150
     .Y = 150
     .Name = "Button" & i     
    End With 
  Endif
  Print But.name 'per controllo

End

 :ciao:
Titolo: Re:Come istanziare più oggetti con eventi diversi?
Inserito da: kicco - 08 Gennaio 2016, 12:28:31
Citazione
Ah, lo spostamento del bottone stando all'interno della PictureBox. Sì, provando il tuo esempio, funziona.
probabilmente non hai attivato il drop nella Picturebox.
Citazione
ma come fai a sapere a priori quanti nuovi Bottoni
... allora non ero fuori strada (anch'io ero arrivato a questa constatazione) speravo che con un ciclo FOR si potesse
scrivere una roba tipo

FOR i =0 To 3
 With But = New Button(Me) As ("Bottone" & i)
NEXT

lo so non funziona!
 :hard:
Titolo: Re:Come istanziare più oggetti con eventi diversi?
Inserito da: vuott - 08 Gennaio 2016, 12:30:01
perché devo andare a mangiare
:rotfl:
Titolo: Re:Come istanziare più oggetti con eventi diversi?
Inserito da: kicco - 08 Gennaio 2016, 12:37:53
Grazie Gianluigi, anch'io sono prossimo a riempire la panza!
Poi ci provo!

Buompetito :)
Titolo: Re:Come istanziare più oggetti con eventi diversi?
Inserito da: vuott - 08 Gennaio 2016, 12:38:14
probabilmente non hai attivato il drop nella Picturebox.
Sì, hai ragione.   :-[    ;D


speravo che
Puoi più semplicemente fare:
Codice: [Seleziona]
Private n As Integer
.....
.....
Public Sub Button1_MouseDown()
With But = New Button(Me) As "Bottone" & CStr(n)
.....
Resta però il problema delle sotto-procedure degii eventi: vanno scritte preliminamente. Quindi salta tutta l'idea iniziale.
La soluzione è quella di Gianluigi... pre-pasti   :D
Unico Gruppo per gli eventi, e distingui ciascun bottone con la parola chiave Last.
...però non capisco il codice che ha scritto.   :-\
Io porrei Last nella sottoprocedura dell'Evento sollevato; evento comune all'unico Gruppo al quale appartengono i soli nuovi Bottoni creati da Button1.
Titolo: Re:Come istanziare più oggetti con eventi diversi?
Inserito da: Gianluigi - 08 Gennaio 2016, 13:53:33
Scusate ho inserito involontariamente un errore:
NO:
Codice: [Seleziona]
Dim But As Control
SI:
Codice: [Seleziona]
Private But As Control

 :ciao:

Dimenticavo: Inc va all'interno di If
Titolo: Re:Come istanziare più oggetti con eventi diversi?
Inserito da: kicco - 09 Gennaio 2016, 09:34:55
 :ciao:
@Vuott
Citazione
...però non capisco il codice che ha scritto.   :-\
intendi lo scopo di produrre pulsanti (Bottoni) differenti?
Titolo: Re:Come istanziare più oggetti con eventi diversi?
Inserito da: Gianluigi - 09 Gennaio 2016, 13:27:09
:ciao:
@Vuott
Citazione
...però non capisco il codice che ha scritto.   :-\
intendi lo scopo di produrre pulsanti (Bottoni) differenti?

Credo che si riferisse al mio codice, per meglio spiegarmi allego il tuo vecchio con i miei cambiamenti.

 :ciao:
PS: Ho sbagliato ancora scusate continuavo a non usare Last  ;D
Titolo: Re:Come istanziare più oggetti con eventi diversi?
Inserito da: vuott - 09 Gennaio 2016, 15:28:04
Adesso va bene.
Titolo: Re:Come istanziare più oggetti con eventi diversi?
Inserito da: Gianluigi - 09 Gennaio 2016, 18:01:20
Allego nuova versione in cui funziona lo spostamento di qualunque pulsante creato e non solo dell'ultimo.
Non ho capito il motivo della picturebox, direttamente sulla form funzionerebbe meglio.
 :ciao:
Titolo: Re:Come istanziare più oggetti con eventi diversi?
Inserito da: kicco - 10 Gennaio 2016, 20:26:34
 :ciao:
Grazie ad entrambi, ho provato e funziona, ora lo integro nel mio progetto.
A proposito, il progetto prevede che su una mappa (ecco perchè il picturebox) dove l'utente possa posizionare un certo numero di centraline (rappresentato per ora dai pulsanti) che poi può interrogare (leggendo dati attraverso una seriale) con un doppio click.
Ci lavoro e poi magari posto il prototipo.
E' una vecchia idea di rappresentazione sinottica già indagata quahttp://www.gambas-it.org/smf/index.php?topic=2993.msg30558#msg30558 (http://www.gambas-it.org/smf/index.php?topic=2993.msg30558#msg30558) a suo tempo.
Grazie ancora ;)
Titolo: Re:Come istanziare più oggetti con eventi diversi?
Inserito da: Gianluigi - 11 Gennaio 2016, 16:37:28
Secondo me l'uso di DnD per questo non serve, puoi spostare soltanto senza dover trascinare
Codice: [Seleziona]
' Gambas class file
'
Private But As Control
Private i As Integer = 1
Private s As String
Private px As Integer
Private py As Integer

Public Sub bottone_Click()   
 
  If Last.Name = "Button1" Then
    Inc i
    With But = New Button(Me) As "bottone"
     .H = 50
     .W = 50
     .X = 150
     .Y = 150
     .Name = "Button" & i     
     .Text = i - 1
    End With 
  Endif
  Print Last.Name 'per controllo'

End

Public Sub bottone_MouseMove()
 
  If Mouse.Right Then Return
  If s <> "Button1" Then
    With But
      .X += Mouse.X - px
      .Y += Mouse.Y - py
    End With
  Endif
 
End

Public Sub bottone_MouseDown()
 
  Dim c As Control
 
  If Mouse.Right Then Return
  s = Last.Name 
  For Each c In Me.Controls
    If c.Name = s Then
      But = c
      Break
    Endif     
  Next   
  px = Mouse.X
  py = Mouse.Y
  If s <> "Button1" Then But.Mouse = Mouse.SizeAll
 
 
End

Public Sub bottone_MouseUp()
 
  If Mouse.Right Then Return 
  But.Mouse = Mouse.Default
 
End

 :ciao: