Zuriff auf .Picture einen Commandbar Button wirft Fehler

10/03/2009 - 13:46 von Gunter Avenius | Report spam
Hallo miteinander,

VB 2005.

Ich habe eine Access Datenbank mit einer Menüleiste welche Buttons mit
selbstdefinierten Bildern enthàlt.
Ich will nun mit vb2005 die Eigenschaften der CommandBar auslesen und
in Vb2005 weiterverwenden.

Alle Eigenschaften auser .Picture kann ich auslesen.

Wie komme ich an CommandBarButton.Picture in vb2005 ran?

Fehermeldung:
System.Runtime.InteropServices.COMException wurde nicht behandelt.
ErrorCode=-2147418113
Message="Schwerwiegender Fehler (Ausnahme von HRESULT: 0x8000FFFF
(E_UNEXPECTED))"
Source="office"
StackTrace:
bei Microsoft.Office.Core._CommandBarButton.get_Picture()


Beispielcode:
For Each cbc In appAccess.Application.CommandBars("Menu").Controls
If cbc.type = MsoControlType.msoControlButton Then
Dim img As image
Dim ccb As CommandBarButton
ccb = TryCast(cbc, CommandBarButton)

With ccb
Debug.Print (.Caption & " " & ccb.FaceId)
' Funktioniert
img Microsoft.VisualBasic.Compatibility.VB6.IPictureDispToImage(.Picture)
img.Save ("c:\Bla\Blub.bmp")
End With
End If
Next



Danke & Gruß
Gunter
 

Lesen sie die antworten

#1 Elmar Boye
11/03/2009 - 11:54 | Warnen spam
Hallo Gunter,

Gunter Avenius schrieb:
Ich habe eine Access Datenbank mit einer Menüleiste welche Buttons mit
selbstdefinierten Bildern enthàlt.
Ich will nun mit vb2005 die Eigenschaften der CommandBar auslesen und
in Vb2005 weiterverwenden.

Alle Eigenschaften auser .Picture kann ich auslesen.

Wie komme ich an CommandBarButton.Picture in vb2005 ran?



Das scheint direktem Weg nicht zu funktionieren, auch ein Versuch wie in
<URL:http://msdn.microsoft.com/en-gb/library/ms268747(vs.80).aspx>
warf bei mir die gleiche Ausnahme.

Eine Erklàrung wàre, das sie Images nicht erzeugt sind -
irgendwas in der Art ist mir noch aus meinen Access Zeiten
dunkel in Erinnerung.

Aber es gibt auch CopyFace womit man den Weg übers ClipBoard
nehmen kann.
Unten mal ein Ansatz, der zumindest für Access 2003 und die
Menu Bar dort klappte.

Gruß Elmar

' Aufruf beim Test
Dim ex As New ExtractCommandBitmaps
ex.Extract("C:\TEMP\Buttons", "Menu Bar")


' ExtractCommandBitmaps Class

Imports System.Text
Imports System.IO
Imports Microsoft.Office.Core
Imports Microsoft.Office.Interop

Public Class ExtractCommandBitmaps
Dim CommandBarButtonList As New List(Of CommandBarButton)

Public Sub Extract(ByVal bitmapPath As String, ByVal commandBarName As String)
If String.IsNullOrEmpty(commandBarName) Then
Throw New ArgumentNullException("commandBarName")
End If
If String.IsNullOrEmpty(bitmapPath) Then
Throw New ArgumentNullException("bitmapPath")
End If

Dim accessApp As Access.Application = Nothing
Try
accessApp = CreateObject("Access.Application.11")

Dim cbMenuBar = accessApp.CommandBars(commandBarName)
GetButtonControls(cbMenuBar.Controls)
SaveButtonImages(bitmapPath)
Catch ex As Exception
Console.WriteLine("Exception: {0}", ex.Message)
Finally
If (accessApp IsNot Nothing) Then
accessApp.Quit()
End If
End Try
End Sub

Private Sub SaveButtonImages(ByVal bitmapPath As String)
' Extrahieren via Clipboard
Clipboard.Clear()
For Each cbButton As CommandBarButton In CommandBarButtonList
Dim buttonName As String = GetButtonName(cbButton.Caption)
Try
Console.WriteLine("Button: {0} ({1}) = {2}", cbButton.Caption, cbButton.FaceId, buttonName)
cbButton.CopyFace()
If Clipboard.ContainsImage Then
Dim buttonImage As Image = Clipboard.GetImage()
Clipboard.Clear()

buttonImage.Save(Path.Combine(bitmapPath, buttonName & ".bmp"))
End If
Catch ex As Exception
Console.WriteLine("SaveButtonImage: {0} {1}", buttonName, ex.Message)
End Try
Next
End Sub

Public Sub GetButtonControls(ByVal controls As CommandBarControls)
' Rekursiv durch alle Popups
For Each cbControl As CommandBarControl In controls
Select Case cbControl.Type
Case MsoControlType.msoControlPopup
GetButtonControls(DirectCast(cbControl, CommandBarPopup).Controls)
Case MsoControlType.msoControlButton
CommandBarButtonList.Add(DirectCast(cbControl, CommandBarButton))
Case Else
Console.WriteLine("Ausgelassen {0} ({1}", cbControl.Caption, cbControl.Type)
End Select
Next
End Sub

Public Function GetButtonName(ByVal caption As String) As String
' Bereinigen um ungültige und überflüssige Zeichen
Dim buttonName As New StringBuilder(caption)

buttonName.Replace("&"c, "").Replace(".", "")
For Each ch As Char In Path.GetInvalidFileNameChars()
buttonName = buttonName.Replace(ch, "_"c)
Next
If (buttonName.Length <> 0) Then
Return buttonName.ToString()
End If
Return "(Ohne Name)"
End Function
End Class

Ähnliche fragen