none
Behaviour of EVAL in ACCESS > 2003

    Frage

  • Dear all,

    I have a problem with EVAL() which causes extrem problems due to the fact that it works in Access 2003 perfectly for years.

    Lets have the following coding

    Dim strCommand As String
    strCommane = "Forms('frmIndividuals')!axTreeview.SelectedItem.Key"
    
    Eval (strCommand)
    

    When I ran the above code in Microsoft Access 2003 it returns the Key of the selected node from an ActiveX Control (TreeView)
    When I ran exactly the same coding in Microsoft Access 2010 I get an error 31005 from the ActiveX-Control which means

    Access could not evalute one or more expressions because an expression refers to "SelectedItem".
    (Translated from the geman messagebox!)

    Can anybody explain why EVAL() has restrictions since Access 2007?
    Thank you all for your comments.

    Environment:

    Microsoft Access 2010
    Microsoft Windows 7 Ultimate


    Uwe Ricken
    Microsoft Certified Database Administrator SQL Server 2005
    db Berater GmbH
    http://www-db-berater.de
    Dienstag, 21. September 2010 17:28

Antworten

  • Hallo Uwe,

     

    Ich kann das nachstellen.

    Ich vermute, das liegt an den geänderten Sicherheits-Features von Access 2010 - hier für ActiveX-Steuerelemente.

    Auf das eigentliche ActiveX-Control gibt es bereits keinen Zugriff:

    strCommand = "Forms('frmIndividuals')!axTreeview.Object"
    
    
    
    
    

    ergibt schon einen Fehler. Offenbar lässt hier Access über Umwege (Eval) keinen Zugriff auf das im CustomControl befindliche Objekt zu.

    Da kann ich dir nur folgenden Workaround anbieten:

    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

    Sub TestEval()
     Dim sEVal As String
     Dim lPtrOLE As Long
     Dim obj As MSComctlLib.TreeView
     
     sEVal = "Forms('frmIndividuals')!axTreeview.LpOleObject" 
    lPtrOLE = Eval(sEVal) Set obj = ObjectFromPointer(lPtrOLE) Debug.Print obj.SelectedItem.Key Set obj = Nothing End Sub Function ObjectFromPointer(lPtr As Long) As Object Dim oTemp As Object CopyMemory oTemp, lPtr, 4 Set ObjectFromPointer = oTemp CopyMemory oTemp, 0&, 4 End Function

     

    Her wird erstmal der Pointer des Objekts über Eval erhalten - LpOleObject ist eine einversteckte Eigenschaft von CustomControl - und daraus mit der Hilfsfunktion ein VErweis auf das tatsächliche Treeview erhalten.

    Übrigens muss die Objektvariable dezidiert vom Typ Treeview sein. Mit late binding und Deklaration As Object crasht Access bei mir.

    Ciao, Sascha

    PS: Ist das ein Mist mit den Formatierungsfunktionen dieses Forums! :-(


    Sascha Trowitzsch
    • Als Antwort markiert Uwe RickenMVP Donnerstag, 23. September 2010 14:46
    Donnerstag, 23. September 2010 11:03

Alle Antworten

  • Hallo Uwe,

    Uwe Ricken wrote:

    I have a problem with EVAL() which causes extrem problems due to the fact
    that it works in Access 2003 perfectly for years.

    Du bist hier im dt. Forum gelandet ;-)

    Lets have the following coding
    [...]
    Environment:

    Microsoft Access 2010
    Microsoft Windows 7 Ultimate

    32- oder 64-bit? Frage gilt fuer beides.

    Bist du sicher, dass dein ActiveX unter Win7/A10 unterstuetzt wird? Hast du
    unter A07 getestet und lief es da?

    Gruss - Peter


    Mitglied im http://www.dbdev.org
    FAQ: http://www.donkarl.com

    Mittwoch, 22. September 2010 00:08
    Moderator
  • Hallo Peter,

    sorry, das habe ich überhaupt nicht gemerkt ;-).

    Es handelt sich um die 32bit Version von Office 2010. Das ActiveX ist noch ein Treeview 6.0 aus Access 2003. Ich habe es jedoch mal aus dem Formular geschmissen und ersetzt. Das Treeview wird als MSComctlLib.TreeCtrl.2 definiert.

    Ist schon seltsam, hat in 2003 ohne Probleme funktionert. 2007 habe ich geflissentlich übersprungen.


    Uwe Ricken
    Microsoft Certified Database Administrator SQL Server 2005
    db Berater GmbH
    http://www-db-berater.de
    Mittwoch, 22. September 2010 06:24
  • Hallo Uwe,

    Uwe Ricken wrote:

    Es handelt sich um die 32bit Version von Office 2010. Das ActiveX ist
    noch ein Treeview 6.0 aus Access 2003. Ich habe es jedoch mal aus dem
    Formular geschmissen und ersetzt. Das Treeview wird als
    MSComctlLib.TreeCtrl.2 definiert.

    Mit welchem Ergebnis? Funktioniert es jetzt?

    Ist schon seltsam, hat in 2003 ohne Probleme funktionert. 2007 habe ich
    geflissentlich übersprungen.

    Denke, da bist du nicht der einzige ;-)

    Gruss - Peter


    Mitglied im http://www.dbdev.org
    FAQ: http://www.donkarl.com

    Mittwoch, 22. September 2010 12:41
    Moderator
  • Hallo Peter,

    nein - funktioniert leider nicht. Immer noch der gleiche Fehler ;-(


    Uwe Ricken
    Microsoft Certified Database Administrator SQL Server 2005
    db Berater GmbH
    http://www-db-berater.de
    Mittwoch, 22. September 2010 13:39
  • Hallo Uwe,

     

    Ich kann das nachstellen.

    Ich vermute, das liegt an den geänderten Sicherheits-Features von Access 2010 - hier für ActiveX-Steuerelemente.

    Auf das eigentliche ActiveX-Control gibt es bereits keinen Zugriff:

    strCommand = "Forms('frmIndividuals')!axTreeview.Object"
    
    
    
    
    

    ergibt schon einen Fehler. Offenbar lässt hier Access über Umwege (Eval) keinen Zugriff auf das im CustomControl befindliche Objekt zu.

    Da kann ich dir nur folgenden Workaround anbieten:

    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

    Sub TestEval()
     Dim sEVal As String
     Dim lPtrOLE As Long
     Dim obj As MSComctlLib.TreeView
     
     sEVal = "Forms('frmIndividuals')!axTreeview.LpOleObject" 
    lPtrOLE = Eval(sEVal) Set obj = ObjectFromPointer(lPtrOLE) Debug.Print obj.SelectedItem.Key Set obj = Nothing End Sub Function ObjectFromPointer(lPtr As Long) As Object Dim oTemp As Object CopyMemory oTemp, lPtr, 4 Set ObjectFromPointer = oTemp CopyMemory oTemp, 0&, 4 End Function

     

    Her wird erstmal der Pointer des Objekts über Eval erhalten - LpOleObject ist eine einversteckte Eigenschaft von CustomControl - und daraus mit der Hilfsfunktion ein VErweis auf das tatsächliche Treeview erhalten.

    Übrigens muss die Objektvariable dezidiert vom Typ Treeview sein. Mit late binding und Deklaration As Object crasht Access bei mir.

    Ciao, Sascha

    PS: Ist das ein Mist mit den Formatierungsfunktionen dieses Forums! :-(


    Sascha Trowitzsch
    • Als Antwort markiert Uwe RickenMVP Donnerstag, 23. September 2010 14:46
    Donnerstag, 23. September 2010 11:03
  • Am 23.09.2010 schrieb Sascha Trowitzsch [MVP]:

    PS: Ist das ein Mist mit den Formatierungsfunktionen dieses Forums! :-(

    Man nehme einen Newsreader und die Communitybridge, dann gibts die
    Formatierungsprobleme nicht. ;)

    Servus
    Winfried


    Connect2WSUS: http://www.grurili.de/tools/Connect2WSUS.exe
    GPO's: http://www.gruppenrichtlinien.de
    Community Forums NNTP Bridge: http://communitybridge.codeplex.com/

    Donnerstag, 23. September 2010 12:14
  • Am 23.09.2010 schrieb Sascha Trowitzsch [MVP]:

    PS: Ist das ein Mist mit den Formatierungsfunktionen dieses Forums!
    :-(

    Man nehme einen Newsreader und die Communitybridge, dann gibts die
    Formatierungsprobleme nicht. ;)

    Mache ich ja auch, aber wenn ich eh gerade im Browser bin, reicht ein Klick auf das entspr. Bookmark in der Leiste.
    Aber in Zukunft gehe ich auch NUR noch über die Bridge.

    Ciao, Sascha


    Sascha Trowitzsch
    Donnerstag, 23. September 2010 13:14
  • Hallo Sasche,

    herzlichen Dank für Dein Feedback. Tatsächlich habe ich das auch bereits befürchtet und werde mich nun einer anderen Methode zuwenden. Problematisch ist vor allen Dingen, dass ich NUR mit Late Binding arbeite. Von daher bleibt mir erst mal keine andere Möglichkeit!

    PS: Coding geht doch mit der Schaltfläche [Codeblock hinzufügen] ganz einfach ;-)

    Function ObjectFromPointer(lPtr As Long) As Object
      Dim oTemp As Object
      CopyMemory oTemp, lPtr, 4
      Set ObjectFromPointer = oTemp
      CopyMemory oTemp, 0&, 4
    End Function
    
    

    Uwe Ricken
    Microsoft Certified Database Administrator SQL Server 2005
    db Berater GmbH
    http://www-db-berater.de
    Donnerstag, 23. September 2010 14:46
  • Am 23.09.2010 schrieb Sascha Trowitzsch [MVP]:

    PS: Ist das ein Mist mit den Formatierungsfunktionen dieses Forums! :-(

    Man nehme einen Newsreader und die Communitybridge, dann gibts die
    Formatierungsprobleme nicht. ;)

    Servus
    Winfried


    Connect2WSUS: http://www.grurili.de/tools/Connect2WSUS.exe
    GPO's: http://www.gruppenrichtlinien.de
    Community Forums NNTP Bridge: http://communitybridge.codeplex.com/


    Hallo Winfried,

    kannst Du einen Laien mal erklären, was genau "CommunityBrigde" bedeutet? Kann man das essen ;-). Mit welchen Newsreader soll man dann am besten arbeiten (Microsoft Mail)

    Danke für ein kurzes Feedback ...


    Uwe Ricken
    Microsoft Certified Database Administrator SQL Server 2005
    db Berater GmbH
    http://www-db-berater.de
    Donnerstag, 23. September 2010 14:47
  • Am 23.09.2010 schrieb Uwe Ricken:

    kannst Du einen Laien mal erklären, was genau "CommunityBrigde" bedeutet? Kann man das essen ;-). Mit welchen Newsreader soll man dann am besten arbeiten (Microsoft Mail)

    Die Community Bridge ist ein kleine Schnittstelle zwischen den
    MS-Foren und dem Newsreader. Der Newsreader greift also über die
    Bridge auf die Foren und deren Postings zu. Im NUA sieht man (ich)
    fast keinen Unterschied zu den richtigen Newsgroups.

    Man kann natürlich mit Windows Mail oder auch Windows Live Mail
    arbeiten, mein Favorit ist 40tude Dialog. Lässt sich mit vielen
    Scripten sehr individuell einstellen und konfigurieren. Wechselt man
    den Rechner, nimmt man einfach das Dialog Verzeichnis mit und schon
    ist der NUA wieder einsatzbereit. Eine eigene Newsgroup hat das gut
    Stück auch: de.comm.software.40tude-dialog

    Servus
    Winfried


    Connect2WSUS: http://www.grurili.de/tools/Connect2WSUS.exe
    GPO's: http://www.gruppenrichtlinien.de
    Community Forums NNTP Bridge: http://communitybridge.codeplex.com/

    Donnerstag, 23. September 2010 15:04