Autor Thema: ActiveX-Control initialisieren  (Gelesen 3228 mal)

Offline sudsaat

  • Junior Mitglied
  • **
  • Beiträge: 78
ActiveX-Control initialisieren
« am: 16.02.11 - 17:42:46 »
Hallo zusammen,

ich habe einen komischen Effekt beim Laden von ActiveX-Controls festgestellt. Ich habe ein Object in einer Form hinterlegt versuche in der "Postopen" der Form das Objekt zu initialisieren.

Set myObject = Source.GetObject("MyObject")

und anschließend das Objekt zu verwenden:

MyObject.LoadMultiPageFromFile( fileToload, page)

Wenn ich nun ein Dokument öffne, erhalte ich keinen Fehler, allerdings habe ich anschließend auf den Inhalt des ActiveX-Objecktes keinen Zugriff und es wird nichts angezeigt. Schreibe ich eine Msgbox "blabla" vor den Aufruf "LoadMultiPageFromFile", ist alles wunderbar.

also kurzum:
Code
Sub Postopen(Source As Notesuidocument)
        Dim myObject as Variant
	
        testFile = "C:\test.tif"
	
        Set myObject = Source.GetObject("MyObject")
        MyObject.LoadMultiPageFromFile( testFile, page)

        MsgBox MyObject.FileHeight
End Sub

funktioniert nicht, und er Zugriff auf das Objekt mit "FileHeight" liefert 0 und die Datei nicht nicht angezeigt, ist aber geladen! (wenn ich das file zoome, erscheint es plötzlich)

Wobei:

Code
Sub Postopen(Source As Notesuidocument)
        Dim myObject as Variant
	
        testFile = "C:\test.tif"
	
        Set myObject = Source.GetObject("MyObject")

    MsgBox "hello activeX"

        MyObject.LoadMultiPageFromFile( testFile, page)

        MsgBox MyObject.FileHeight
End Sub

funktioniert, die korrekte FileHeight ausgibt und die Datei auch anschließend direkt anzeigt.

Irgendwie scheint die MsgBox das Frontend des Notes-Client zu beeinflussen und der Ladevorgang des Controls scheint anschließend fortgeschrittener zu sein?!?

Zuerst dachte ich an ein zeitliches Problem, aber ein "Sleep X" anstatt einer MsgBox erzeugt nicht das gleiche Ergebnis sondern führt ebenfalls zu einem leeren Control.

Weiß jemand Rat? Ist das ein generelles Problem von Notes? Meine Version ist der englische FullClient 8.5.2.

Vielen Dank im Voraus
Grüße Thomas :-)

Nachtrag: Im Debug-Mode geht es ebenfalls ohne MsgBox?!? Habe ein Beitrag im Forum mit ähnlichem Fehler gefunden, aber die Lösung war ein Wechsel der ActiveX Komponenten. Das wäre unschön, da der Kunde bereits die Lizenz erworben hat. Während der Entwicklung und der Tests ist es uns nicht aufgefallen, da die Demoversion immer eine MsgBox anzeigt - ganz schön doof  :-\
« Letzte Änderung: 16.02.11 - 19:00:37 von sudsaat »

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: ActiveX-Control initialisieren
« Antwort #1 am: 16.02.11 - 19:31:50 »
Sowas scheint gerne mal zu passieren, habe einen ähnlichen Effekt an ganz anderen Stellen auch schon gehabt.

Aktuell existiert bei uns eine Anwendung, bei der in einer bestimmten Aktion sinngemäß die Msgbox erscheint:

"Diese Meldung erscheint, bis mir etwas besseres einfällt"

In dem Fall funktionierte es bis Notes 7, seit 8.5 nicht mehr. Kann mich aber auch an eine ähnliche Box unter Notes 5 erinnern, wobei wir dort einen eleganteren Text verwendeten (war schließlich für Kunden).

Falls Du eine weniger auffällige Lösung findest, wäre ich sehr daran interessiert.

Offline sudsaat

  • Junior Mitglied
  • **
  • Beiträge: 78
Re: ActiveX-Control initialisieren
« Antwort #2 am: 16.02.11 - 22:00:09 »
Hallo Peter,

nachdem ich noch 3 weitere Viewer entwickelt habe, die alle ActiveX-basiert sind und festgestellt habe, dass alle das gleiche Problem haben, musste ich umdenken :-)

Das Problem scheint im Event-raising des Notes Clients zu liegen - die Postopen ist halt doch nicht "post" und wird zu früh geworden, und zwar vor dem Zeichnen des Dokumentes. Bei einem Viewer hat es genügt, mit "Print" eine Ausgabe zu erzwingen, bei den anderen leider nicht.

Nach ein wenig grübeln bin ich auf eine gar nicht so unschöne Lösung gekommen. Ich habe eine Form mit einer Layout-Region und einem Text (z.b. loading...) geschrieben und diese in der Postopen des eigentlichen Dokumentes als DialogBox angezeigt. In der Form der DialogBox mache ich in der "Postopen" ein Source.Close (der Dialog schließt sich also nach dem Laden selbst). Dies scheint den gleichen Effekt im Client zu verursachen wie eine Messagebox, allerdings mit dem Vorteil, dass der User nicht aktiv in den Prozess eingreifen muss (durch drücken von "OK" oder ähnlichem. Das Ergebnis ist ganz OK, ich spiele heute abend noch ein wenig mit der Dialogbox, aber so funktioniert es zumindest schonmal.

Kurz der Code:

Form "(Fix_ActiveX)" mit lediglich einer Layout-Region mit dem Text "loading..."
Code
Sub Postopen(Source As Notesuidocument)
	Call Source.Close
End Sub

Die Form die das ActiveX beinhaltet:
Code
Sub Postopen(Source As Notesuidocument)
	Dim ws As New NotesUIWorkspace
	Dim doc As NotesDocument
	Dim MyObject as Variant
	
	Set doc   = Source.Document
	Set MyObject = Source.GetObject("MyObject")
		
	fileToOpen = "C:\test.tif"
		
	Call ws.Dialogbox("(Fix_ActiveX)", True, True, False, False, False, False, "", doc, True, False, True)
	
	Call MyObject.LoadMultiPageFromFile( fileToOpen, page)
End Sub

Die Paramater der DialogBox können sicher noch anders verwendet werden, aber so hat es auf anhieb funktioniert :-)

Beim Öffnen des Dokumentes erscheint kurz die DialogBox mit "loading" und verschwindet gleich wieder und das ActiveX wird korrekt dargestellt.

Hoffe das hilft dir auch weiter, bin gespannt auf dein Feedback.

Grüße Thomas :-)

PS: Falls ich noch wichtige Aspekte feststellen sollte, werde ich hier weiter posten.
« Letzte Änderung: 16.02.11 - 22:50:06 von sudsaat »

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: ActiveX-Control initialisieren
« Antwort #3 am: 16.02.11 - 22:26:35 »
Siehe auch hier: http://atnotes.de/index.php/topic,50958.0.html (ein Post von gestern!).

Bernhard

Offline sudsaat

  • Junior Mitglied
  • **
  • Beiträge: 78
Re: ActiveX-Control initialisieren
« Antwort #4 am: 16.02.11 - 22:35:08 »
Hi Bernhard,

danke! Das bestätigt meine Vermutung mit dem Postopen - interessant dabei ist, dass es an der Client-Version liegt (d.h. das Problem ist hoffentlich nur temporär und wird von IBM behoben).

Grüße Thomas :-)

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: ActiveX-Control initialisieren
« Antwort #5 am: 17.02.11 - 08:05:10 »
Hallo Thomas,

vielen Dank für die Idee, habe das gleich mal umgesetzt.

Am Postopen allein wird es nicht liegen, vielmehr glaube ich, dass versucht wird, immer mehr Prozesse parallel laufen zu lassen, und wenn sich dann Ereignisse gegenseitig überholen, knallt es halt. Mein Optimismus bzgl. einer "Reparatur" durch IBM hält sich daher stark in Grenzen. Um so besser, wenn man dann eine bessere Möglichkeit als Msgbox hat, den "Zug" anzuhalten.

In meinem konkreten Fall ist es ein Script, das zum Versenden von Dokumenten, die aus mehreren Teilmasken und etlichen Feldern bestehen, das Dokument über die Zwischenablage in ein Richtextfeld eines temporären Dokuments kopiert, das speichert und in die zu versendende Mail sowie in ein zu speicherndes Dokument einer anderen Datenbank kopiert. Das Verfahren funktionierte problemlos seit 2005. Seit Version 8.5 kam es nun gelegentlich vor, dass der Prozess mit einem weißen Schirm endete. Wiederholbar war das bei Dokumenten mit Dateianhängen. Vermutlich wurde das temporäre Dokument geöffnet und die Zwischenablage eingefügt, bevor der Inhalt des zu versendenden Dokuments in die Zwischenablage kopiert wurde. Dabei handelt es sich um ein durchgängiges Script (alles markieren, in Zwischenablage kopieren, Tempdoc öffnen, Zwischenablage einfügen).

Lösung bisher war die Msgbox vor dem Einfügen der Zwischenablage (auch ich experimentierte erfolglos mit Sleep). Nun verwende ich Deine Idee und warte auf die Rückmeldung der Anwender, bin gespannt und werde mich (zumindest im negativen Fall) dazu nochmal äußern.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz