Showing results 1 to 7 of 7

Thread: Zugriff auf Microsoft WebBrowser

  1. #1
    henrykm Gast

    Default Zugriff auf Microsoft WebBrowser

    Hi @all.

    Ich hoffe, ich bin hier richtig. Als Newbie im Bereich Zenon stehe ich gerade vor einem Problem.

    Ich habe ein Bild, welches als einziges Object einen VBerweis auf ein Microsoft-Browser Control besitzt.

    Unter VBA benötige ich Zugriff auf dieses Control.

    Derzeit habe ich eine Methode Init_BrowserInit() welche als Paramter "objElem" vom Typ Element mitbringt. Abgesehen davon, dass mich interessieren würde wie hier der Zusammenhang oder die Übergabe dieses Elements realisiert wurde (scheint eine automatische Übergabe von Zenon als Instanz von Microsoft WebBrowser zu sein?) benötige ich eine Referenz auf dieses Objekt.

    Hintergrund: Ich muss aus der VBA-Umgebung heraus reagieren, wenn irgendwo die Language gewechselt wurde und diesem Object dann entsprechend navigieren.

    Ich hoffe, es ist zu verstehen, wo mein Problem liegt.

    Derzeit funktiert das Navigieren zwar - aber ich bekomme im Laufe der Zeit ein Problem mit dem Speicher.

    Nachfolgen die Codesequenzen:

    Code:
    Public Sub Init_BrwoserInit(obELem as Element)
    
    ' m_objElem wurde als globale Variable vom Typ Element deklariert
    
        If cInitBrowser Is Nothing Then
            Set cInitBrowser = New clsInitBrowser
        End If
    
        If Not obElem Is Nothing Then
            Set m_objElem = obElem
        End If
    
        cInitBrowser.RefreshBrowserControl
        
        ' Hier würde ich gerne wieder "zerstören" 
    '    Set m_objElem = Nothing
    
    End Sub
    Code:
    ' in der Class clsBrwoserInit
    
    Public Sub RefreshBrowserControl()
    
        Dim objVar As Variable
        Dim objControl As Object
        Dim navPath As String
        Dim iniPath As String
        Dim strLangSuffix As String
    
        On Error GoTo ErrorHandling
        
        ' Nachfolgend erfolgt zwar ein Sprung in die If-Abfrage, die anschließende
        ' Zuweisung funktioniert jedoch nicht mehr. objControl bleibt "Nothing"
    
        If Not m_objElem Is Nothing Then
            Set objControl = m_objElem.AktiveX
        End If
    
        Set objVar = 
            thisProject.Parent.Parent.Projects.Item("BAS").Variables.Item("LOCAL_LngExt")
        
        If Not objVar Is Nothing Then
            If objVar.value = "de" Then
                strLangSuffix = "?languageId=de-DE"
            ElseIf objVar.value = "en" Then
                strLangSuffix = "?languageId=en-GB"
            Else
                ' derzeit nicht definiert - Standart ist englisch
                strLangSuffix = "?languageId=en-GB"
            End If
            Set objVar = Nothing
        Else
            strLangSuffix = "?languageId=en-GB"
        End If
        
        iniPath = thisProject.Path & "RT\FILES\zenOn\custom\additional\Settings\" & INI_FILE
    
        navPath = Read_INI("LDS_CLIENT", "Path", iniPath)
    
        Dim lngPos As Integer
        lngPos = InStr(1, navPath, "?LanguageId", vbTextCompare)
        If lngPos > 0 Then
            navPath = Mid(navPath, 1, lngPos - 1)
        End If
    
        If navPath <> "" Then
            navPath = navPath + strLangSuffix
            If Not objControl Is Nothing Then
                objControl.Navigate navPath
            Else
                Debug.Print "Kein Browserobject vorhanden!"
            End If
        End If
    
    '    Set objControl = Nothing
        
        Exit Sub
    ErrorHandling:
        Call ErrorHandler(MODULE_NAME & "::RefreshBrowserControl")
    End Sub
    Diese Methode wird angestoßen, wenn ich einen "langauge-Wechsel-Event" erhalte.

    Code:
    Public Sub RefreshBrowserLanguage()
    
        If Not cInitBrowser Is Nothing Then
            cInitBrowser.RefreshBrowserControl
            Debug.Print "refresh browser language - mdlextroutines"
        End If
        
    End Sub

  2. #2
    Join Date
    30.05.2007
    Location
    Salzburg
    Posts
    879

    Default Re: Zugriff auf Microsoft WebBrowser

    Wenn ich das richtig verstanden habe:
    - in einem zenOn Bild befindet sich ein ActiveX control
    - dieses ActiveX control ist als MS Webbrowser control definiert (die entsprechende Referenz muss hierbei natürlich vorhanden sein - "Microsoft Internet Controls"
    - wenn eine zenOn Sprachumschaltfunktion angestoßen wurde, dann sollte innerhalb des WebBrowser controls navigiert werden

    Derzeit funktiert das Navigieren zwar - aber ich bekomme im Laufe der Zeit ein Problem mit dem Speicher.
    -> also wächst der Speicher an? während nur das eine Bild aufgeschalten ist oder wenn oft ein Bildwechsel (auf dieses Bild mit dem WebBrowser control) gemacht wird?
    -> wichtig hierbei wäre, dass wenn dieses Bild geschlossen wird auch die angelegten Objekte (vom ActiveX) wieder zerstört werden sollen
    -> das ActiveX control wird ja anhand des Init() Event (unter VBA Macros) defniert
    -> siehe auch hier: http://www.copadata.com/forums/showt...=activex+leave

    Gruß,
    Herbert

  3. #3
    henrykm Gast

    Default Re: Zugriff auf Microsoft WebBrowser

    Hallo Herbert,

    sorry, dass ich erst heute Antwort. Und danke für dein Feedback.

    Noch mal in Kurzform zum Aufbau:

    - ich nutze in dieser Anwendung 3 Bilder;
    - Eines davon beinhaltet ein ActiveX mit einem Web Browser Control;
    - dieses Control dient zur Darstellung verschiedener Reports;
    - aus dem Bildaufruf heraus wird eine Methode „Init_Browser“ angestoßen welche als Parameter das Web Browser Control erhält (obElem As Element)
    - in dieser Methode erstelle ich mir eine globale Instanz des übergebenen Objekts (dieses benötige ich, wenn ich später die Sprache wechsle und dadurch auf eine andere Adresse in meinem Webreporting-Bereich navigieren muss);


    Das Problem:

    - wenn ich zwischen den Bildern switche, verliere ich jedes Mal ca. 1 KB an Space;
    - in etwa den gleichen Umfang nimmt der zenrt32 – Prozess in seinem Speicherbedarf zu;
    - lass ich alles laufen und verzichte nur auf des letztendliche Navigieren, habe ich keinen Speicherverlust;
    - navigiere ich über dieses Web Browser Control z.B. zu Heise, verliere ich ebenfalls keinen Speicher;
    - nutze ich „about:blank“ gibt es wiederum kein Fehlverhalten;

    Bis dahin würde ich sagen, der Fehler liegt am Webreporting und ich gebe den schwarzen Peter ab.

    Wäre da nicht das Phänomen beim wechseln der Sprache. Bis auf die Initialisierung werden hier die gleichen Funktionen und Methoden benutzt. Und egal, welche Seite ich darstellen will, es gibt kein Speicherproblem.

    Somit müsste ich davon ausgehen, dass mein Problem in der Zuweisung des Browser – Objekts an meine globale Variable liegt. Dieses aber zerstöre ich definitiv jedes Mal. Bevor ich eine neue Zuweisung mache. Es wird auch als „Nothing“ angezeigt. Und hier war und bin ich (auch nach fast zweitägigen Tests) mit meinem Latein am Ende.

    Für den Moment habe ich es erst mal hinten angestellt. Nicht zuletzt deswegen, weil ich heute Nachmittag damit anfange, von der Version 6.20 auf 6.22 zu wechseln. Ich werde sehen, ob ich danach weiter komme.

    Gruß

    Henry

  4. #4
    henrykm Gast

    Default Re: Zugriff auf Microsoft WebBrowser

    Nachtrag:

    Ich verliere nicht 1 KB. Es teilweise mehrere GB.

    Beispielauswertung nach den Aufrufen:
    Speicher verfügbar: 654,09 MB

    Speicher verfügbar: 643,6 MB

    Speicher verfügbar: 639,13 MB

    Speicher verfügbar: 633,55 MB

    Speicher verfügbar: 632,42 MB

    Speicher verfügbar: 630,23 MB

    Speicher verfügbar: 627,78 MB

    Speicher verfügbar: 627,29 MB

    Speicher verfügbar: 624,34 MB

  5. #5
    Join Date
    30.05.2007
    Location
    Salzburg
    Posts
    879

    Default Re: Zugriff auf Microsoft WebBrowser

    Hallo Henry,

    Ich habe jetzt in unser "Datenbank" hinsichtlich diesem Verhalten ein wenig nachgeforscht:
    -> in Version 6.20 Beta gab es ein Problem mit dem Speicheranstieg, wenn ein ActiveX auf einem WindowsCE OS lief (war mit der freigegebenen Version von 6.20 SP0 behoben)
    -> für Version 6.21 Beta gab es ein Problem mit Speicheranstieg, wenn ein ActiveX in einem verlinkten Symbol integriert wurde (war mit der freigegebenen Version von 6.21 SP0 behoben)

    Um definitiv sicherzustellen, dass das angelegte Objekt "m_objElem.AktiveX" beim Verlassen des Bildes zerstört wird, kann wie folgt vorgegangen werden:

    Option Explicit
    Public WithEvents obPicWithWebBrowser As DynPicture
    Public WithEvents m_objElem As WebBrowser
    
    'event is fired on startin zenOn Runtime
    Private Sub Project_Active()
        'create ob object from the picture
        Set obPicWithWebBrowser = thisProject.DynPictures.Item("MyBrowserPic")
        'check if there was a problem an initializing the DynPicture Object...
        If obPicWithWebBrowser Is Nothing Then
            Debug.Print "could not initialize the picture"
        End If
    End Sub
    
    'event is fired if the picture closes
    Private Sub obPicWithWebBrowser_Close()
    
        'release the ActiveX object
        If Not m_objElem = Nothing Then
            Set m_objElem = Nothing
        End If
    End Sub
    
    'event is fired on terminating zenOn Runtime
    Private Sub Project_Inactive()
        'release the picture object
        If Not obPicWithWebBrowser = Nothing Then
            Set obPicWithWebBrowser = Nothing
        End If
    End Sub

    Auch hier wird diese Methodik anhand eines Beispiel aufgezeigt: http://www.copadata.com/forums/showthread.php?t=548

    Gruß,
    Herbert

  6. #6

    Default Re: Zugriff auf Microsoft WebBrowser

    Vielleicht kann aber auch das zenon Bild vom Typ "Html" verwendet werden, um den Reports anzuzeigen. Über VBA könnte die Bildumschaltung auf das Html Fenster angepasst werden, dass eine andere .html Seite aufgerufen wird, oder einfach mehrere Bildumschaltungsfunktionen anlegen, für jede Sprache.

  7. #7
    henrykm Gast

    Default Zum Abschluss

    Sorry, dass ich mich solange nicht mehr meldete.

    Die Problematik ließ sich mit dem Web-Browser-Controll nicht lösen. Es scheint ein bekanntes Problem zu sein. Selbst der direkte Kontakt zu Copa Data brachte nichts.

    Der Fehler tritt immer dann auf, wenn aus Zenon eine HTML-Seite oder aber eine Seite mit diesem Web-Control angestoßen wird. Die Instanzen des Controls lassen sich nicht mehr bereinigen, sobald eine Kombination aus AJAX und Java-Script auf den gepingten Seiten vorhanden ist (ich bin leider kein Webentwickler um dies besser zu erklären).

    Die Lösung lag dann ganz wo anders. Wir entwickelten ein Tool, welches statt des Microsoft - Controls die Gecko-Engine als Browser einsetzt (Firefox). Und siehe da - das Problem war beseitigt. Läuft wunderbar und keine Speicherlecks mehr.

    Ach ja: der Test mit der VB-Application war dann doch zu einfach angelegt. Der Fehler ließ sich nach der Überarbeitung des Test auch auf dieser Basis nachvollziehen.


    Gruß

    Henry

Similar Threads

  1. Replies: 0
    Last Post: 4th March 2009, 09:50
  2. Replies: 2
    Last Post: 3rd June 2008, 15:04
  3. VBA and Microsoft Access
    By bjoerndavid in forum VBA
    Replies: 2
    Last Post: 30th November 2007, 22:22

Posting Rules

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •