Autore Topic: salto condizionato con GOTO  (Letto 3457 volte)

Offline distuning

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
salto condizionato con GOTO
« il: 22 Luglio 2012, 19:49:00 »
Salve .... sara' stupida questa cosa ma come faccio a eseguire un salto condizionato con GOTO dopo ver selezionato radiobutton ?

Spego ho una form con un button_click e due radiobutton per scheglere una posizione tra due disponibili , quando seleziono una rdiobutton cliccando sul button textlabel mi deve ridare una scritta di esempio , questo usando l'istruzione GOTO quindi di salto condizionato !

public sub button_click

If  radiobutton1.value = true goto start1
else if radiobutton2.value = true goto start2
end if

public sub start1

textlabel1.text = " bottone 1"
return
end

public sub start2

textlabel1.text =" bottone 2"
return
end





grazie anticipatamente a tutti gli amici del forum

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: salto condizionato con GOTO
« Risposta #1 il: 22 Luglio 2012, 20:03:12 »
Start1 e Start2 sone delle sub quindi:

public sub button_click

If radiobutton1.value = true then
  start1()
else if radiobutton2.value = true then
  start2()
end if

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: salto condizionato con GOTO
« Risposta #2 il: 22 Luglio 2012, 21:57:02 »
Il GOTO fà parte di una vecchissima sintassi derivata dal Basic, ed era nata per ovviare ad alcune logiche non ancora implementate nei linguaggi.
Diciamo che però molto simile ad una call in c.

Ad ogni modo, io sconsiglio vivamente l'uso di questo tipo di approccio nei programmi, in quanto diventa poco leggibile, poco manutenibile, e poco controllabile. E poi il linguaggio fornisce tutti gli strumenti per evitare il GOTO.

Come poi ti ha risposto milio, quello che tu hai scritto è un corretto esempio di programmazione, e che poi ti ha evitato un inute goto...  :D

Offline distuning

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
Re: salto condizionato con GOTO
« Risposta #3 il: 23 Luglio 2012, 08:52:08 »
ciao md9327 , le sub non le ho dichiarate come click  ma solo come sub fittizie per metterci delle istruzioni da eseguire in base alla selezione del radiobutton .

Cosa fareste voi ? in pratica in base alla selezione del radiobutton  quando clicco il button devo eseguire una funzione contenuta in una determinata sub ....questo perche' ho diverse sub con diverse funzioni una diverse dalle altre  :hatecomputer:

in pratica mi occorre una struttura ordinata da riconoscere e modificare in base alla sub che desidero selezionare .

grazie anticipatamente

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: salto condizionato con GOTO
« Risposta #4 il: 23 Luglio 2012, 12:20:56 »
ciao md9327 , le sub non le ho dichiarate come click  ma solo come sub fittizie per metterci delle istruzioni da eseguire in base alla selezione del radiobutton .

Le sub non sono necessariamente legate ad un click o un altro qualsiasi evento. Le sub sono delle particolari funzioni che non restituiscono nulla. Quindi puoi usarle benissimo così...

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: salto condizionato con GOTO
« Risposta #5 il: 23 Luglio 2012, 12:30:16 »
Dall'ambiente di sviluppo, quando crei una form e i suoi componenti grafici, puoi attivare metodi che rispondono a determinati eventi dell'oggetto.
Ogni oggetto ha un suo set di eventi, che ovviamente riflettono la funzionalità dell'oggetto grafico.
Alcuni di questi eventi sono abbastanza comuni, come ad esempio il Click() del mouse, in quanto appunto sono elementi grafici e rispondono a stimoli da parte di device appositi.
Una volta che attivi uno dei metodi evento previsti, all'interno puoi mettere il codice che vuoi, rispondente alle funzionalità che vuoi creare.
Come spiegato anche in altre discussioni, è possibile definire metodi comuni che rispondono ad eventi scatenati dagli oggetti appartenenti allo stesso gruppo. Dalle proprietà dell'oggetto, c'è Group che serve appunto per questo. Associando più oggetti allo stesso gruppo, tutti gli eventi scatenati da questi oggetti, che hanno comune funzione, vengono gestiti da un singolo metodo. Ad esempio, il Click() verrà utilizzato da tutti gli appartenenti al gruppo che hai definito, e quindi avrai un solo metodo, nominato con il nome del gruppo, seguito dal tipo di evento (appunto <gruppo>_Click()).
Detto questo, con questo sistema, il GOTO non ha senso, e non ha ragione di esistere.

Per spiegare meglio cosa fà il GOTO: in pratica sposta l'esecuzione del codice, sotto determinate regole da te definite (es. in IF), in un punto definito all'interno della stessa funzione. Questo vuol dire che puoi definire dei punti all'interno della funzione, in cui è scritto un codice particolare, usato appunto per una determinata situazione. Un pò come funziona il TRY...CATCH...FINALLY (gestore errori), che definiscono dei punti che vengono chiamati se si presenta un errore o meno. E' un esempio non poco calzante, in quanto la gestione degli errori è particolare, ma ti può dare un'idea del concetto.
Il GOTO deriva da una logica, in cui semplificava in qualche modo, l'uscita da determinate situazioni, saltando da un codice ad un'altro. Questo però comportava un controllo approfondito di questi salti, in quanto facevano appunto "saltare" il flusso logico di una procedura. Data la sua relativa semplicità, veniva usato particolarmente dai neofiti, in quanto risolveva in qualche modo situazioni senza apparente via di uscita, ma ora, e in particolare con i nuovi linguaggi, non ha molto senso, ed è pure deleterio per le ragioni di cui sopra.

Offline distuning

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
Re: salto condizionato con GOTO
« Risposta #6 il: 23 Luglio 2012, 16:08:26 »
dicendola in termini tecnici con due righe di programma ?  :coder: .....

es :.....in base alla mia richiesta?

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: salto condizionato con GOTO
« Risposta #7 il: 23 Luglio 2012, 17:56:52 »
Codice: [Seleziona]
Public Sub Button1_Click()
...
<tuo codice>
...
End

Public Sub Button2_Click()
...
<tuo codice>
...
End
I nomi Button1 e Button2 corrispondono ai nomi degli oggetti Button che hai posizionato nella Form.
Quando clikki su Button1, si scatenza l'evento Button1_Click(), e viene eseguito il codice residente al suo interno.
Stessa cosa per Button2, a cui è collegata la funzione-evento Button2_Click()

Se vuoi unire in un'unica funzione-evento il click dei due pulsanti, devi impostare la proprietà Group con lo stesso nome (es. "MyButton"), e creare una funzione in questo modo:
Codice: [Seleziona]
Public Sub MyButton_Click()
...
<tuo codice>
...
End
E' ovvio che al suo interno, a questo punto non sai chi ha scatenato l'evento, ovvero se Button1 o Button2. In questo caso ti viene d'aiuto la keyword LAST, che ti restituisce l'oggetto che ha scatenato l'evento, quindi:
Codice: [Seleziona]
Public Sub MyButton_Click()
..Dim btn As Button
  If (btn = Button1) Then
    <tuo codice per il pulsante 1>
  Else
    <tuo codice per il pulsante 2>
  EndIf
...
End

Offline distuning

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
Re: salto condizionato con GOTO
« Risposta #8 il: 23 Luglio 2012, 18:52:33 »
quindi per chiamare una sub dovrei solo fare cosi' :

Public sub button_click() ' button che se cliccato controlla  il true o false dei due radiobutton

If  radiobutton1.value = true then start1
else if radiobutton2.value = true then start2
end if

public sub start1() ' sub da me dichiarata ma non presente sotto forma di bottone o quant'altro ...

textlabel1.text = " bottone 1"
return
end

public sub start2() ' sub da me dichiarata ma non presente sotto forma di bottone o quant'altro ...

textlabel1.text =" bottone 2"
return
end


a voi le correzzioni ...... mi necessita per forza una struttura del genere per il mio programma ...questo perche' in ogni sub fittizia devo mettere delle istruzioni esterne a quelle della button  , devo in pratica tramite il button click capire prima quale funzione devo eseguire tramite la selezione dei radiobutton  , e in base a d esso andare nella rispettiva sub che contiene i calcoli da eseguire sul file che apriro' tramite il dialog .....

grazie anticipatamente per gli interventi

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: salto condizionato con GOTO
« Risposta #9 il: 23 Luglio 2012, 19:49:47 »
Public sub button_click() ' button che se cliccato controlla  il true o false dei due radiobutton

If  radiobutton1.value = true then start1
else if radiobutton2.value = true then start2
end if

public sub start1() ' sub da me dichiarata ma non presente sotto forma di bottone o quant'altro ...

textlabel1.text = " bottone 1"
return
end

public sub start2() ' sub da me dichiarata ma non presente sotto forma di bottone o quant'altro ...

textlabel1.text =" bottone 2"
return
end


Questa parte qui:
If  radiobutton1.value = true then start1
else if radiobutton2.value = true then start2
end if
io la renderei così:
Codice: gambas [Seleziona]

 If radiobutton1.value = True Then start1
 If radiobutton2.value = True Then start2

o così:
Codice: gambas [Seleziona]

If radiobutton1.value = True Then
    start1
  Else
    start2
Endif


I "Return", poi, nelle sub-routine chiamate ritengo siano inutili, dato che tu non intendi ritornare alcun valore, e che il programma uscirà da solo da quelle sub-routine (infatti Milio li aveva eliminati nel suo esempio).

Sul GOTO, oltre alla spiegazione dell'ottimo md9327 puoi dare anche uno sguardo a questo piccolo pro-memoria nella nostra WIKI:
http://www.gambas-it.org/wiki/index.php/GOTO
« Ultima modifica: 23 Luglio 2012, 23:24:59 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 distuning

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
Re: salto condizionato con GOTO
« Risposta #10 il: 26 Luglio 2012, 14:50:46 »
Ciao , grazie mille per l'aiuto , l' intento mio era di saltare da una SUB ad un altra SUB  ma comunque va bene anche con questi esempi !

ringrazio tutti per gli interventi alla questione ...  :coder:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: salto condizionato con GOTO
« Risposta #11 il: 26 Luglio 2012, 15:32:04 »
l' intento mio era di saltare da una SUB ad un altra SUB 

Il "saltare" solitamente è definito come "chiamata", così come quando si "chiamano" delle funzioni interne o anche esterne al programma. La chiamata avviene nelle semplici modalità (per le funzioni esterne la cosa è solo un pochino più complessa) che ti sono state mostrate sopra.

 Cercavi forse qualcosa di diverso ?
« 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 distuning

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
Re: salto condizionato con GOTO
« Risposta #12 il: 27 Luglio 2012, 18:25:39 »
ciao vuott prova a scrivere pari pari queste istruzioni e vedrai degli errori ... mettici una form con due radiobutton e un button clic ...

Public sub button_click() ' button che se cliccato controlla  il true o false dei due radiobutton

If  radiobutton1.value = true then start1
else if radiobutton2.value = true then start2
end if

public sub start1() ' sub da me dichiarata ma non presente sotto forma di bottone o quant'altro ...

textlabel1.text = " bottone 1"
return
end

public sub start2() ' sub da me dichiarata ma non presente sotto forma di bottone o quant'altro ...

textlabel1.text =" bottone 2"
return
end

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: salto condizionato con GOTO
« Risposta #13 il: 27 Luglio 2012, 18:33:39 »
ci dici che messaggi di errore ti restituisce?

vista così, la procedura sembra abbastanza normale, due condizioni, in cui vengono chiamate due metodi della form.

Prova a metterci "Me." davanti alla chiamata dei due metodi (es. Me.start1())

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: salto condizionato con GOTO
« Risposta #14 il: 28 Luglio 2012, 02:51:01 »
ciao vuott prova a scrivere pari pari queste istruzioni e vedrai degli errori ... mettici una form con due radiobutton e un button clic ...
Ciao distuning,
ho fatto la prova come mi hai proposto ponendo quegli oggetti e copiando pari pari le istruzioni nel tuo messaggio.

Ebbene, il primo errore che emerge è: Unknown identifier: start1. Questo errore viene rilevato, poiché hai dimenticato  :violent: di porre l'istruzione di chiusura della routine: End. Dimenticando l'End di chiusura, l'intera sub-routine immediatamente successiva, e cioè "Public Sub start1()" entra a far parte della routine principale chiamante: Public Sub button_click().

Poi, ponendo l'End finale, viene rilevato un altro errore: "ELSE without If", poiché tu hai chiuso la riga dell'IF: If radiobutton1.value = True Then start1, e hai posto l'Else immediatamente dopo.
Come ti avevo già scritto, io quelle tue righe le scriverei così:
Codice: gambas [Seleziona]

Public Sub button_click() ' button che se cliccato controlla  il true o false dei due radiobutton

  If radiobutton1.value = True Then
      start1()
    Else
      start2()
   Endif

End


Public Sub start1() ' sub da me dichiarata ma non presente sotto forma di bottone o quant'altro ...

   textlabel1.text = " bottone 1"

End

Public Sub start2() ' sub da me dichiarata ma non presente sotto forma di bottone o quant'altro ...

   textlabel1.text = " bottone 2"

End

Ora fai tu la prova  :devil: e vedi se sorgono ancora quegli errori.  ;D

    :ciao:
« Ultima modifica: 28 Luglio 2012, 03:00: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. »