2013-02-13 150 views
0

我曾希望在MS Access 2010數據庫中製作一個簡單的表單,用戶可以在其中選擇要使用的主題。你如何通過vba更改數據庫的主題? Google對這個問題沒有太大的幫助。MS Access 2010通過VBA更改主題

+0

我不知道如何做到這一點。解決方法是使用一些全局變量來存儲背景顏色,前面的顏色等。通過表單選擇「主題」來設置這些變量。然後,在每個表單的onload事件上,將這些屬性(背景顏色,前景等)設置爲這些值。你可以有一個這樣做的子。此外,如果有必要,遍歷表單的控件並設置它們('對於form.controls中的每個控件'),我不確定是否有一個簡單的方法來設置主題,但如果你想投入關於小時,你可以編碼你自己的。 – Scotch 2013-02-13 23:56:48

+0

我不確定這是否值得。我剛剛從Access 2003轉換到2010,並且正在對數據庫進行大修,所以我決定更新視覺效果。我認爲,雖然我在這裏,但我不妨利用自2010年以來的主題,但顯然它並不像應該那麼容易。哦,謝謝。 – NinjaMeTimbers 2013-02-14 15:48:36

回答

1

我知道這個問題前一段時間被問到,但由於我在研究設置主題時遇到了它,我以爲我應該嘗試提供一些我發現的內容。

當談到讓用戶選擇主題時,我認爲最簡單的方法就是將「顏色」按鈕放入功能區。如果您碰巧製作了自己的自定義功能區,則可以使用<control idMso="ThemeColorsGallery" />來引用「顏色」選項。

如果你想嘗試對發生的事情有更精確的控制,我想我可能已經找到了一個選擇,但是它有點牽扯,我還沒有弄清楚細節。不過,我想發佈它,因爲我認爲有人可能想要使用它。

在控制圖像庫功能時,我意識到隱藏的「MSysResources」表中有一個「Office主題」條目。我相信「MySysResources」表中的「Office主題」行中的任何內容都決定了程序啓動時加載的主題。我測試這個想法的方式是我選擇了一個主題,然後到桌面並將附件保存到桌面。然後,我去了,選擇了一個不同的主題,並通過查看我的一些表格來確保它已經到位。然後,我回到桌子上,刪除「Office Theme」行中的內容,並將保存的文件上傳回附件。關閉並重新打開程序後,我保存到桌面上,然後重新加載到當前主題頂部的主題是正在使用的主題。

我想這可能會被使用的方式是,您可以通過代碼分配該附件。特別是,如果您想根據特定於您的程序的配置選項覆蓋默認設置,那麼看起來好像它可能很有用。

更新15年8月18日: 有人要求瞭解我是如何能夠通過VBA來設置我的主題額外的細節,所以我會在這裏爲他們提供。基本理論是我將MSysResources附件字段中的數據保存到表中。然後,如果我需要用保存的主題覆蓋當前主題,則從我的表中提取它並將其保存在適當的MSysResources記錄中。請注意,我使用MySQL作爲我的表格存儲平臺,並使用名爲「Lgo」的MediumBlob字段來存儲數據。

以下是我使用的兩個功能。第一個函數將主題保存到我的MySQL表中。第二個函數提取保存的數據並將其保存在MSysResourcestable中當前主題的頂部。請注意,要查看第二個功能的效果,您必須在運行該功能後關閉並重新打開您的程序。

Function SveThm()'Save Theme 
    Dim MSR As Recordset, Atc As Recordset, LR As Recordset 
    Set MSR = CurrentDb.OpenRecordset("SELECT * FROM MSysResources WHERE [Name]='Office Theme'", dbOpenDynaset) 
    If MSR.RecordCount > 0 Then 
     Set Atc = MSR!Data.Value 
     Set LR = CurrentDb.OpenRecordset("SELECT * FROM tbllgo;", dbOpenDynaset) 
     If LR.RecordCount = 0 Then LR.AddNew Else LR.Edit 
     LR!Stn = LgoStn 
     LR!Lgo = CStr(Atc!FileData) 
     LR!Typ = Typ 
     LR.Update 
     LR.Close 
     MsgBox "Your theme has been saved." 
    End If 
End Function 

Function SetMSys()'Set MSysResources 
    Dim MSys As Recordset, Lgo As Recordset, Atc As Recordset 
    Set MSys = CurrentDb.OpenRecordset("SELECT * FROM MSysResources WHERE [Name]='Office Theme'", dbOpenDynaset) 
    If MSys.RecordCount > 0 Then 
     MSys.Edit 
     Set Atc = MSys!Data.Value 
     Atc.Edit 
     Set Lgo = CurrentDb.OpenRecordset("SELECT Lgo FROM tbllgo;", dbOpenDynaset) 
     If Lgo.RecordCount > 0 Then Atc!FileData = Lgo!Lgo 
     Lgo.Close 
     Atc.Update 
     MSys.Update 
    End If 
End Function 
+0

我已經成功地爲我的系統實現了這一點。如果有人對我如何做的細節感興趣,請告訴我。 – 2015-07-17 23:01:23