Autore Topic: Ponendo Form, come Control, in una funzione Balloon crea un altro Form simile  (Letto 2235 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Vi rappresento uno strano fenomeno che ho riscontrato facendo alcune prove con l'oggetto "Balloon".

Su un Form ho posto una semplice TextEdit. Poi ho scritto le seguenti righe di codice:
Codice: gambas [Seleziona]

Public Sub TextEdit1_Enter()

  Balloon.Info("Testo qualsiasi", Form)

End

Come è possibile vedere, volendo far apparire il Balloon sul Form, ho posto come nome del Controllo (al quale legare il Balloon) non la parola FMain, né Me; bensì proprio Form.

Ebbene, se, lanciando il progetto e aprendosi il Form, il puntatore del mouse si trova casualmente all'interno della TextEdit, si scatena ovviamente subito l'evento previsto nel codice e... compare - seppur ridimensionato - un altro Form, avente lo stesso nome del Form principale !
???
Questa cosa accade anche se faccio entrare due volte consecutivamente il puntatore del mouse all'interno della TextEdit.

Aggiungo un altro fenomeno paranormale: se all'interno della routine dell'evento _Enter() prevedo la dichiarazione ed istanziazione di un oggetto qualsiasi, con proprio genitore il Form:
Codice: gambas [Seleziona]

Public Sub TextEdit1_Enter()

  Dim bt As Button
  
  With bt = New Button(Form)
    .Y = 300
    .W = 100
    .H = 50
    .Caption= "Alibabà"
  End With

   Balloon.Info("Testo qualsiasi", Form)

End

ebbene, nel nuovo Form vedo generato quell'oggetto !



Aggiungo che:

1) se, invece di scrivere l'evento riferito alla TextEdit, pongo l'evento _Enter con riferimento al Form:
Codice: gambas [Seleziona]

Public Sub Form_Enter()

  Balloon.Info("Testo qualsiasi", Form)

End

allora basterà entrare una volta soltanto con il mouse all'interno del Form del programma, perché si generi - oltre al previsto Ballon - il nuovo Form ridimensionato.


2) se pongo questo codice:
Codice: gambas [Seleziona]
Private bt As Button


Public Sub Form_Open()
  
  With bt = New Button(Form)
    .W = 100
    .H = 100
    .Caption = "Alibabà"
  End With
  
End


Public Sub Form_Enter()

   Balloon.Info("testo qualsiasi", Form)

End

lanciando il programma, il Form del programma medesimo non presenta il Button istanziato nella routine di apertura del Form del progetto. Entrando, successivamente, con il mouse sul Form del programma, viene generato - come ormai è chiaro -  un secondo Form ridimensionato, all'interno del quale è presente quel Button !


    :rolleyes:
« Ultima modifica: 01 Febbraio 2013, 16:18:08 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 Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
In effetti la cosa è curiosa, però sfruttabile. Non saprei come però. :)
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
In effetti la cosa è curiosa, però sfruttabile. Non saprei come però.

 E' come se io avessi scoperto una cosa nuova. Ho il diritto di attribuirle un nome: è una prerogativa riconosciuta a tutti gli scopritori.
Quel fenomeno lo chiameremo: vuottazione.   ;D

...ma forse è solo un bug !   :-X
« 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 Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Prova a farla vedere nella M.L.I. e facci sapere cosa ti dicono.
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Prova a farla vedere nella M.L.I. e facci sapere cosa ti dicono.

Sì, ho già posto la questione, ma ancora non mi risponde nessuno.
« 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 md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
E' SICURAMENTE un'anomalia...

La chiamata diretta ad un oggetto, che si presuppone non statico, non può essere fatta se questo non viene prima istanziato, ovvero creato.

Nei casi che hai verificato, è come se Form sia presente a livello statico in gambas, e quindi richiamabile come una funzione.

Quindi, a mio avviso, questa è un'anomalia, che non può essere sfruttata, in quanto può portare a conseguenze impreviste.
Se non è così, la cosa và fuori logica, a meno che non vi sia una spiegazione, che credo difficile, in quanto crea un mucchio di confusione nella programmazione, con le relative conseguenze, negative, in particolare perchè fuori controllo...

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
E' SICURAMENTE un'anomalia...

Condivido la tua opinione, stante anche la tua spiegazione.

Ancora ora non ho ricevuto notizie da Minisini al riguardo.  :-\

Ho riproposto la questione nella Mailing List Internazionale.
« Ultima modifica: 31 Gennaio 2013, 15:59:26 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 milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Probabilmente L'oggetto form e' statico... provate a fare questo in un modulo che sia impostato come classe di avvio:

Public Sub Main()
 
  Form.Show
 
End

Ebbene senza essere istanziata si aprira' un form...

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Probabilmente L'oggetto form e' statico... provate a fare questo in un modulo che sia impostato come classe di avvio:

Public Sub Main()
 
  Form.Show
 
End

Ebbene senza essere istanziata si aprira' un form...

Confermo quanto descritto da Milio. Aggiungo anche che la dimensione del nuovo Form è identica a quella del nuovo Form ottenuto nel caso da me descritto. Inoltre, in entrambi i casi i due nuovi Form hanno il nome visibile del proprio Form principale.

Dunque...?
« 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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Ho avuto una prima risposta dalla M.L.I., seppur non da Minisini. Ve la riporto:

« I guess Gambas creates the control you are referring (Form is class, and
so, not proper object to refer).

I think Gambas should raise error instead.

Jussi
»
« 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 sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Probabilmente L'oggetto form e' statico... provate a fare questo in un modulo che sia impostato come classe di avvio:

Public Sub Main()
 
  Form.Show
 
End

Ebbene senza essere istanziata si aprira' un form...

Confermo quanto descritto da Milio. Aggiungo anche che la dimensione del nuovo Form è identica a quella del nuovo Form ottenuto nel caso da me descritto. Inoltre, in entrambi i casi i due nuovi Form hanno il nome visibile del proprio Form principale.

Dunque...?

La spiegazione potrebbe consistere nel fatto che, creando un nuovo progetto grafico, Gambas istanzia una nuova FORM per disegnare la FMain; l'istanza probabilmente è chiamata Form. Da qui l'anomalia.
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Probabilmente L'oggetto form e' statico... provate a fare questo in un modulo che sia impostato come classe di avvio:
Public Sub Main()
  
  Form.Show
  
End

Ebbene senza essere istanziata si aprira' un form...

Volevo aggiungere che, pur non volendo scomodare un modulo, si avrà il medesimo risultato:
Codice: gambas [Seleziona]
Public Sub Form_Open()
  
  Form.Show
  
End



Senza dover impostare un modulo, si può creare, alla bisogna (immaginate ad esempio per creare con poco codice un MessageBox personalizzato), velocemente un Form, distruttibile egualmente in modo veloce:
Codice: gambas [Seleziona]

Private bt As Button


Public Sub Button1_Click()

  Dim tl As TextLabel

   With Form
     .Show
     .Center
     .W = 400
     .H = 300
     .Background = Color.Yellow
     .Caption = "Nuovo Form ausiliario"
   End With

   With tl = New TextLabel(Form)
     .X = 200
     .Y = 200
     .W = 100
     .H = 50
     .Background = Color.Orange
     .Text = "alibaba"
   End With

   With bt = New Button(Form) As "tasto"
     .X = 20
     .Y = 20
     .W = 100
     .H = 50
     .Caption = "alibaba"
   End With

End


Public Sub tasto_Click()
  
    Print "Il Form ausiliario sarà distrutto fra 2 secondi !"

    Wait 2
  
    Form.Close
  
End
« Ultima modifica: 02 Febbraio 2013, 03:13:22 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 Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Lo sapevo che la cosa era sfruttabile. 8)
Ora vai a fare lo sborone nella M.L.I. ;D
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
ottimo lavoro ... ma se chiudono il bug ti rovinano il giochetto ;-)
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
ottimo lavoro ... ma se chiudono il bug ti rovinano il giochetto ;-)

Meglio un bug in meno, che una vuottazione ;D in più !
« 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. »