Newsgroup: it.comp.lang.visual-basic
Titolo: ZOrder - "ricostruzione" fedele di un form

Scusate la richiesta, ma non riesco ad uscirne ...
Ho dato all'utente della mia applicazione la possibilità di costruirsi
i form e le stampe, tramite un oggetto che ho chiamato "editor".
E' un po' come l'editor di maschere e report di Access (con tutto il
rispetto :-)). Dopo avere trascinato un campo (draggato da apposito
elenco) sulla form, ed avere quindi creato un controllo TextBox,
l'utente con un right-clic accede ad un menu, fra le cui opzioni ho
messo "sposta avanti" e "sposta indietro", associandoli a due metodi
ZOrder.
Alla fine di tutto, debbo però salvare form e stampe in un dabatabase.
No problem (memorizzo praticamente ogni proprietà di ogni controllo),
se non che non riesco a ricostruire l'esatto "ordine sull'asse Z".
DOVE DIAMINE è memorizzato tale ordine? ... davvero non capisco.
Nel forum ho solo trovato un riferimento ad una funzione "getwindow",
ma non so come e se usarla.
Qualcuno mi sa dare una dritta?
Grazie in anticipo come sempre, ragazzi.
Filippo

non conosco la risposta alla tua domanda, ma mi interesserebbe un editor
come quello che hai creato.
Potresti postarlo al mio indirizzo email?
grazie.
-- 
Esistono 10 tipi di persone: chi conosce il binario e chi no.
www.nicolaottomano.it

 DOVE DIAMINE è memorizzato tale ordine? ... davvero non capisco.
Mi hai incuriosito e ho fatto una breve prova.
Empiricamente direi che lo ZOrder è dato semplicemente dall'ordine degli
oggetti nel file .frm: i primi sono in primo piano.
Es:
   Begin VB.TextBox Text1
      Text            =   "Text1"
      ...
   End
   Begin VB.PictureBox Picture1
      ...
   End
   Begin VB.CommandButton Command1
      Caption         =   "Command1"
      ...
   End
Ci sarà Text1 in primo piano, subito sotto Picture1 e sotto ancora Command1.
Personalmente li avrei salvati al contrario :) ma tant'è.
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 grazie.
... ehm, diciamo che forse avrei fatto meglio a scrivere "... STO
DANDO all'utente la possibilità ...", nel senso che l'editor debbo
ancora finirlo. Comunque non manca tanto: in un paio di settimane
dovrei terminare.
Non so davvero, dopo, come potrei però scorporarlo dall'applicazione,
visto che ne adopera le librerie. Comunque quando l'avrò terminato "ci
sentiremo", anche perché il software che sto scrivendo dovrà venire
venduto ad una tipologia di clienti che si avvicina alla tua, come
esigenze gestionali. Ed il tuo programma per ottici sembra davvero
interessante, anche se un giro per la demo non l'ho ancora fatto (...
l'ho scaricata, e da diversi giorni mi riprometto di guardarla).
Alla fine, penso che ti farò avere la nostra ... beta-demo :-), e
magari ci si scambierà qualche esperienza.
In proposito ti butto lì: come ti sei regolato con la protezione del
software? ... noi ci stiamo rompendo la testa da un po'.
Ciao!
Filippo

 oggetti nel file .frm: i primi sono in primo piano.
... in effetti in parte è vero. "In parte" nel senso che è così
solamente se (e fino a che) non adoperi il metodo ZOrder sugli oggetti
stessi. Quello li incasina. :-)
Una soluzione però l'ho trovata: la posto, così visto che rompo sempre
le scatole perlomeno mi rispondo da solo ... non si sa mai che
qualcuno in futuro abbia lo stesso problema.
Faccio così:
- alla creazione dei controlli in run time utilizzo su ogni nuovo
controllo ZOrder, in modo da essere SICURO che finisca davanti agli
altri (... non sarebbe necessario, però ...)
- memorizzo in apposita tabella OGNI "colpo di ZOrder", sia mio
(creazione in run time) sia dell'utente
- quando debbo utilizzare l'oggetto creato dall'editor (visualizzare
la form, stampare il report ...) riapplico tutti i "colpi di ZOrder",
uno per uno, nello stesso ordine in cui sono stati dati (da me e
dall'utente) in editing.
Se qualche purista scosso da brividi di raccapriccio è arrivato a
leggere fin qui ed ha un metodo migliore lo posti pure: io sono sempre
per le cose più pulite che si può (anche se in fondo non è che questa
sia così male).
Ciao!
Filippo

 dall'utente) in editing.
Ah, certo :)
Non avevo tenuto conto che a te serve saperlo a runtime :)
Beh, la tua soluzione č corretta ma sicuramente perfettibile.
Anzichč registrarti ogni "colpo" di ZOrder dovresti semplicemente 
spostare gli elementi nella tua tabella.
Spiego: la tua tabella dovrebbe semplicemente avere l'elenco degli 
oggetti nel form in questo modo:
Pos Nome
1   TextBox1
2   PictureBox1
3   Command1
Se uno fa uno ZOrder di PictureBox1 tutti i seguenti devono essere 
shiftati di uno in giů (o in su, a secondo di come la leggi :)) e quello 
zorderato finisce in fondo:
- Pos(TextBox1) = Max(Pos) +1
- For i = Vecchia_Pos(TextBox1) + To Max(Pos) - 1
     Pos(Controllo(i)) = Pos(Controllo(i)) - 1
- Pos(TextBox1) = Pos(TextBox1) - 1
Ciao

 Ciao!
bye


...

Giustissimo. Uso la tua: č molto piů elegante.
Grazie mille!