Autore Topic: Form MDI  (Letto 6756 volte)

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Form MDI
« il: 04 Novembre 2010, 16:56:24 »
Dopo diverse sperimentazioni e tentativi sono giunto alla conclusione che il mio gestionale dovrebbe esse MDI-like.  :)

Questo è l'esempio che il mio mentore, milio, mi ha recentemente postato: un'immagine di un suo vecchio lavoro, che mi è piaciuta tantissimo. E' proprio come vorrei che fosse il mio layout.

http://milio.appix.net/Immagini/schermata3.png

La prima delle cose che non ho capito è la gestione degli eventi del WorkSpace (e quali sono gli eventi principali).

Per sperimentare ho popolato il mio WorkSpace con 3 form. Come faccio a richiamare un evento quando clicco su una linguetta del workspace di ognuno di questi?
Ad esempio, ipotizzando di avere delle gridbox in ogni form, mi serve che vengano aggiornate quando passo da un form ad un altro. Come si gestisce l'evento del cambio_form del workspace?

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: Form MDI
« Risposta #1 il: 04 Novembre 2010, 18:39:56 »
Ogni Form rimane comunque indipendente, quindi la gestione del Form_Activate va realizzata sul Form e non nel WorkSpace...

Se poi vuoi che l'evento Form_Activate venga gestito dal Form che contiene il WorkSpace, allora bisogna utilizzare l'oggetto Observer...

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Form MDI
« Risposta #2 il: 04 Novembre 2010, 21:18:49 »
Ottimo!
Mi serve di capire da chi e come vengono invocati, e la loro sequenza. Ho provato alcuni eventi, giusto per prendere dimestichezza... La guida on-line è abbastanza scarna di informazioni, anche se tutto sommato mi sembrano abbastanza intuitivi. Però ho alcune domande... che differenza c'è tra Activate e GotFocus?
Ho visto che Activate temporalmente precede GotFocus... ma non colgo la differenza.

[Edit]
Ho visto che nel tuo WorkSpace alcune linguette non si possono chiudere, sono "locked". Come si gestisce quella situazione, quando voglio impedire che alcune "linguette" siano chiuse?
Oppure ...come si inseriscono le icone nella linguetta, ecc.
Ho fatto vari tentativi ma non ne vengo a capo...  ???
[/Edit]


[Edit2]
Per le icone credo di aver capito...
Ho istanziato il form che voglio mettere nel WorkSpace, e ho caricato l'icona nel form_istanza... In questo modo l'icona del form_istanza viene caricata direttamente nel Tab del WorkSpace.  :)

Per il lockare il Tab ho pensato che  funzionasse allo stesso modo, cioè lockando il form_istanza... ma non so quale proprietà del form_istanza dovrei settare per verificare se così è corretto.  ???
[/Edit2]
« Ultima modifica: 05 Novembre 2010, 15:54:53 da perseo »

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: Form MDI
« Risposta #3 il: 05 Novembre 2010, 23:56:02 »
Non avevo voglia di risponderti a parole, anche perche' non mi spiego bene e ti creo solo confusione  ;D
Eccoti un bel esempio che vale mille parole...  ;)

« Ultima modifica: 06 Novembre 2010, 00:12:44 da milio »

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Form MDI
« Risposta #4 il: 06 Novembre 2010, 03:03:44 »
Fantastico! Più di mille certamente!!!  :ok:
La logica è quella di impedire proprio la chiusura con lo STOP EVENT nel form_close()
E poi mi dai sempre degli spunti per capire altre cose. Ad esempio non sapevo che Property e relativi _read & _write potessero essere dichiarati anche in un form (pensavo si riferisse solo alle classi, ma tant'è visto che le form sono pur sempre classi...). Inizio a capire anche l'importanza di Object...  :)

Sinceramente, se non ci fossi tu sarei ancora ...a caro amico.  :2birre:

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: Form MDI
« Risposta #5 il: 06 Novembre 2010, 12:02:42 »
Adesso avete lanciato anche me!  :D
E' anche possibile fare una struttura ad albero nel listbox?

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: Form MDI
« Risposta #6 il: 06 Novembre 2010, 12:04:45 »
@Perseo

Mi fa piacere che ti sia stato di aiuto...

Dovremmo fare, pero', una modifica al WorkSpace... possibilita' di caricare due form in uno stesso spazio di lavoro... work in progresssss......

@Golia
Basta che togli il ListBox dal pannello laterale e ci ficchi su un bel TreeView ;)

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Form MDI
« Risposta #7 il: 06 Novembre 2010, 13:16:04 »
@ Milio,
Una WorkDouble?!  :ok:

Un chiarimento puramente tecnico... Nella Work ho sempre inserito i Form come istanze di form già creati... in modo tale da richiamare dal FMain (ossia quella con il Work) anche gli oggetti delle varie istanze, per fare ad esempio modifiche di label, oppure richiamare contenuti di caselle di testo, ecc.
Se invece inserisco i Form F1 da pulsante, usando ...Object.New(F1) tutte le istanze create... come le riconosco? Ho visto che si possono richiamare con "Workspace.Children[numero]..." però così non è immediatamente identificativo di ogni F1 istanziata.
La cosa che mi sembra più idonea è... visto che ogni F1 sarà la scheda personale di un utente, e che quindi visualizzerà il suo ID, ...potrei nella _new della F1 chiamare la Query al database e dopo scrivere F1.nome = hRes!IdUtente (questo è il suo campo)...
Così la F1 prenderebbe il nome IdUtente?

Intanto provo questo sistema e ti tengo aggiornato...  :)

@ Golia,
La TreeView, l'ho inserita appena scaricato il file... ed ho messo anche il menu.  ;)
Il mio codice prendilo con le molle. In alcuni punti l'ho modificato per fare sperimentare e capire meglio i comandi. Però mi pare ok!

Dalla riga15 dell'FMain trovi il caricamento degli item del TreeView, di nome "tv"
Me.tv.Add(1, "F1")
Me.tv.Add(2, "F2")
Me.tv.Add(3, "F3")
...

se vuoi inserire le icone nel TreeView basta che lo cambi così, aggiungendo la Picture... Ad esempio la riga17 potrebbe essere così:
Me.tv.Add(3, "F3", Picture.Load("encrypted.png"))
« Ultima modifica: 06 Novembre 2010, 14:05:23 da perseo »

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Form MDI
« Risposta #8 il: 06 Novembre 2010, 16:47:17 »
Che poi stavo pensando... in merito al WorkDouble...

Ma per la WorkSpaceDoppia basterebbe creare un Form_Padre che contenga due (o più) figli (disposti a sn/dx o up/down) separati magari da un sidepanel o un V/HSplit.
Il WorkSpace carica il padre... e poi nel _new del padre istanzio i figli che decido io...
Giusto?
« Ultima modifica: 06 Novembre 2010, 17:10:42 da perseo »

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: Form MDI
« Risposta #9 il: 06 Novembre 2010, 18:47:00 »
Esattissimo... solo che io voglio fare un drag and drop delle tab...

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Form MDI
« Risposta #10 il: 06 Novembre 2010, 19:06:50 »
Come sempre riesci a stupirmi con effetti speciali... Cioè tu vorresti cliccare su un'icona che rappresenta un form ...e trascinarlo in una delle due metà del tab, nel work, a tuo piacimento?!  :o

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: Form MDI
« Risposta #11 il: 06 Novembre 2010, 19:41:02 »
piu o meno... gambas ha la possibilita' di gestire il drag and drop.. quindi perche' non usarlo ;)

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: Form MDI
« Risposta #12 il: 06 Novembre 2010, 19:43:25 »
grazie degli esempi, stasera provo

Offline andy60

  • Senatore Gambero
  • ******
  • Post: 1.255
    • Mostra profilo
    • https://www.linkedin.com/in/andbertini
Re: Form MDI
« Risposta #13 il: 07 Novembre 2010, 11:53:08 »
@milio

intendo fare il porting di un software crm scritto con access (non crocifiggetemi, mi serve in ufficio..), del quale allego la schermata principale. Dato che non esiste un crm di questo tipo x Linux penso possa essere interessante divulgarlo. E' possibile creare una mdi di questo tipo?

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Form MDI
« Risposta #14 il: 07 Novembre 2010, 12:55:29 »
Grosse difficoltà...  :rolleyes:

Allora... ho aggiunto un secondo WorkSpace, in una delle finetre del WorkSpace (nella F3).
In pratica ho ridisegnato la F3, mettendo --> un ToolPanel. Al secondo pannello del ToolPanel ho inserito un Container con dentro due Buttons (btnAggiungi e btnElimina) ed il secondo Workspace (Workspace2).

La sequenza del percorso è --> Work1, F3, Toolpanel (secondo pannello), Work2 & i due Buttons.

Cliccando sul btnAggiungi --> nel Workspace mi viene aggiunto sempre lo stesso form, FX (un form con delle TextBox...).
Per fare questo... nel codice del form F3 ho inserito questo:
Codice: vb.net [Seleziona]
Public Sub ButtonX_Click()
  Dim i As Integer

  Me.Workspace2.Add(Object.New("FX"))
  For i = 1 To Me.Workspace2.Children.Count
    Me.Workspace2.Children[i - 1].Title = "FX n°" & i
    Me.Workspace2.Children[i - 1].Name = "FX" & i
  Next
End


Quindi ogni FX che aggiungo dovrebbe avere come Titolo (che compare nel TAB del Workspace2) e Name = "FX n°1" ed "FX1", "FX n°2" ed "FX2",  "FX n°3" ed "FX3", ecc.

Invece, cliccando sul btnElimina mi viene eliminata la TAB attiva. Chiaramente mi ricalcola anche i Titoli ed i Nomi, perché se elimino una delle TAB in mezzo, poi si creerebbe un salto di numerazione.
Codice: vb.net [Seleziona]
Public Sub Button2_Click()
  Dim i As Integer
  If Object.IsValid(Me.Workspace2.ActiveWindow) Then 'questo IF serve perché se cliccassi btnElimina con il Workspace vuoto mi restituirebbe giustamente errore...
    Me.Workspace2.ActiveWindow.Close
    For i = 1 To Me.Workspace2.Children.Count
      Me.Workspace2.Children[i - 1].title = "FX n°" & i
      Me.Workspace2.Children[i - 1].title = "FX" & i
    Next
  Endif
End


La domanda è... come faccio a far fare la stessa cosa dal parent? Ossia come faccio a rinumerare e rinominare tutte le TAB se l'eliminazione avviene dalla "x" del TAB anziché dal btnElimina?

PS:
Ho notato una cosa... quando inserisco istanze di FX tramite
Codice: [Seleziona]
Me.Workspace2.Add(Object.New("FX"))
in teoria inserisco dei NEW FX, ma sempre con lo stesso nome "FX"? Come fa Gambas a distinguerli? Perché non va in errore? Come faccio io a richiamarne uno anziché un altro?
Come faccio, sempre dal codice di F3, ad inserire del testo nelle txtbox, che si trovano nelle FX che ho creato dinamicamente?

Sto diventando matto appresso a queste cose... :mad: :-\

Però la struttura sta venendo una meraviglia, quindi voglio perseverare finché non arrivo alla soluzione!  :coder: