Error bei Zugriff auf nicht mehr vorhandenes Objekt

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Error bei Zugriff auf nicht mehr vorhandenes Objekt

Re: Error bei Zugriff auf nicht mehr vorhandenes Objekt

von gogo » Fr, 13.01.2012 02:52

Stephan hat geschrieben:Ich weiß nicht was das ("Makro an einen Frame zu binden") heißen soll...
Ich dachte dabei an die Möglichkeit OOo während ein Makro läuft quasi "einzufrieren" und die Oberfläche erst wieder zur Benutzung freizugeben wenn das Makro beendet ist, oder wie schon geschrieben das Makro zu stoppen wenn etwas Bestimmtes passiert, etwa so ähnlich als würde man im Windows-Taskmanager einen Prozess beenden.
Stephan hat geschrieben:Wenn es hingegen weitere Nebenbedingungen gibt mußt Du uns diese wissen lassen, denn wir können Diese unmöglich erahnen.
Keine Nebenbedingungen 8)

Re: Error bei Zugriff auf nicht mehr vorhandenes Objekt

von Stephan » Fr, 13.01.2012 01:57

Das Problem ist, dass ein und derselbe Fehler einmal ein Bug ist und ein anderes mal ein "ignorierbarer Fehler".
Exakt so hatte ich Dich auch verstanden.
Das Makro startet also mit dem entsprechenden Ereignis, der User "bricht aber ggf. ab" indem er das Fenster schließt.
UNd das kannst Du dedektieren indem Du beim SChließen eine Variable setzt - ich schriebs bereits.
Tritt der Fehler beim Öffnen des Formulars auf (weil das Ereignis "nach dem Datensatzwechsel" ausgeführt wird bevor das Formular noch vollständig geladen ist) so tritt derselbe Error auf.
Nur kannst Du es da eben einrichten das gerade genannte Variable dann einen anderen Wert hat und schon lassen sich beide Fälle sauber unterscheiden.

Wie bekommt die Variable einen anderen Wert?
Es gibt 2 denkbare Möglichkeiten wie das Formular geöffnet wird, entweder per Hand oder per Code. FAlls per Hand weise ein Makro dem Ereignis "Beim Öffnen" zu und setze dort den Variablenwert, falls per code setze dort direkt den Variablenwert.
Entseht ein Fehler weil der User das Formular geschlossen hat, so ist es ein "ignorierbarer Fehler".
Entsteht ein Fehler durch sonst ein Problem (wie oben beschrieben oder durch ein Timeout etc.) dann ist das ein Bug und der Fehler muss angezeigt werden.
Nochmals: so hatte ich Dich längst verstanden.
ich dachte nur, dass es evtl. eine Möglichkeit gibt ein Makro an einen Frame zu binden, sodas es abgebrochen wird wenn der Frame geschlossen wird.
Ich weiß nicht was das ("Makro an einen Frame zu binden") heißen soll, entweder du willst etwas auf einem ganz bestimmten Weg lösen, dann kann es sein das OOo diesen Weg nicht bietet.

Für das durch Dich geschilderte Problem hatte ich bereits eine mögliche Lösung genannt und das einzige Problem was ich mir noch denken könnte ist das Du vielleicht im Falle das das Makro in einen Fehler läuft weil das Formular nicht da ist, Du dann das Makro frühestmöglich beenden willst, dann frage halt frühestmöglich (und nicht erst mit On Error GOTO ...) den Variablenwert ab, denn es ist ja bekannt das wenn ein bestimmmter Wert vorliegt das Formular geschlossen wurde und somit das Makro scheitern wird.

Wenn es hingegen weitere Nebenbedingungen gibt mußt Du uns diese wissen lassen, denn wir können Diese unmöglich erahnen.

Entschuldigung, ich meine das garnicht böse, nur es macht einfach keine Spass über eine Antwort nachzudenken um dann als Reaktion darauf quasi gesagt zu bekommen das das keine gute Lösung ist weil ja noch zusätzlich ... und die Antworter hier eben über dieses 'Zusätzlich' überhaupt nicht informiert sind.
Bitte verstehe auch diese Perspektive und gib nötigenfalls weitere Informationen.



Gruß
Stephan

Re: Error bei Zugriff auf nicht mehr vorhandenes Objekt

von gogo » Do, 12.01.2012 20:05

Stephan hat geschrieben:
gogo hat geschrieben:Eine Fehlerroutine ohne Prompt ist keine Lösung, da das Makro ja nur schwierig zwischen einem "echten Fehler" und einem Fehler der durch das Schließen entstanden ist unterscheiden kann.
(Was meint hier "Prompt"?)
z.B. Eine Messagebox mit dem Fehlercode etc. - jedenfalls etwas das den Code anhält.
Stephan hat geschrieben:Ansonsten sollte sich ein Fehler durch Schliessen doch genauso auswirken wie du es beschreibst, also ist das Steuerelement nicht mehr gegenwärtig wurde geschlossen oder welchen andersartigen Fehler könntest du Dir denken, der sich gleich manifestiert und eine Unterscheidung unmöglich machen würde?
Unter der Annahme das der Code einmal läuft und getestet ist sehe ich einfach nichts Wahrscheinliches was dazu führen könnte das der gleiche Fehler wie beim Schließen aufträte.
Das Problem ist, dass ein und derselbe Fehler einmal ein Bug ist und ein anderes mal ein "ignorierbarer Fehler".
z.B.:
- beim Anzeigen eines Datensatzes in einem Formular wird ein Listenfeld gefüllt
- Das Füllen des Feldes erfolgt in mehreren Schritten (Union-Abfrage) und dauert 1-2 Sekunden.

Das Makro startet also mit dem entsprechenden Ereignis, der User "bricht aber ggf. ab" indem er das Fenster schließt.
Bei der Belegung der Objektvariable mit dem Listenfeld-Objekt ist das Listenfeld-Objekt ja vorhanden, nach dem Schließen des Fensters nicht mehr - ergo Error.
Tritt der Fehler beim Öffnen des Formulars auf (weil das Ereignis "nach dem Datensatzwechsel" ausgeführt wird bevor das Formular noch vollständig geladen ist) so tritt derselbe Error auf.

Entseht ein Fehler weil der User das Formular geschlossen hat, so ist es ein "ignorierbarer Fehler".
Entsteht ein Fehler durch sonst ein Problem (wie oben beschrieben oder durch ein Timeout etc.) dann ist das ein Bug und der Fehler muss angezeigt werden.

Klar kann man diesen einen "Fehler" durch diverse Maßnahmen abfangen und auch unterscheiden, ich dachte nur, dass es evtl. eine Möglichkeit gibt ein Makro an einen Frame zu binden, sodass es abgebrochen wird wenn der Frame geschlossen wird.
Stephan hat geschrieben:Falls dir das trotzdem zu unsicher ist lass ein Makro durch das Schliessen-Ereignis starten (Extras-Anpasssen-Ereignisse) und eine Variable auf einen bestimmten Wert setzen und kontrolliere bim NIchtvorhandensein des steuerelements auch den Wert dieser Variable um zu wissen ob geschlossen wurde.
Gute Idee - Danke, damit ist nämlich auch meine nächste Frage beantwortet. Der erste sehr einfache Lösungsansatz war einfach bei Makrobeginn die Schließen-Schaltfläche zu deaktiveren:

Code: Alles auswählen

Sub Makrostart
oform = ...
oform.getbyname("Button_Schliessen").Enabled = false

...

oform.getbyname("Button_Schliessen").Enabled = true
end sub
... und am Ende wieder zu aktivieren - geht schnell und einfach, bringt aber nix wenn 2 Makros zeitgleich laufen. Damit ist aber zumindest das Schließen per Button verhindert, nicht aber das Schließen per "Kreuzchen rechts oben im Fenster" oder wenn die Applikation als Ganzes geschlossen wird. Da ich aber sowieso einen ganzen Haufen globaler Variablen habe, wird eine mehr oder weniger nicht so ins Gewicht fallen.

Re: Error bei Zugriff auf nicht mehr vorhandenes Objekt

von Stephan » Do, 12.01.2012 18:10

Kann man das (Schließen, oder den Fehler) irgendwie verhindern?
Ich kenne aus dem Stehgreif keine Lösung das Schließen zu verhindern. Den Fehler könnte man natürlich mit einer Fehlerroutine abfangen.
Eine Fehlerroutine ohne Prompt ist keine Lösung, da das Makro ja nur schwierig zwischen einem "echten Fehler" und einem Fehler der durch das Schließen entstanden ist unterscheiden kann.
(Was meint hier "Prompt"?)

Ansonsten sollte sich ein Fehler durch Schliessen doch genauso auswirken wie du es beschreibst, also ist das Steuerelement nicht mehr gegenwärtig wurde geschlossen oder welchen andersartigen Fehler könntest du Dir denken, der sich gleich manifestiert und eine Unterscheidung unmöglich machen würde?

Unter der Annahme das der Code einmal läuft und getestet ist sehe ich einfach nichts Wahrscheinliches was dazu führen könnte das der gleiche Fehler wie beim Schließen aufträte.

Falls dir das trotzdem zu unsicher ist lass ein Makro durch das Schliessen-Ereignis starten (Extras-Anpasssen-Ereignisse) und eine Variable auf einen bestimmten Wert setzen und kontrolliere bim NIchtvorhandensein des steuerelements auch den Wert dieser Variable um zu wissen ob geschlossen wurde.



Gruß
Stephan

Error bei Zugriff auf nicht mehr vorhandenes Objekt

von gogo » Do, 12.01.2012 17:48

Hallo,

'Error bei Zugriff auf nicht mehr vorhandenes Objekt' - mir ist leider kein passenderer Titel eingefallen, ich ändere ihn aber gerne, wenn gewünscht.

In Base Datenbanken kommt es immer wieder vor, dass der User das Fenster in dem das Formular(-Objekt) geladen wurde schließt, während ein Makro noch läuft.
Wenn das Makro dann auf eines der Objekte im Formular zugreifen will, kommt es natürlich zu einem Error.

Kann man das (Schließen, oder den Fehler) irgendwie verhindern? Eine Fehlerroutine ohne Prompt ist keine Lösung, da das Makro ja nur schwierig zwischen einem "echten Fehler" und einem Fehler der durch das Schließen entstanden ist unterscheiden kann.

Nach oben