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:
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:
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 :-\
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..."
Sub Postopen(Source As Notesuidocument)
Call Source.Close
End Sub
Die Form die das ActiveX beinhaltet:
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.