Newsgroup: it.comp.lang.vo-clipper
Titolo: SELF:owner:owner:owner (una Classe in cerca del suo padrone)

Ho un'applicazione che crea diverse finestre con questa relazione parent -
child:
App -> StandardShellWindows -> DwAnagrafiche -> DwAnagraficheDetail
DwAnagraficheDetail è una SubDataWindow di DwAnagrafiche ed eredita (inherit
from nell'IDE) da una classe MyDataBrowser derivata dalla classe
DataBrowser.
Ho scritto il metodo CellDoubeClick per la classe MyDataBrowser in modo che
se si clicca due volte su di una cella del data browser venga istanziata
un'altra finestra il cui owner deve essere la StandardShellWindow.
Per istanziare questa finestra e fare in modo che il suo owner sia
StandardShellWindow ho scritto:
NuovaFinestra{SELF:owner:owner:owner,,,"Stringa di parametri"}:Show()
Tutto funziona come previsto, ma la cosa non mi sembra tanto elegante.
Scrivo <<SELF:owner:owner:owner>> perchè al momento di istanziare
NuovaFinestra dal metodo CellDoubleClick() la situazione dell'applicazione è
la seguente:
// SELF:owner = CLASS DwAnagrafiche_Detail
// SELF:owner:owner = CLASS DwAnagrafiche
// SELF:owner:owner:owner = CLASS StandardShellWindows
// SELF:owner:owner:owner:owner = CLASS App
Finalmente la domanda:
Invece di scrivere SELF:owner:owner:owner cosa si può mettere per indicare
quale deve essere la Classe a cui apparterrà NuovaFinestra (e quindi dove
verrà visualizzata) ?
Grazie per le eventuali risposte. Spero che i miei dubbi amletici (e le Vs.
risposte) servano a chiarire le idee anche ad altri che zitti zitti ce
provano.
Ciao a tutti.
Roberto Cordini

Robby,
una funzione trovata nell' libro di ivo wessel (tedesco)
FUNCTION GetShell( oWindow AS OBJECT ) AS OBJECT
 oWindow := oWindow:owner
 WHILE ! IsInstanceOf( oWindow, #ShellWindow )
  oWindow := oWindow:owner
 ENDDO
RETURN oWindow
Ciao Stefan
"Robby" <roberto...@NxOxSPAMiol.it> schrieb im Newsbeitrag
news:99a6cl$cgp$1...@zamboni.dsnet.it...



Grazie Stefan ho provato la tua funzione che in automatico fa un loop a
ritroso finchè non trova correttamente l'oggetto oMainWindow (istanziato nel
metodo Start() della classe App) della classe StandardShellWindow che nella
mia applicazione è il padre di tutte le Child Windows.
Però, che l'oggetto della oMainWindow della Classe StandardShellWindow fosse
la shell della mia applicazione già lo sapevo. Io cercavo un modo per
riferirmi direttamente all'oggetto oMAinWindow quando lo devo passare come
parametro per istanziare una Finestra da qualsiasi punto dell'applicazione e
voglio che sia di proprietà della Shell.
In pratica con la tua funzione posso scrivere:
MiaFinestra{GetShell(SELF}:Show()
però vorrei fare la stessa cosa con:
MiaFinestra{oMainWindow}:Show()
Facendo in questo modo il compilatore mi segnala un errore perchè il
parametro che passo non è un oggetto.
Non so se mi sono spiegato. Se non ci sono riuscito è perchè sono
leggermente in confusione. Per peggiorare ulteriormente la mia situazione
mentale potrei cercare il libro in tedesco che mi segnali e già che ci sono
fare un bel corso accellerato di tedesco. Comunque a parte gli scherzi,
beati voi di lingua tedesca che potete trovare dei libri su VO.
Ciao e grazie ancora.
Roberto Cordini

...



Ciao Vincenzo. Grazie per il suggerimento. Provo immediatamente.
E` piacevole constatare in quanti modi anche con VO si possa fare la stessa
cosa. Approfitto per chiederti una cosa. L'utilizzo delle funzioni con VO č
considerata una buona pratica di programmazione oppure un male necessario
quando non sia possibile utilizzare gli oggetti ecc.ecc.?
Ciao ed ancora grazie.
Roberto Cordini

"Robby" <roberto...@NxOxSPAMiol.it> ha scritto nel messaggio
news:99am3l$dik$1...@zamboni.dsnet.it...

Dipende. Se una parte di programma č chiamata da altre parti o classi ecc. č
sicuramente consigliabile creare una funzione che sia visibile a tutti i
moduli del programma, cosa non facile come la chiamata di un metodo di una
generica classe. (A meno che non sia instanziata).
 Ciao

 NuovaFinestra{SysObject(),,,"Stringa di parametri"}:Show()
Mi pare di notare un certo rallentamento nell'applicazione utilizzando la
funzione SysObject(). Ti sembra possibile? La guida in linea di VO riporta
in merito a SysObject():  Install a system-wide OBJECT that receives all
messages being sent TO OTHER data types.
Ciao.
Roberto Cordini

"Robby" <roberto...@NxOxSPAMiol.it> ha scritto nel messaggio
news:99an4u$dnb$1...@zamboni.dsnet.it...

Non ho mai notato rallentamenti e comunque se vuoi creare delle variabili
globali che poi siano disponibili in altri moduli o dll creati da te e
facenti parte del programma, mi sembra che sia l'unico modo per dargli una
visibilità globale.
Ciao.
Enzo Campanella

Lo puoi fare in modo semplice sfruttando le funzionalita di SysObject()

Ciao, Roberto.
L'unica volta che ho avuto necessità di una cosa del genere, ho creato un
object global e nell'init della ShellWindow ho salvato oMainWindow in questo
oggetto.
Penso che la spesa di memoria ripaghi in prestazioni.
Da qualunque funzione o metodo è possibile attribuire ad una qualunque
window l'owner globale scavalcando tutto.
Se non sono stato chiaro, dimmelo.
Ciao
Massimo
"Robby" <roberto...@NxOxSPAMiol.it> ha scritto nel messaggio
news:99a6cl$cgp$1...@zamboni.dsnet.it...
