menu ed apertura window

ciao a tutti, premesso che provengo da altro linguaggio di programmazione (visual fox pro 9.0), non riesco a capire come fare:

  • impostare un menu con le sue voci (ok, fatto partendo dal mainmeubar creato insieme alla mia app desktop)
  • abbinare all’evento click di una voce l’apertura di una finestra (ad es. anagrafica clienti, fatture, ecc…)
  • poter aprire più finestre contemporaneamente, anche dello stesso tipo (ad es. due anagrafiche clienti contemporaneamente)

ho cercato nei forum ma, francamente, non ci ho capito molto…

grazie a tutti x il supporto

ciro

Ciao Ciro,
per impostare un’azione alla scelta di una voce di menu basta aggiungere il menuHandler all’oggetto interessato.

Ad esempio se vuoi aprire una finestra “elenco clienti” la cosa probabilmente migliore e aggiungere la voce relativa al menu all’oggetto app.
Per cui tasto destro su app, seleziona “add to app” e qui “Menu handler”
Ti apparir un menuHandler “Untitled”
In alto a destra (nell’ispector) hai un popup con la possibilit di selezionare tra le voci dichiarate nel menu che hai indicato a livello di app (ad esempio menuElencoClienti) ricordati che non il testo del menu ma il nome della voce.

Nel codice inserisci quello che ti serve per far apparire la finestra elencoClienti.
Ad esempio poniamo che l’hai definita come winElencoClienti con implicit instance a true, allora scriverai winElencoClienti.show.
Il tuo codice va inserito ovviamente prima del return True gi presente.

Perch c’ return true?
Puoi fare la stessa operazione a livello di qualsiasi controllo in cui puoi inserire i menuHandler, se non ritorni true la tua azione verr eseguita e verr richiamato il menuHandler del livello superiore fino a quello di app (in genere non serve, per cui preimpostato il return a true)

Per aprire 2 finestre contemporaneamente:
Se vuoi solo aprire 2 finestre (ad esempio elenco clienti e elenco fornitori) basta eseguire i due comandi in sequenza.
Probabilmente per vuoi, ad esempio, aprire una scheda cliente particolare in base alla scelta fatta sulla lista clienti.

In questo caso:
Poniamo che hai una voce di menu: mnuSchedaCliente che la lista clienti abbia un rowTag con l’identificativo del cliente.
Il menu handler lo aggiungi a livello della finestra elencoClienti e come codice:
dim w as new winCliente(listaCliente.rowTag(listaCliente.listIndex))
w.show

In cui winCliente la tua finestra del cliente che ha un costruttore (quindi non utilizzerai l’istanza implicita) che accetta come parametro il codice cliente per poter visualizzare i dati corretti (chiaramente puoi utilizzare tecniche diverse per evitare di avere pi finestre dello stesso cliente)
Per evitare che il menu sia richiamabile se non c’ selezione puoi mettere il controllo che la listindex sia >-1, ma se nell’evento EnableMenuItems della finestra inserisci il codice
mnuSchedaCliente.enabled=listaCliente.listIndex>-1
Spegnerai la voce del menu se non hai la selezione, il che decisamente pi user friendly.

PS
VisualFoxPro… quanti ricordi…

grazie antonio, prover i tuoi consigli…sto portando un mio applicativo in ambito sanitario da foxpro a xojo e mi scontro un p con le logiche differenti…

a parte il tuo esempio, quello che volevo fare io aprire due volte la stessa window, ad es. aprire l’anagrafica clienti su un cliente e poi aprire una seconda anagrafica su un altro cliente, tenendo aperte tutte e due…

ho provato, ma se faccio la show della seconda mi sparisce la prima…

grazie, ciro

La finestra del cliente non deve avere l’implictIstance a true. deve essere false.

Questo permette di poter creare la finestra come oggetto

per cui:
dim w as new windowCliente
w.---- imposti i parametri per poter caricare il cliente ad esempio impostando l’identificativo del cliente da caricare
w.show

sono oggetti creati distinti per cui ogni volta che richiami questa procedura sar create una finestra diversa.

Puoi anche creare un metodo di classe per gestire il tutto e magari fare in modo che se richiami un cliente gi visualizzato venga semplicemente mostrata la finestra senza crearne una nuova
Per fare il metodo di classe aggiungi alla finestra uno sharedMethod. ad esempio mostra(identificativoCliente as string)

per evitare le finestre doppioni aggiungiamo una propriet di classe (sharedProperty) winCli as Dictionary

nel metodo mostra scrivi:
dim w as windowCliente
if winCli=nil then winCli=new dictionary //Se il dictionary non esiste lo creiamo
w=winCli.lookup(identificativoCliente,nil) //cerco nel dictionary il cliente
if w=nil then //se nil non presente
w=new windowCliente
w.clienteID=identificativoCliente
winCli.value(identificativoCliente)=w
end if
w.show

aggiungi l’evento close alla classe windowCLiente con:
winCli.remove(clienteID)

ora la tua procedura per aprire la finestra del cliente :
windowCliente.mostra(…id del cliente…)

Ricordati anche di isolare il codice.
Se devi caricare il cliente imposta (tramite costruttore o impostando il parametro prima dello show) il suo identificativo e nell’open leggi i dati dal db. Non passare i dati da una finestra all’altra (inutile e non sfrutti la possibilit di rendere gli elementi indipendenti)