Graphics has no backing

Hallo in die Runde.
Ich finde den Grund für diesen Fehler nicht (Mac OS 10.14.3; Xojo 2018r4):
Graphics has no backing, most likely its associated Picture has been destroyed

Graphics (g) ist vorhanden und Picture § ebenfalls. Auch der Inhalt scheint mir in Ordnung zu sein.

Wonach könnte ich noch schauen?

Mir würde es erstmal reichen, wenn ich den Fehler abfangen könnte.

Hier noch ein paar Bilder mit Werten, die ich sehe:

##############################

##############################

##############################

Hier noch der Code der Routine:

Der Code vermischt Business Logic und Zeichnen. Ich kann bei den Variablennamen gar nicht erkennen, was p macht. Ah, auf den dritten Blick sehe ich, wo p verwendet wird. Ich würde Dir empfehlen, erst einmal den Code ein wenig zu entzerren.

Ich finde das übersichtlich.
Ich habe ein Picture-Array (Etikettbuffer) und nutze dessen Graphics-Eigenschaft um dort ein Bild § hinein zu zeichnen:

g.DrawPicture p,0,0,g.Width,g.Height,0,0,p.Width,p.Height

P wird zuvor in einer anderen Methode erzeugt (wenn kein Vorlagenpfad vorhanden ist, wir ein Hintergrundbild benutzt) :

if Vorlagenpfad="" then p=hintergrund3 else p=Vorlageausgeben(nr) end

g ist nicht nil
p ist nicht nil
p enthält ein Bild
ich verstehe nicht, warum es hier zu einer Fehlermeldung “NilObjectException” (siehe erstes Bild) kommt. Auch die Erklärung dazu (Graphics has no backing, most likely its associated Picture has been destroyed) ist für mich nicht nachvollziehbar.

Irgendeine Idee?

Du erzeugst ein altes Picture mit Mask. Würde es funktionieren, den neuen Constructor ohne Bittiefe zu verwenden, um eines mit Alpha-Kanal zu erzeugen?

Zum Lesen: Clean Code Collection von Robert Martin. Ich kann in Deinem Code noch nicht mal nach der Variable p suchen.

Ist Dein Code HiDPI? Schau mal, ob es einen Unterschied macht, ob HiDPI an ist oder nicht.

What does myNewPicture(x,y,32) do that new picture (x,y,32) does not?

Does it make a difference when you set transparent = 1

What happens if you replace p = hintegrund3
with

p = new picture(x,y) p.graphics.forecolor = &c0000FF p.graphics.fillrect x/4, y/4, x/4,y/4

@ Ulrich:
Ich wei nicht mal, wasDu mit einem Construktor ohne Bittiefe meinst.
Ich erzeuge ein ganz normales Picture mit “New Picture”

In der Language Reference finde ich unter Picture die Funktion ConvertToAlphaPicture. Meinst Du das?
Erstmalig trat der Fehler auf, nachdem ich in der Methode “Vorlageausgeben” eine Vorlage mit einem Bild nutzte. Das habe ich aber zwischenzeitlich wieder rausgenommen und bekomme den Fehler dennoch.

@Beatrix:
den Code habe ich als Bild eingefgt, weil er sich besser liest (ich finde es bersichtlicher). Hier der eingefgte Code als Text:

[code]dim g as graphics
dim s1,s3,abstand,i As integer
dim gd, sd as string
dim p as Picture

redim textzeile(-1)
Etikettbuffer.append MyNewPicture(x,y,32)
if etikettbuffer(ubound(etikettbuffer))=nil then
Hinweis(“Konnte Ettikett(en) nicht erzeugen. Zuwenig Speicher?”)
else
etikettbuffer(ubound(etikettbuffer)).transparent=1 //(1=wei ist transparent)
g=etikettbuffer(ubound(etikettbuffer)).graphics
if g<> nil then
g.TextFont=ZeichensatzPopup.text
g.foreColor=rgb(255,255,255)//ws
g.fillRect 0,0,g.width,g.height

if RadioButton3.value=false then
//auskommentiert
else
//Etikett anhand Vorlage erzeugen
if Vorlagenpfad="" then
p=hintergrund3
else
p=Vorlageausgeben(nr)
end

if p<>nil then
g.DrawPicture p,0,0,g.Width,g.Height,0,0,p.Width,p.Height
else
Hinweis(EtikettendruckHinweis1)
end
end
else
Hinweis(EtikettendruckHinweis1)
end
end

Exception err [/code]

In MyNewPicture I catch problems with size zero and to big pictures (Fehlerprotokoll=Error protokoll -> only informations write in an internal array and file)
And something windos specials.

Function MyNewPicture:

[code]dim fehler,j as integer
dim i,i1,i2,i3 as Double

Fehler=0
if x=0 then
FehlerprotokollAktuelleMethode.append str(ticks-LastProgTicks)+" +++ MyNewPicture: X=0 +++"
FehlerprotokollSichern(false) //Fehlerprotokoll
end
Fehler=1
if y=0 then
FehlerprotokollAktuelleMethode.append str(ticks-LastProgTicks)+" +++ MyNewPicture: Y=0 +++"
FehlerprotokollSichern(false) //Fehlerprotokoll
end
Fehler=2
if x>32000 then
FehlerprotokollAktuelleMethode.append str(ticks-LastProgTicks)+" +++ MyNewPicture: X>32000 +++"
FehlerprotokollSichern(false) //Fehlerprotokoll
end
Fehler=3
if y>32000 then
FehlerprotokollAktuelleMethode.append str(ticks-LastProgTicks)+" +++ MyNewPicture: Y>32000 +++"
FehlerprotokollSichern(false) //Fehlerprotokoll
end

Fehler=4
if TargetWindows then
j=2040
i1=x/1024
i2=y/1024
i3=d/8
i=i1i2i3
if i>j then
Hinweis(“Unter Windows gibt es einen Fehler in der Entwicklungsumgebung, der bei sehr groen Bildern zu einem Absturz fhrt. Um das zu verhindern wird das Bild (programmintern) verkleinert. Wenn die Ausgabe nicht den Vorstellungen entspricht, bitte melden!”)
end
do
i1=x/1024
i2=y/1024
i3=d/8
i=i1i2i3
if i>j then
x=x-10
else
exit
end
Loop
end
Try
return New Picture(min(max(1,x),32000),min(max(1,y),32000),d)
Catch e As RuntimeException
If e IsA OutOfMemoryException Then
'Hinweis(“Familienbande hat nicht genug Speicher zum Anlegen des erforderlichen Bildes.”+EndOfLine+“Mglicherweise hilft es, Familienbande neu zu starten oder die 64-Bit Version von Familienbande zu nutzen.”)
Return nil
Else
’ Re-raise the exception for the framework
Raise e
End If
End Try
[/code]

etikettbuffer is transparent=1 all the time.

So I set (hintergrund3 wasn’t used, Vorlagenpfad allways <>“”):

if Vorlagenpfad="" then
p=hintergrund3
else
p=Vorlageausgeben(nr)
p.Transparent=1
end

if p<>nil then
g.DrawPicture p,0,0,g.Width,g.Height,0,0,p.Width,p.Height
else
Hinweis(EtikettendruckHinweis1)
end


Same Error :frowning:

Wenn ich die p nicht selbst erzeuge sondern grundstzlich die Hintergrundgrafik nutze, tritt das Problem auch auf.

p=hintergrund3 – ist nur ein Zeiger auf das Bild
// x,y Werte sind bei Dir nicht ersichtlich
// setze p als neues Bild dann gehts

p= New picture(x,y,32)
If p<>Nil Then
p.Graphics.drawpicture Hintergrund3,0,0,p.Width,p.height,0,0,hintergrund3.widht,hindergrund3.height
g.DrawPicture p,0,0,g.Width,g.Height,0,0,p.Width,p.Height
End If

@Rudolf:
Die Erklrung hrt sich plausibel an.
Leider trifft das nur zu, wenn ich hintergrund3 nutze.

Der Fehler fiel erstmals auf (und tritt noch auf), als p ber die Methode Vorlageausgeben erzeugt wurde.
In der Routine habe ich im Wesentlichen:

[code]w=max(1,val(EField(8).text))*25//=635dpi
h=max(1,val(EField(9).text))*25//=635dpi
EtikettPicture=New Picture(w,h,32)

DoPrinting(EtikettPicture.Graphics,

Return EtikettPicture[/code]

DoPrinting enthlt dann die eigentlichen Zeichenfunktionen, die alle auf das bergebene EtikettPicture.Graphics zugreifen.

Somit ist p ein korrektes Picture. Denke ich.
Zumindest kann ich es mir im Debugger bei Auftreten des Fehlers ansehen. Sieht gut aus (siehe Ausgangsbeitrag, Bild 3).