Autore Topic: Form MDI  (Letto 6070 volte)

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.272
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: Form MDI
« Risposta #30 il: 09 Novembre 2010, 13:41:32 »
Bhe sicuramente e' meno performante che attribuire la proprietà direttamente, ma qui stiamo parlando di inserire del testo in un TextBox, e comunque tutto quello che concerne un gestionale non ha grosse pretese...
Magari una cosa da fare e' dare una sbirciatina al codice dell'oggetto Object per verificare che 'giro fa' per impostare una proprietà con quel metodo. Magari si riesce a replicare la cosa con una funzione piu' 'performante'

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Form MDI
« Risposta #31 il: 09 Novembre 2010, 15:48:02 »
Ho notato una cosa...

Mentre nel normale codice una textbox non è "case sensitive", quindi possiamo tranquillamente chiamarla Textbox1.text = "..." oppure textbox1.text = "...", da Set/GetProprerty il nome è "case sensitive". Attenzione quindi, perché se non rispettiamo il nome esatto il compilatore restituirà Error (Object Null).

@ milio:
Ho provato a richiamare il testo inserito in una searchbox... Perfetto!  ;)

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.272
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: Form MDI
« Risposta #32 il: 09 Novembre 2010, 15:58:07 »
Ma ti riferisci a una SearchBox inserita in un Form nel WorkSpace, oppure alle ultime modifiche che ho fatto al componente?

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Form MDI
« Risposta #33 il: 09 Novembre 2010, 16:32:57 »
Mi riferivo ad una SearchBox nel Form del WorkSpace...

PS: la versione 0.0.17 di SearchBox l'ho scaricata ma ancora la devo testare, anche perché non so neppure bene come si usano quelle nuove proprietà che hai inserite...  ;D

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Form MDI
« Risposta #34 il: 16 Novembre 2010, 23:13:38 »
Mai cantare vittoria! :hatecomputer:  ;D

Questa non credo di poterci arrivare...
Da un Form esterno ho richiamato il .Text di una TextBox1 che si trova nella Tab(0) della WorkSpace1 dell'FMain:

Codice: vb.net [Seleziona]
stringa = Object.GetProperty(FMain.Workspace1.Children[0]["TextBox1"], "Text")


Se la TextBox1 è nel Tab(0) --> tutt'ok e mi restituisce il valore...
...ma se la TextBox1 è dentro un toolpanel del Tab(0) il programma va in errore ("Object Null")

Chiaramente la mia TextBox sta dentro un toolpanel.
Per scrupolo ho provato a togliere la TextBox1 da dentro al toolpanel e a metterla in un panel qualsiasi del Tab(0)... e viene letta correttamente.

Non capisco proprio come fare...  :rolleyes:

Ho messo un allegato esplicativo... così chi vuol provare capisce meglio la situazione. L'esempio che ho allegato funziona. Ma se andate nel sorgente "Form2" e levate l'apice di commento alla riga10 vedrete che il programma va in errore... L'unica differenza tra le due textbox è che la seconda sta dentro un toolpanel.
« Ultima modifica: 17 Novembre 2010, 01:29:48 da perseo »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Form MDI
« Risposta #35 il: 17 Novembre 2010, 10:48:56 »
Analizzare dinamicamente gli oggetti grafici presenti in una form, compresa la loro struttura gerarchica, può essere alquanto complicato, ma dipende da cosa vuoi veramente ottenere.

Ad esempio, se vuoi rilevare tutti gli oggetti TextBox presenti in una Form, indipendentemente se sono collegati direttamente alla Form, oppure che siano inseriti in altri controlli, devi farti dei loop sulla proprietà Children che è disponibile in ogni controllo contenitore (ovvero derivato da Container).
Verificando poi ogni elemento di Children, che sia corrispondente ad una TextBox, rilevare le sue proprietà è immediato. Se poi incontri un Container, basta rifare il loop anche qui su Children, e così via...

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.272
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: Form MDI
« Risposta #36 il: 17 Novembre 2010, 11:24:41 »
I casi sono due:
o hai creato il Form prima di inserirlo nel WorkSpace, come nel tuo caso delle schede pazienti, e quindi conosci la classe genitore FPazienti contenente l'oggetto da aggiornare, allora puoi tornare a fare come avevamo gia' scritto qualche post fa:

Codice: vb [Seleziona]
Public Sub Button3_Click()
Dim F As FPazienti

  If Object.Is(Me.Workspace1.ActiveWindow, "FPazienti") Then
    F = Me.Workspace1.ActiveWindow
    F.TextBox5.Text = "Ciao!"
  Endif

End


Se invece al WorkSpace gli passi un Form direttamente, allora ti basta richiamare l'oggetto normalmente come faresti per un qualsiasi altro Form aperto...

allego solito esempio...

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Form MDI
« Risposta #37 il: 17 Novembre 2010, 11:29:52 »
MD... ti ringrazio molto della spiegazione, ma anche facendo il loop non riesco a spiegarmi il perché di alcuni comportamenti, tipo questo che segue...

La cosa incredibile che ho scoperto ora è questa:
Se l'oggetto textbox2 viene inserito in una TabStrip il programma non va in errore! E va bè... ma la cosa che mi rimane assurda è questa:
Per sperimentare un po' ho messo dei container vari, e cliccandoci sopra la Textbox migra dentro di essi...
Se la TextBox parte dentro ad una TabStrip e poi viene spostata in un controllo dove darebbe errore (tipo il Toolpanel) --> allora non da più errore!

Cioè, se la TextBox sta dentro alcuni tipi di container da errore ...ma se dentro quei container ci viene messa a seguito di qualche evento non da più errore... e riesco a leggere il suo contenuto (.Text) tranquillamente! :o

Perché?

[edit]
Grazie, milio... ho scaricato il tuo esempio. Me lo studio immediatamente...
[/edit]
« Ultima modifica: 17 Novembre 2010, 11:39:33 da perseo »

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Form MDI
« Risposta #38 il: 17 Novembre 2010, 12:17:43 »
Milio,

inutile dirti che il tutto funziona perfettamente, e non sai quanto sia felice! Dopo giorni d'impegno a fare la Form d'inserimento pazienti ero molto sfiduciato quando non riuscivo a venire a capo di questa cosa...
In pratica, come al solito, sbagliavo l'approccio (ed ora anche le parole di MD mi sono più chiare).
Se ho capito bene, la prassi migliore è clonare la Form del WorkSpace che m'interessa in un'immagine virtuale della Form dinamica (Dim F As "NomeForm" - e poi F = Me.Workspace.ActiveWindow). Ho provato anche a sostituire ActiveWindow con Children[X] e funziona perfettamente!  ;).
Adesso, da questa F (clone della Form dentro la Workspace) posso richiedere o settare le cose che m'interessano.

Il procedimento credo ora di averlo capito, ma quello che non mi entra ancora nella testa è perché non si possa fare direttamente. Piano piano credo che lo capirò.

PS: giusto per curiosità ...ma perchè dentro il ToolPanel (o altri tipi di container) mi dava errore e dentro una TabStrip no?

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Form MDI
« Risposta #39 il: 17 Novembre 2010, 16:24:03 »
Credo che tu faccia ancora confusione con la gestione degli oggetti, cosa abbastanza normale per chi è ancora nuovo con questo tipo di cose...

Quando dichiari una variabile "F", di tipo "Form", e usi il costrutto NEW, in realtà tu crei un'istanza di quell'oggetto ovvero , usando il nome dell'oggetto Form come template, tu vai a creare fisicamente una sua immagine in memoria, ossia una cosa che ha una struttura di quel tipo (variabili, funzioni e metodi).

Comunque, a parte questo piccolo chiarimento, che spero ti sia utile, mi pare alquanto strano il comportamento che hai segnalato.

La parte grafica è normalmente composta, o componibile, da tue tipi di oggetti base (desumibile anche dalla documentazione): Container e Control.
Il primo può assumere un'aspetto visibile o meno, ma in ogni caso ha la funzione principale di fungere appunto da contenitore di altri oggetti grafici (anche altri Container), e si presuppone siano in grado di gestire le modalità con cui presentare a video gli oggetti che esso contiene.
Del secondo tipo  fanno parte tutti quegli oggetti che hanno una funzione interattiva, ovvero visibili su schermo, e che potrebbero avere funzionalità attive (es. TextBox), oppure no (es. Label).
Questi ultimi hanno la necessità di essere inseriti in un contesto preciso, appunto un contenitore (Container), per funzionare. Di base può essere una Form, che è in pratica il contenitore di base, ma possono essere inseriti in altri tipi di contenitore, e così via...

Adesso non posso dire con precisione e sicurezza se in effetti la cosa si comporta in maniera differente, in base al tipo di contenitore, ma se questo è vero è sicuramente un errore di gambas, oppure fai tu qualcosa di sbagliato, che magari ti sfugge...

Io posso solo dirti che a me non è mai successo, e di combinazioni ne ho fatte parecchie. Questo mi fà più pensare a qualche tua manovra errata, oppure ad una versione o libreria gambas fallata.

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Form MDI
« Risposta #40 il: 17 Novembre 2010, 16:42:11 »
MD,
hai ragione... Ancora faccio confusione, ma spero pian piano di riuscire a prendere dimestichezza con Gambas (e la OOP) in generale.

Comunque a testimonianza di questa mia breve esperienza ho allegato (nel post precedente) un esempio in cui il compilatore va in errore se la TextBox2 è nel toolpanel, mentre non va in errore se è in una tabstrip.
Se hai due secondi puoi scaricarlo e provarlo al volo, così mi dai conferma che l'errore è mio e non del compilatore, ed io mi metto l'anima in pace.  :)

PS. Per mandarlo in errore basta che da "visuale" tagli ed incolli la "TextBox2" dalla "TabStrip" al "ToolPanel". e poi esegui... Noterai che nella finestrella di controllo (Form2), riporta l'Error (nel label in rosso).
« Ultima modifica: 17 Novembre 2010, 16:51:47 da perseo »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Form MDI
« Risposta #41 il: 18 Novembre 2010, 11:14:03 »
Appena posso vedo... ti farò sapere...