Si rotto il Clip...

Buongiorno All…
Mi si rotto il clip…
Sembra un titolo strano per un post di questo forum… Ma invece esattamente cos
Ho una windows dove disegno l’anteprima dei documenti ( ddt / fatture / ordini … etc. etc. etciumm… e scusate l’allergia ).
Preparo prima un’oggetto paint dove disegno vari elementi ( i box dei vari campi con la descrizione all’interno ).
Per disegnare questi box utilizzo graphics.clip ;
E’ sempre funzionato tutto … fino alla nuova versione di XOJO … ( 2018.1 )
difatti il codice :

      dim mybox as Graphics
      mybox = pic.Graphics.Clip(round(rsdeftesta.Field("colonna").DoubleValue * fattore),round(rsdeftesta.Field("riga").DoubleValue * fattore),round(rsdeftesta.Field("larghezza").DoubleValue * fattore),round(rsdeftesta.Field("interlinea").DoubleValue * fattore))
      mybox.TextFont = ffont
      mybox.TextSize = ffontsize
      mybox.DrawString(ffcontenuto,0,round(rsdeftesta.Field("interlinea").DoubleValue * (fattore / 2)))

E’ sempre funzionato.
Solo oggi che stavo configurando alcuni tipi di documento mi sono scontrato con questa parte di codice che non ne vuole sapere di funzionare
pic.graphics.clip(x,y,xx,yy) da errore e crasha.

#if XojoVersion = 2018.1 then
  #pragma Error "Graphics.Clip NON FUNZIONA !!!! "
#endif

Mi sembra di essere tornato agli arbori dell’informatica quando andavo nelle aziende
per la manutenzione delle procedure contabili …
<< Non funziona più la cassetta del WC diceva l’impiegata >>. e l’altra gli rispondeva << c’è qui il tecnico del programma di contabilità >>.

Nulla anche con la versione 2017.r3 graphics.clip non clippa…

Verifica, non mi risulta questo problema
i valori sono corretti? xx e yy ad esempio?

Allora un paio di settimane fa stato riportato anche sul forum inglese che il clip su windows non funziona.
Il clip comodo per avere un overflow hidden, ma con il drawstring puoi usare i parametri opzionali:
WrapWidth as Integer: specifica una sorta di lunghezza massima,
Condense as Boolean: quando true se la lunghezza massima viene superata ti mette dei “…”
No proprio come clippare ma ti pu essere utile.

Più che altro Michelangelo, con il clip mi evidenziava l’esatto ingombro dei campi.
Comunque ho rimontato xojo 2017.r3 e anche li non funziona.
Quello che mi da fastidio è che lo stac riporta un NilOBJ

Errore : 
Stack : RaiseNilObjectException
tipidocumentopreview.tipidocumentopreview.disegna%%o<tipidocumentopreview.tipidocumentopreview>
tipidocumento_.tipidocumento_.pbanteprima_Action%%o<tipidocumento_.tipidocumento_>o<PushButton>
Delegate.IM_Invoke%%o<PushButton>
AddHandler.Stub.15%%
_ZN19RuntimeButtonRouter17PushButtonClickedEP10PushButton
XojoFramework$5629
-[NSObject performSelector:withObject:]
__36-[NSApplication sendAction:to:from:]_block_invoke
_os_activity_initiate
-[NSApplication sendAction:to:from:]
-[NSControl sendAction:to:]
__26-[NSCell _sendActionFrom:]_block_invoke
_os_activity_initiate
-[NSCell _sendActionFrom:]
__48-[NSCell trackMouse:inRect:ofView:untilMouseUp:]_block_invoke1010
_os_activity_initiate
-[NSCell trackMouse:inRect:ofView:untilMouseUp:]
-[NSButtonCell trackMouse:inRect:ofView:untilMouseUp:]
-[NSControl mouseDown:]
XojoFramework$5128
-[NSWindow _handleMouseDownEvent:isDelayedEvent:]
-[NSWindow _reallySendEvent:isDelayedEvent:]
-[NSWindow sendEvent:]
XojoFramework$5483
-[NSApplication sendEvent:]
XojoFramework$5025
XojoFramework$5026
Delegate.Invoke%%
Application._CallFunctionWithExceptionHandling%%o<Application>p
_Z33CallFunctionWithExceptionHandlingPFvvE
XojoFramework$5025
-[NSApplication run]
_Z8mainloopv
RuntimeRun
REALbasic._RuntimeRun
_Main
main
start


Altro : 
Type Of Exception:NilObjectException
Sub tipidocumentopreview.tipidocumentopreview.disegna( tipidocumentopreview.tipidocumentopreview )
Sub tipidocumento_.tipidocumento_.pbanteprima_Action( tipidocumento_.tipidocumento_, PushButton )
Sub Delegate.IM_Invoke( PushButton )
Sub AddHandler.Stub.15()
Sub Delegate.Invoke()
Sub Application._CallFunctionWithExceptionHandling()
Azienda : 0001
Utente : MASSIMILIANO

Ovviamente l’errore (NilObjectException) avviene appena viene eseguito il codice
mybox = pic.Graphics.Clip(round(rsdeftesta.Field(“colonna”).DoubleValue * fattore),round(rsdeftesta.Field(“riga”).DoubleValue * fattore),round(rsdeftesta.Field(“larghezza”).DoubleValue * fattore),round(rsdeftesta.Field(“interlinea”).DoubleValue * fattore))

Provo a far girare anche il mio lettore ‘dxf’ per vedere se mi da lo stesso errore/orrore.

Ma pic una picture immutable? In tal caso la sua graphic nil

allora, sempre funzionato. Per …
Allora creo l’oggetto picture

// creo oggetto picture 
dim pic as new Picture(width, height, 32)
// inserisco l'immagine .. (ovviamente con tutte le verifiche del formato, etc 
pic = Picture.Open(ftemplate)    
// ci scrivo sopra ... 
dim mybox as Graphics
mybox = pic.Graphics.Clip(round(rsdeftesta.Field("colonna").DoubleValue * fattore),round(rsdeftesta.Field("riga").DoubleValue * fattore),round(rsdeftesta.Field("larghezza").DoubleValue * fattore),round(rsdeftesta.Field("interlinea").DoubleValue * fattore))
mybox.TextFont = ffont
mybox.TextSize = ffontsize
mybox.DrawString(ffcontenuto,0,round(rsdeftesta.Field("interlinea").DoubleValue * (fattore / 2)))

Per mi hai messo la pulce nell’orecchio, difatti pic.graphics NIL
come posso ovviare all’inconveniente ?

Le risorse o file aperti sono immutabili per cui non hanno graphic.
diciamo che la soluzione vicina a quello che hai scritto:

// creo oggetto picture 
dim pic as new Picture(width, height, 32) //???
// inserisco l'immagine .. (ovviamente con tutte le verifiche del formato, etc 
pic = Picture.Open(ftemplate)    
// ci scrivo sopra ..

Hai creato pic e poi apri distruggendo il pic creato, bastava dim pic as Picture

La soluzione :

// creo oggetto picture originale
dim opic as Picture
// inserisco l'immagine .. (ovviamente con tutte le verifiche del formato, etc 
opic = Picture.Open(ftemplate)   

//Creo l'oggetto picture di dimensioni identiche
dim Pic as new Picture(opic.width, opic.height, 32) //o anche senza ,32 
//Disegno la pic originale
pic.graphics.drawPicture opic, 0, 0
//elimino dalla memoria la pic originale
opic=nil
// ci scrivo sopra ..

Ci vuole sempre Antonio …
Giuro dora in poi leggo 4 volte le istruzioni …