2016-04-22 4 views
0

In VB.Net versuche ich, ein QuickTime ActiveX-Steuerelement zu einem Formular hinzuzufügen, wenn der Benutzer auf eine Schaltfläche klickt.Das dynamische Hinzufügen eines ActiveX-Steuerelements zu VB.Net-Formular tut nichts

Mein Code ist unten. Zum Testen habe ich ein Entwurfszeit-ActiveX-Steuerelement, "designed_control", das gut funktioniert, aber ich versuche, "dynamically_created_control" auf dem Formular zu platzieren.

Public Class Form1 

Private moviePath As String = "\\localhost\D$\Temp\Test.mov" 
Friend WithEvents dynamically_created_control As AxQTOControlLib.AxQTControl = Nothing 

Private Sub buttonLoadMovieIntoExisting_Click(sender As Object, e As EventArgs) Handles buttonLoadMovieIntoExisting.Click 
    ' load movie into control created in designer, works fine: 
    MessageBox.Show(moviePath) 
    With designed_control 
     .URL = moviePath 
     MessageBox.Show("URL:" + .URL) 
    End With 
End Sub 

Private Sub buttonCreateNewControl_Click(sender As Object, e As EventArgs) Handles buttonCreateNewControl.Click 
    ' create a new ActiveX control when button is clicked: 
    dynamically_created_control = New AxQTOControlLib.AxQTControl 
    CType(dynamically_created_control, System.ComponentModel.ISupportInitialize).BeginInit() 
    Me.SuspendLayout() 
    Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(Form1)) 
    With dynamically_created_control 
     .CreateControl() 
     .Enabled = True 
     .Location = New System.Drawing.Point(160, 160) 
     .Name = "new_control" 
     .OcxState = CType(resources.GetObject("designed_control.OcxState"), System.Windows.Forms.AxHost.State) 
     .Size = New System.Drawing.Size(480, 270) 
     .TabIndex = 0 
     Me.Controls.Add(Me.dynamically_created_control) 
     .Visible = True 
     .URL = moviePath 
    End With 
    CType(dynamically_created_control, System.ComponentModel.ISupportInitialize).EndInit() 
    Me.ResumeLayout(True) 
    With dynamically_created_control 
     MessageBox.Show("URL:" + vbCrLf + .URL) 
     .Movie.Play() 
    End With 
End Sub 

End Class 

Dies funktioniert nicht; Wenn ich auf "buttonCreateNewControl" klicke, wird die "URL:" -Meldung mit der korrekten URL angezeigt, die anzeigt, dass die Eigenschaften von dynamically_created_control gesetzt sind und das Objekt nicht nichts ist. Die rechteckige Form des Steuerelements, die ich erwarte, erscheint jedoch nicht auf dem Formular. Sobald ich die .Play() - Methode des Steuerelements aufruft, löst es eine Ausnahme aus, weil .Movie nichts ist, wenn es nicht sein sollte.

Kann jemand erkennen, warum das dynamisch generierte ActiveX-Steuerelement einfach nicht erscheint (aber ohne Fehler zu werfen), wenn die Designer-basierte Version absolut in Ordnung ist?

Übrigens, ich bin mir der Sicherheitsprobleme rund um QuickTime bewusst, weshalb ich jetzt versuche, etwas zu programmieren, das optional QuickTime verwenden kann, wenn der Benutzer entscheidet.

Dank

Antwort

0

Ich glaube, Sie buttonCreateNewControl_Click aktualisieren müssen

.OcxState = CType(resources.GetObject("dynamically_created_control.OcxState"), System.Windows.Forms.AxHost.State) 

hoffe, das hilft zu verwenden.

+0

Leider hat diese Änderung keinen Einfluss auf das Ergebnis. Die Informationen zur Verwendung von ocxState von einem anderen Steuerelement finden Sie hier: http://www.softtelvdm.com/Support/NETDynamicallyCreatedControls/tabid/150/. Die Tatsache, dass Ihre vorgeschlagene Änderung keinen Unterschied macht, lässt mich denken, dass diese Codezeile, die OcxState festlegt, immer noch das Problem ist, aber ich weiß nicht, wie ich einen neuen OcxState richtig einstellen soll. –

0

Ich habe den Fehler in meinem Code entdeckt.

Die .createControl() -Methode hat versucht, ein externes QuickTime-Fenster zu erstellen. Das Steuerelement funktioniert für so etwas wie VLC Player, aber QuickTime unterstützt es nicht, so dass nichts passierte.

Sobald ich createControl() auskommentierte, wurde das Verhalten, was ich erwartet hatte.

Die .createControl() war ein Rest von Code, den ich online fand, ich nahm an, dass es für das Initiieren des ActiveX-Steuerelements wesentlich war, aber es ist nicht.