poniedziałek, 16 czerwca 2014

Blokada edycji zakładek w dokumencie MS Word

Poniższy problem został wywołany niedawno na forum StackOverflow.Com i można go opisać w następujących kilku słowach:

W jaki sposób zablokować dostęp do zakładek dokumentu jednocześnie umożliwiając edycję pozostałych elementów dokumentu?

Całkiem ciekawe rozwiązanie tego problemu opiera się na wykorzystaniu obiektów ContentControl (CC) i zdarzeń powiązanych z tym obiektami. Co ważne, rozwiązanie to dostępne jest począwszy od wersji 2007 aplikacji MS Word.

Krok 1. Każdą zakładkę w dokumencie musimy umieścić wewnątrz obiektu ContentControl. Jeżeli nie chcemy wykonywać tej operacji ręcznie wystarczy uruchomić proste makro:

1Sub Dodawanie_ContentControl_do_Zakladki()
2 
3    Dim bookM As Bookmark
4    For Each bookM In ActiveDocument.Bookmarks
5        ActiveDocument.ContentControls.add wdContentControlRichText, _
6                        bookM.Range
7    Next
8 
9End Sub

Krok 2. Zakładamy, że naszym celem jest uniemożliwienie edycji bez blokowania obiektu ContentControl. W tym celu wykorzystamy zdarzenie powiązane z tego typu obiektami i wymusimy zmianę zaznaczenia w sytuacji gdy użytkownik kliknie wewnątrz obiektu CC:

01Private Sub Document_ContentControlOnEnter(ByVal ContentControl As ContentControl)
02 
03    If ContentControl.Range.Bookmarks.Count > 0 Then
04        'Opcjonalna informacja dla użytkownika
05        MsgBox "Nie powinieneś zmieniać zawartości " & _
06                "tego obszaru i tej zakładki." & _
07                vbNewLine & "Zostaniesz przeniesiony poza obszar edycji"
08 
09        'Opcjonalne przeniesienie poza obszar CC/Zakładki
10        Dim newPos As Long
11            newPos = ContentControl.Range.End + 2
12        ActiveDocument.Range(newPos, newPos).Select
13 
14    End If
15 
16End Sub

Alternatywnie krok 1 można rozszerzyć o mechanizm blokowania edycji obiektu CC i jednocześnie zrezygnować z obsługi zdarzenia obiektów CC. W tym wypadku zamiast kroków 1 i 2 zastosujemy poniższy rozszerzony kod z kroku 1:

01Sub Add_Bookmark_CC_Protected()
02 
03    Dim bookM As Bookmark
04    Dim CC As ContentControl
05    For Each bookM In ActiveDocument.Bookmarks
06        Set CC = ActiveDocument.ContentControls.Add( _
07                               wdContentControlRichText, bookM.Range)
08 
09        'kluczowa w tym wariancie blokada dostępu do obiektu CC
10        CC.LockContents = True
11    Next
12 
13End Sub

Brak komentarzy:

Prześlij komentarz