Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: Picavbg - 27 Febbraio 2010, 13:16:38

Titolo: [RISOLTO] Chiamata di form dipendenti dalla MainForm
Inserito da: Picavbg - 27 Febbraio 2010, 13:16:38
Approfittando dei problemi logici sull'uso di SQLite3, sto rivedendo il mio programma il quale all'avvio presenta una MainForm con la sua barra di menu, in cui è possibile scegliere la successiva funzione da svolgere. Ebbene, sto riflettendo sulla convenienza di utilizzare la MainForm come Form-padre e avviare attraverso le scelte da menu le Form-figlie quante sono le funzione selezionabili da menù. In VB,  se non ricordo male, il concetto di Form-padtre e Form-figlio non esiste, ma esiste quello di Form-modale. Ma dire Form-modale e Form-padre è la stessa cosa?

Ho guardato qualche discussione in cui md9327 ha fornito chiarimenti in merito, ma il dubbio m'è rimasto, come m'è rimasto il dubbio su quale metodo di chiamata form è più pratico fra:
1) non definire alcuna dipendenza fra Form ed effettuare le chiamate di volta in volta in maniera assolutamente libera (metodo SDI ?)
2) definire dipendenze fra form, in modo che alla chiusura del form chiamato il controllo ritorni al suo parent di provenienza (metodo MDI?)

È chiaro che, In merito all'argomento suesposto, ho pochissimi concetti, ma molto ben confusi. :D :D

Stabilito codesto necessario punto di partenza conoscitiva, dovrò poi relazionare adeguatamente i form fra di loro, nella speranza di non dover buttar giù ancora una volta il programma, intervenendo pesantemenete sul codice delle varie classi, come sto già facendo per la gestione dei dati di DB.

Ciao a tutti.
Titolo: Re: Chiamata di form dipendenti dalla MainForm
Inserito da: leo72 - 27 Febbraio 2010, 23:57:20
I form modali sono form particolari che vengono aperti chiamandoli con l'istruzione NomeForm.ShowModal.
Che cosa sono? In pratica sono form indipendenti dai primi ma la cui visualizzazione blocca l'esecuzione sul form appena aperto, in modo che l'utente non possa cliccare sul form da cui è stato avviato. Per capirsi sono modali le finestre di richiesta di input obbligatorio all'utente che anche il sistema spesso visualizza: o clicchi sul form in questione oppure il click su un'altra parte del desktop non è possibile.

La differenza fra SDI e MDI riguarda l'apparenza dell'applicazione. Un'applicazione SDI è un programma in cui per ogni funzione si apre una finestra indipendete: tanto per capirsi, è un'applicazione SDI Gimp, dove hai la finestra a SX per i tool, quella a DX per le info e poi un'altra finestra per l'immagine. Era SDI anche il vecchio Gambas 1.x.
Un'applicazione MDI è invece un programma in cui hai un contenitore principale all'interno del quale si gestiscono le finestre dei vari tool. Un esempio di applicazione MDI è Firefox, dove ogni scheda aperta è un'istanza a sé stante del browser, oppure lo stesso IDE di Gambas, dove hai tutto racchiuso all'interno di un'unica finestra.
Titolo: Re: Chiamata di form dipendenti dalla MainForm
Inserito da: Picavbg - 28 Febbraio 2010, 07:55:51
I form modali sono form particolari che vengono aperti chiamandoli con l'istruzione NomeForm.ShowModal.
Che cosa sono? In pratica sono form indipendenti dai primi ma la cui visualizzazione blocca l'esecuzione sul form appena aperto, in modo che l'utente non possa cliccare sul form da cui è stato avviato. Per capirsi sono modali le finestre di richiesta di input obbligatorio all'utente che anche il sistema spesso visualizza: o clicchi sul form in questione oppure il click su un'altra parte del desktop non è possibile.
Quindi, utilizzando form modali, se, mentre è attivo quel tipo di form, volessi andare accedere ad un alto documento, estraneo al programma Gambas attivo, o al form della classe chiamante, non avrei alcuna possibilità di farlo, perchè quella modalità me lo impedirebbe.
Allora un Form-figlio può non essere un Form-modale, mentre un Form-modale è un Form-figlio. Ho capito bene?
Ciao.

Titolo: Re: Chiamata di form dipendenti dalla MainForm
Inserito da: Berserker79 - 28 Febbraio 2010, 11:13:33
E' vero che richiamando un form con showmodal o showdialod, l'utente è obbligato ad agire su quest'ultimo, ma è anche vero che se il form da cui viene richiamato ha un menù, questo, stranamente, è consultabile dall'utente, vanificando in parte la chiamata di tipo modale.
Ciao.
Titolo: Re: Chiamata di form dipendenti dalla MainForm
Inserito da: leo72 - 01 Marzo 2010, 10:44:56
@Picavbg:
diciamo che l'interdizione ad usare form esterni al form modale è limitato in Gambas al programma in esecuzione.
Se vuoi cliccare su una finestra di un'altra applicazione o del desktop lo puoi fare.
Titolo: Re: Chiamata di form dipendenti dalla MainForm
Inserito da: Picavbg - 02 Marzo 2010, 00:03:02
diciamo che l'interdizione ad usare form esterni al form modale è limitato in Gambas al programma in esecuzione.
Se vuoi cliccare su una finestra di un'altra applicazione o del desktop lo puoi fare.
Quindi, in pratica, utilizzare in Gambas form modali o form child produce lo stesso risultato di interdipendenza col form chiamante, per cui, a parte le considerazioni di Berserker79 
Citazione
è anche vero che se il form da cui viene richiamato ha un menù, questo, stranamente, è consultabile dall'utente, vanificando in parte la chiamata di tipo modale.
, alle quali si può ovviare sfruttando la propreietà enable=false sui menu della relativa barra, solo quando il form chiamato finisce il suo compito ed il controllo  ritorna al form chiamante, quest'ultimo riprende lo stato di "Attivo".
Se ho capito bene, mi resta da capire solamente quale procedura tecnica di chiamata è più semplice.
Ciao.
Titolo: Re: Chiamata di form dipendenti dalla MainForm
Inserito da: leo72 - 02 Marzo 2010, 00:19:11
Se non vuoi che l'utente possa interagire con il form chiamante mentre è visualizzato un altro form (ad esempio se _deve_ rispondere a qualche domanda o selezionare qualcosa) allora conviene fare chiamate modali. Altrimenti, se l'utente deve poter interagire con i 2 form contemporaneamente, chiamali normalmente.

Tieni conto di una cosa: un form modale è legato al form chiamante anche per il desktop manager, per cui cliccando sulla riduzione ad icona del form genitore rimpicciolisci anche il figlio. Nel secondo caso no, ogni form è a sé stante.
Titolo: Re: Chiamata di form dipendenti dalla MainForm
Inserito da: Picavbg - 12 Marzo 2010, 17:52:06
Se non vuoi che l'utente possa interagire con il form chiamante mentre è visualizzato un altro form (ad esempio se _deve_ rispondere a qualche domanda o selezionare qualcosa) allora conviene fare chiamate modali. Altrimenti, se l'utente deve poter interagire con i 2 form contemporaneamente, chiamali normalmente.
Tieni conto di una cosa: un form modale è legato al form chiamante anche per il desktop manager, per cui cliccando sulla riduzione ad icona del form genitore rimpicciolisci anche il figlio. Nel secondo caso no, ogni form è a sé stante.
Scusa Leo se ho tralasciato questa discussione per un pò di giorni, ma, come avrai sicuramente, appreso, ho incontrato qualche problema con errori strani provocati dal tentativo di imparare ad usare i gruppi di oggetti all'interno di una Form. Ora che gli errori sono stati consegnati alla giustizia esadecimale per la successiva condanna a mai più comparire durante l'esecuzione del mio povero programma,  ;) posso riprendere perchè vorrei impostare il .show delle Form chiamate di volta in volta attraverso le funzioni agganciate ai menù della FMain.
È chiaro che se da un Menù presente nella FMain, scateno l'evento relativo:
Codice: [Seleziona]
PUBLIC SUB MenuX_Click() 
  FormX.Show
END
La FormX si apre, mentre resta attiva la FMain e tutte le altre finestre eventualmente selezionabili nel pannello di Gnome/Kde.

Se però il codice relativo all'evento scatenato è il seguente:
Codice: [Seleziona]
PUBLIC SUB MenuX_Click() 
  FormX.ShowModal
END
La FormX si apre, ma da quel momento e fino a quando il controllo non ritorna, da codice, alla Form chiamante(FMain nell'esempio) non riesco  a svolgere alcuna funzione dentro appunto la Form chiamante, ma non posso nemmeno rientrare nella finestra di connessione Internet per consultare il Forum di Gambas.

Infine, se il codice relativo all'evento scatenato è il seguente:
Codice: [Seleziona]
PUBLIC SUB MenuX_Click() 
  FormX.ShowDialog
END
La FormX rappresenta una Form.children che si apre, ma ...non ho capito... se, come la modale, da quel momento e fino a quando il controllo non ritorna, da codice, alla Form chiamante, posso svolgere operazioni solo all'interno della orm chiamata, oppure, se posso ugualmente agire sulla Form chiamante, Sicuramente potrò invece agire sulle altre finestre disponibili per la selezione nel pannello di Gnome/Kde.

In ogni caso, se volessi rendere attiva la Form successiva, prima ancora di eseguire lo show, in modo permetterle l'esecuzione di codice preliminare al metodo show, come potrei fare?

Ti prego, se non ti pesa, di darmi anche un piccolo chiarimento: in questo momento, prima che prosegua nella stesura del programma, è molto importante per me. Ne va anche della mia crescita in Gambas. Come faresti a caricarti di una simile responsabilità? :D
Ciao.

Titolo: Re: Chiamata di form dipendenti dalla MainForm
Inserito da: dex - 12 Marzo 2010, 21:43:05
ciao

non ho capito bene cosa vuoi realizzare?
1) una main che chiama form in modalità assoluta
2) una main che apre dei form che devono essere child e sempre in primo piano
2) oppure una main che richiama i form e che quando si chiude chiude tutti i form child
Titolo: Re: Chiamata di form dipendenti dalla MainForm
Inserito da: Picavbg - 13 Marzo 2010, 09:33:07
non ho capito bene cosa vuoi realizzare?
1) una main che chiama form in modalità assoluta
2) una main che apre dei form che devono essere child e sempre in primo piano
2) oppure una main che richiama i form e che quando si chiude chiude tutti i form child
Non si tratta di ottenere un'indicazione in base all'utilizzo da fare, ma se hai letto bene il mio precedente post, cerco solo di capire il meccanismo di funzionamento dei 3 metodi di chiamati messi a disposizione da Gambas, allo scopo di potere assumere le giuste conoscenze in merito ed adattare, nelle realizzazioni  di programmi, di volta in volta, quella più confacente alle necessità del momento; per cui:
chiamata di una Form con formX.show ---> si attiva la nuova form con l'apertura di una finestra in aggiunta alle altre già attive.
chiamata di una Form con formX.showModal ---> si attiva la nuova form con l'apertura di una finestra in aggiunta alle altre. Quali restano ora attive?
chiamata di una Form con formX.showDialog ---> si attiva la nuova form con l'apertura di una finestra in aggiunta alle altre. Quali restano ora attive?
Spero di essere stato più chiaro.
Ciao
Titolo: Re: Chiamata di form dipendenti dalla MainForm
Inserito da: dex - 13 Marzo 2010, 14:35:08
ho letto il tuo post precedente.
non avevo capito che la tua era solo curiosità per imparare anche perchè in un'altro post hai chiesto aiuto prima di procedere con il programma.

Titolo: Re: Chiamata di form dipendenti dalla MainForm
Inserito da: Picavbg - 13 Marzo 2010, 16:58:30
@ Dex:
La curiosità, come la definisci tu, nasce sempre da una necessità di programmazione e, anche se, possa sembrare inutile, perchè basta fare delle prove pratiche di attivazione per vedere cosa succede, le prove pratiche esulano dalla possibilità di cogliere  quegli eventuali spunti di raffinata differenza che possiede solamente chi ha avuto modo di vivere tante realtà a "gambas" tratta .
Nel caso specifico intanto ho risolto praticamente, perchè da prove veloci fatte oggi, in Gambas sembra che:
Citazione
chiamata di una Form con FormX.showModal
chiamata di una Form con FormX.showDialog
i due metodi producano lo stesso effetto; infatti, una volta attivata la FormX.figlia, in entrambi i casi, resta inattiva, durante tutto il periodo di attivazione della FormX, solamente la Form.chiamante, mentre, tutte le altre finestre già aperte sono raggiungibili riapribili tranquillamente. Tutto ciò mi dice che posso indifferentemente chiamare una FormX.fighlia indifferentemente sia con FormX.showModal, sia con FormX.showDialog
Perciò, salvo ulteriori interventi correttivi da parte di chi ne sa di più, mi pare che non ci sia altro da dire.  :D
Ciao.
Titolo: Re: Chiamata di form dipendenti dalla MainForm
Inserito da: Picavbg - 13 Marzo 2010, 17:26:51
Ho fatto una prova pratica ed ho visto che in Gambas
Codice: [Seleziona]
Formx.ShowModal 
Formx.ShowDialog
si comportano allo stesso modo, però in entrambi i casì non è mpossibile riprendere la form chiamante, quando è attiva la form dipendente. Certo sarebbe bello capire quando convebnga utilizzare l'una o l'altra, perchè, a prima vista, per le pèrove fatte sembra prorio che usare l'uno o l'altro metodo sia una pura scelta  abitudinaria del programmatore e nient'altro.
:D
Ciao a tutti.
Titolo: Re: Chiamata di form dipendenti dalla MainForm
Inserito da: Ceskho - 13 Marzo 2010, 19:52:54
Ricorda di scrivere il testo esitandolo con i tag code.. ;)
Titolo: Re: Chiamata di form dipendenti dalla MainForm
Inserito da: Picavbg - 13 Marzo 2010, 22:07:16
Ricorda di scrivere il testo esitandolo con i tag code.. ;)
... ??? ... Non ho capito, Scusa la mia ignoranza, puoi spiegarmi in modo elementare quello che intendi?  :-[ :-[ :-[
Ciao.
Titolo: Re: Chiamata di form dipendenti dalla MainForm
Inserito da: Ceskho - 14 Marzo 2010, 17:39:13
Ricorda di scrivere il testo esitandolo con i tag code.. ;)
... ??? ... Non ho capito, Scusa la mia ignoranza, puoi spiegarmi in modo elementare quello che intendi?  :-[ :-[ :-[
Ciao.

Quando scrivi del codice devi, dopo averlo scritto, selezionarlo e premere il tastino che ti appare sulla finestra con il simbolo # (lo trovi sopra la faccina che da il bacio)..

In questo modo il codice apparirà in una casella di testo che facilità la lettura a tutti gli utenti...
Titolo: Re: Chiamata di form dipendenti dalla MainForm
Inserito da: Picavbg - 15 Marzo 2010, 00:29:18
@ Ceskho:
Grazie per il chiarimento, però, se mi dici ciò vuol dire che qualche volta mi è sfuggito e chiedo scusa per la dimenticanza, perchè solitamente faccio esattamente quello che mi hai specificato:
Citazione
Quando scrivi del codice devi, dopo averlo scritto, selezionarlo e premere il tastino che ti appare sulla finestra con il simbolo #
La stessa cosa faccio quando devo evidenziare una citazione, naturalmente clicco sull'iconcina/simbolo appropriato. :)
Ciao.
Titolo: Re: [RISOLTO] Chiamata di form dipendenti dalla MainForm
Inserito da: leo72 - 16 Marzo 2010, 16:03:32
Principalmente esistono 2 modi per visualizzare una seconda finestra: o in modalità normale (.Show) o in modalità "modale" (.ShowModal).
La differenza risiede nel fatto se vuoi che l'utente possa interagire anche con la finestra chiamante oppure no. In genere si chiama una finestra modale quando si vuole che l'utente sia obbligato a fare qualcosa su di essa e non possa interagire con quella chiamante finché non ha eseguito le operazioni richieste.

Quale usare delle 2 dipende ovviamente da te e dal programma. Io in genere chiamo una finestra in modalità modale quando richiedo all'utente qualcosa, e comunque non cerco mai di far apparire 2 finestre contemporaneamente perché non uso una logica di programmazione del genere né voglio che l'utente "spippoli" su 2 finestre contemporaneamente.

P.S.:

ShowDialog è identico a ShowModal. Ecco cosa dice la documentazione:
FUNCTION ShowDialog ( ) AS Integer
A synonymous for the ShowModal  method.
Titolo: Re: [RISOLTO] Chiamata di form dipendenti dalla MainForm
Inserito da: Picavbg - 17 Marzo 2010, 11:45:31
Io in genere chiamo una finestra in modalità modale quando richiedo all'utente qualcosa, e comunque non cerco mai di far apparire 2 finestre contemporaneamente perché non uso una logica di programmazione del genere né voglio che l'utente "spippoli" su 2 finestre contemporaneamente.
Perfetto. Anch'io la penso come te; ecco perchè cercavo come, pur lasciando la Form chiamante visibile sotto la Form.figlio, obbligare l'operatore a svolgere il suo compito solamente dentro la form.figlio e riprendere l'uso della Form.padre, solo dopo avere scelto di uscire dalla Form.figlio, magari con un semplice click su un controllo  Botton, in modo da scatenare l'evento "hide".
Grazie.  ;D
Ciao.