Autore Topic: Applicazione layout e menu  (Letto 4458 volte)

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Applicazione layout e menu
« il: 31 Ottobre 2010, 19:09:44 »
Ho una domanda basilare relativa al layout dell'applicazione (di un ipotetico gestionale).

Nel precedente, realizzato in VB6, avevo strutturato il progetto su un form_main dal quale, cliccando sui pulsanti si aprivano tante finestre quante erano le funzioni del gestionale. Ad esempio c'era il pulsante per mostrare il form_inserimento_dati, il form_lavori_archiviati, il form_inserimento_nuovi_lavori, ecc.

In questa nuova esperienza vorrei migliorare il progetto inserendo anziché i pulsanti direttamente un menù (e magari anche i pulsanti, tipo una barra_degli_strumenti).
Per la creazione del menù ho seguito la guida, e mi sembra relativamente semplice.
La mia domanda è questa:

Come si crea un pacchetto in cui le form (che ho elencato prima) si aprano direttamente nella FMain? Cioè, anziché come finestre separate, io vorrei far comparire direttamente ogni form nell' FMain.  In pratica la form è sempre la stessa, ma cambiano i suoi componenti a seconda della funzione dell'applicazione cliccata. Si può fare?

Dopo averci ragionato su un po' credo che dovrei creare ogni componente da codice, magari in dei moduli, e farli comparire quando clicco sulla voce del menu...

Non so se invece è possibile disegnare i diversi Form (graficamente) e poi richiamarli dentro l'FMain. Se fosse possibile in quest'altro modo mi risparmierei parecchio lavoro, credo?)

Mi potreste consigliare un progetto son un layout simile, di cui potrei scaricare i sorgenti per capire come è stato strutturato?

PS: vi prego di sopportarmi per le tante domande che posto!

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Applicazione layout e menu
« Risposta #1 il: 31 Ottobre 2010, 20:54:20 »
una soluzione può essere quella nell' esempio seguente, in alternativa puoi utilizzare il componente  embledder

ps:
Citazione
PS: vi prego di sopportarmi per le tante domande che posto!
se nessuno facesse domande questo forumnon servirebbe a nulla :)
« Ultima modifica: 31 Ottobre 2010, 21:10:25 da fsurfing »

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Applicazione layout e menu
« Risposta #2 il: 31 Ottobre 2010, 21:32:00 »
fsurfing,

Innanzitutto ti ringrazio della risposta! La vedo appena finisco di cenare.


Nel frattempo che ho postato la domanda mi sono fatto un giro sul web, e tra esempi, sorgenti, ecc. ho trovato la soluzione.

Sono euforico... e la spiego, nel caso servisse anche agli altri.

La soluzione è la creazione di un form MDI... ossia un form_padre, nel quale dentro ci sia un componente, chiamato Workspace, che visualizza i form_figli.

Per attivarlo bisogna andare sulla gestione componenti ed attivare gb.form.mdi (che richiede anche gb.settings).

A questo punto il gioco è semplicissimo. E vi spiego cosa ho fatto io:

1) Creazione del FMain (che sarà il nostro form MDI),

2) all'interno del FMain piazzeremo il componente Workspace (che sarà comparso tra gli "special"), e lo chiamiamo "mioWorkspace"

3) Disegniamo un altro form (che sarà uno dei figli), "Ffiglio1".

4) per far visualizzare "Ffiglio1" nel "mioWorkspace" dobbiamo lo istanziamo e lo aggiungiamo. Questo è il codice da inserire per esempio nel _new dell'FMain:

Codice: gambas [Seleziona]

  DIM mioform AS NEW Ffiglio1
  mioWorkspace.add(mioform)


Ora non so bene tutto il resto... però è una figata! Inoltre, ci dovrebbe essere anche la toolbar da qualche parte. Continuo la ricerca...

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: Applicazione layout e menu
« Risposta #3 il: 31 Ottobre 2010, 22:30:30 »
Proprio come tutte le applicazioni che ho fatto io  ;)

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Applicazione layout e menu
« Risposta #4 il: 31 Ottobre 2010, 23:06:19 »
Purtroppo devo fare una retrofront!

Non ci avevo capito una mazza, come al solito...  :-[
Il formMDI ed il relativo Workspace serve per creare finestre multi-documenti, tipo le finestre-codice della console di gambas.
In pratica quando apriamo più documenti li accodiamo (finché non vengono chiusi) e possiamo saltare dalla letture di un codice all'altro semplicemente usando la linguetta...


Per quello che voglio fare io la soluzione è proprio quella di fsurfing.  :ok:

Sono destinato a rimanere gamberetto a vita...  :-X
« Ultima modifica: 31 Ottobre 2010, 23:10:18 da perseo »

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Applicazione layout e menu
« Risposta #5 il: 31 Ottobre 2010, 23:16:28 »
Citazione
Sono destinato a rimanere gamberetto a vita...  Bocca cucita

ahha hahah  ma no figurati ! che dici , io ho avuto solo fortuna ,non avevo idea di come si potesse risolvere il tuo quesito , poi mi è venuto in mente questa soluzione e ho fatto una prova , non è detto che sia ottimale, al limite puoi sempre utilizzare embledded(ma se la mia soluzione non da problemi è preferibile)

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: Applicazione layout e menu
« Risposta #6 il: 31 Ottobre 2010, 23:54:26 »
In pratica la soluzione di fsurfing e' come un Workspace, ma senza linguetta, quindi secondo me, la soluzione migliore rimane quella del Workspace...

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Applicazione layout e menu
« Risposta #7 il: 01 Novembre 2010, 00:01:57 »
Premetto che non ho scaricato l'esempio di fsurfing.
Dico: ma perché non usare dei Panel?
Ne crei tanti quanti form ti servono e poi su ogni Panel (che è in pratica un raccoglitore senza bordi) inserisci gli elementi che ti occorrono.
Poi li rendi invisibili e visualizzi di volta in volta solo quello che ti serve.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Applicazione layout e menu
« Risposta #8 il: 01 Novembre 2010, 00:53:48 »
Ottimo Leo, alla fine ho fatto un mix tra il codice di fsurfing e la tua proposta...

In pratica rispetto a quello di fsurfing dove i forms figli vengono istanziati, aperti e chiusi, ho usato l'approccio visibile ...e non.
Questo perché aprendo e chiudendo ogni volta l'istanza del form si viene a perdere il lavoro o le modifiche fatte. Metti che su un form_figlio riempi delle textbox, poi ti sposti su un altro form_figlio, quando torni sul precedente in realtà è una nuova istanza ed è tutto rigenerato ex-novo (e quindi non c'è più il contenuto nelle textbox).
Inoltre, se modifico una proprietà in modalità invisibile non mi restituisce errore.

La comodità è che posso scrivere il codice direttamente in ogni form_figlio ed usare un unico contenitore per richiamarli singolarmente...

Lo allego, così mi dite se è migliorabile.

PS: ho abbozzato anche una barra dei menù.

[edit]
Nel mio allegato c'è un piccolo bug... cliccando sulla voce di menu "form3" viene visualizzato il form2. Mi sono dimenticato di rinominare l'oggetto form2 in form3 nell'apposito evento...
[/edit]
« Ultima modifica: 01 Novembre 2010, 01:30:59 da perseo »

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Applicazione layout e menu
« Risposta #9 il: 01 Novembre 2010, 01:02:21 »
Ho guardato l'esempio di fsurfing e l'ho trovato molto pratico e sbrigativo. Naturalmente esistono altre alternative.

Quella suggerita da Leo mi sembra ottima. Secondo me, se ti piace, potresti aggiungere nella tua FMain una barra di menu ed associ a ciascun menù il contenitore panel contenente la form che vuoi vedere:
Es. Menù.1 nel cui codice evento attiveresti  il panel1 contenete la Form1
      Menù.2 nel cui codice evento attiveresti  il panel2 contenete la Form2
e così via.

Azzardo poi un'ipotesi. Siccome l'ultimo pannello richiamato viene posto in primo piano, se le Form hanno tutte le stesse dimensioni, non hai neppure bisogno di giocare sulla proprietà "visible" di ciascun panel.
 ;)
Ciao.
:ciao:

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Applicazione layout e menu
« Risposta #10 il: 01 Novembre 2010, 03:17:32 »
Mi sono arenato su un punto...

Come faccio da FMain a gestire un componente di fr1, ossia l'istanza pubblica di Form1, che sta dentro il panel1 di FMain?

C'è un componente di fr1, ad esempio Label1.... Se io volessi da Fmain cambiare il .caption di questo label come faccio?

Se da un qualunque evento di FMain scrivo fr1.label1.caption = "modifica_label" il programma mi restituisce errore... Non capisco perché?

Questo è il codice dell'FMain, che contiene il "panel1" in cui compaiono "fr1" o "fr2", che, come è dichiarato nell'evento "Form_Open()" sono istanze del "Form1" e del "Form2".
Io voglio cambiare il testo del componente "label1" che si trova sia in "Form1" che in "Form2"... E pensavo che avendo istanziato sia "fr1" ed "fr2", automaticamente questi richiamassero anche tutti i sotto-oggetti (ossia i componenti dell'oggetto Form), con "fr1.Label1.Caption = '....' " ed "fr2.Label1.Caption = '....' "
L'errore che mi restituisce quando in run-time clicco sul "button1" o sul "button2" è: "Unknown symbol "Label1" in class "Form" (a riga 17 dell'FMain)

Codice: gambas [Seleziona]

' Gambas class file
Public fr1 As Form
Public fr2 As Form

Public Sub _new()
End

Public Sub Form_Open()
  fr1 = New Form1(Panel1) As "fr1"
  fr2 = New Form2(Panel1) As "fr2"
  nascondifrm
End

Public Sub Button1_Click()
  nascondifrm
  fr1.Visible = True
  fr1.label1.caption = "Prova_Cambio_Caption"
End

Public Sub Button2_Click()
  nascondifrm
  fr2.Visible = True
  fr2.label1.caption = "Prova_Cambio_Caption"
End

Public Sub form1_Click()
  Button1_Click()
End

Public Sub form2_Click()
  Button2_Click()
End

Public Sub nascondifrm()
  Dim frmX As Form
  For Each frmX In Panel1.Children
    frmX.Visible = False
  Next
End



PS: in Progetto --> Proprietà --> Opzioni --> "I controlli del form sono public" --> è settato su "NO".
Se setto "SI" mi da un errore a riga 9 dell'FMain... senza neppure far partire l'applicazione: "Form.Show" is badly overridden in class "Form1"
« Ultima modifica: 01 Novembre 2010, 10:59:13 da perseo »

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Applicazione layout e menu
« Risposta #11 il: 01 Novembre 2010, 10:50:16 »
modifica l' intestazione così

Codice: [Seleziona]
Public fr1 As Form1
Public fr2 As Form2
Public fr3 As Form3

poi abilita nelle opzioni l'uso dei metodi public per i simboli dei moduli e i controlli dei form

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Applicazione layout e menu
« Risposta #12 il: 01 Novembre 2010, 11:05:14 »
fsurfing,

ho cambiato l'intestazione dell'Fmain in:

Codice: vb.net [Seleziona]

' Gambas class file
Public fr1 As Form1
Public fr2 As Form2

Public Sub _new()
End

Public Sub Form_Open()
  fr1 = New Form1(Panel1) As "fr1"
  fr2 = New Form2(Panel1) As "fr2"
  nascondifrm
End


Ho settato "SI" sia l'opzione "I controlli del form sono 'public' ", sia l'opzione "I simboli dei moduli sono 'public' "...

Però mi da sempre lo stesso errore:
"Form.Show" is badly overridden in class "Form1" ...a riga 9 dell'FMain
« Ultima modifica: 01 Novembre 2010, 11:16:33 da perseo »

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Applicazione layout e menu
« Risposta #13 il: 01 Novembre 2010, 11:40:27 »
Ho riscritto il codice su Gambas2 e funziona senza problemi!

Come si può risolvere su Gambas3?

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Applicazione layout e menu
« Risposta #14 il: 01 Novembre 2010, 11:45:50 »
a me così funge

ps non utilizzare come nome di menu form1, potrebbe generar eproblemi.
ps1: label1.caption  dovresti sostituirlo con label1.text che è più in linea con gambas