Graphics has no backing

  1. 7 months ago

    Stefan M

    28 Mar 2019 Germany, NRW, Kirchlengern (Kr...
    Edited 7 months ago

    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 (p) 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:
    -image-
    ##############################
    -image-
    ##############################
    -image-
    ##############################
    -image-

  2. Stefan M

    28 Mar 2019 Germany, NRW, Kirchlengern (Kr...
    Edited 7 months ago

    Hier noch der Code der Routine:
    -image-

  3. Beatrix W

    28 Mar 2019 Pre-Release Testers, Third Party Store Europe (Germany)

    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.

  4. Stefan M

    29 Mar 2019 Germany, NRW, Kirchlengern (Kr...

    Ich finde das übersichtlich.
    Ich habe ein Picture-Array (Etikettbuffer) und nutze dessen Graphics-Eigenschaft um dort ein Bild (p) 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?

  5. Ulrich B

    29 Mar 2019 Pre-Release Testers, Xojo Pro Europe (Germany, Berlin) · xo...

    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?

  6. Beatrix W

    29 Mar 2019 Pre-Release Testers, Third Party Store Europe (Germany)

    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.

  7. Jeff T

    29 Mar 2019 Pre-Release Testers Midlands of England, Europe

    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
  8. Stefan M

    29 Mar 2019 Germany, NRW, Kirchlengern (Kr...

    @ 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 eingefügt, weil er sich besser liest (ich finde es übersichtlicher). Hier der eingefügte Code als Text:

    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 
  9. Stefan M

    29 Mar 2019 Germany, NRW, Kirchlengern (Kr...

    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:

    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=i1*i2*i3
    if i>j then
    Hinweis("Unter Windows gibt es einen Fehler in der Entwicklungsumgebung, der bei sehr großen Bildern zu einem Absturz führt. 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=i1*i2*i3
    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+"Möglicherweise 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
  10. Stefan M

    29 Mar 2019 Germany, NRW, Kirchlengern (Kr...

    Does it make a difference when you set transparent = 1

    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 :-(

  11. Stefan M

    29 Mar 2019 Germany, NRW, Kirchlengern (Kr...

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

  12. 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

  13. Stefan M

    29 Mar 2019 Germany, NRW, Kirchlengern (Kr...
    Edited 7 months ago

    @Rudolf:
    Die Erklärung hört 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:

    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

    DoPrinting enthält 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).

or Sign Up to reply!