Gerenciamento do titular do bloqueio de documentos

A RDT (tabela de documentos em execução) mantém uma contagem de documentos abertos e todos os bloqueios de edição que eles têm. Você pode colocar um bloqueio de edição em um documento no RDT quando ele for editado programaticamente em segundo plano sem que o usuário veja um documento aberto em uma janela de documento. Essa funcionalidade geralmente é usada por designers que modificam vários arquivos por meio de uma interface gráfica do usuário.

Cenários de portadores de bloqueio de documento

O arquivo "a" tem uma dependência do arquivo "b"

Considere uma situação em que você implementa um editor padrão "A" para o tipo de arquivo "a" e cada arquivo do tipo "a" tem uma referência a (ou dependência de) um arquivo do tipo "b". Existe um editor padrão "B" para arquivos do tipo "b". Quando o editor "A" abre o arquivo "a", ele recupera a referência ao arquivo correspondente "b". O arquivo "b" não é exibido, mas o editor "A" pode modificá-lo. O editor "A" obtém uma referência aos dados do documento do arquivo "b" do método FindAndLockDocument e, além disso, mantém um bloqueio de edição no arquivo "b". Depois que o editor "A" terminar de modificar o arquivo "b", você poderá diminuir a contagem de bloqueios de edição no arquivo "b" chamando o UnlockDocument método. Você pode omitir essa etapa se tiver chamado o FindAndLockDocument método com o parâmetro dwRDTLockType definido como _VSRDTFLAGS. RDT_NoLock.

O arquivo "b" é aberto por um editor diferente

Caso o arquivo "b" já esteja aberto pelo editor "B" quando o editor "A" tentar abri-lo, há dois cenários separados a serem tratados:

  • Se o arquivo "b" estiver aberto em um editor compatível, você deverá fazer com que o editor "A" registre um bloqueio de edição de documento no arquivo "b" usando o RegisterDocumentLockHolder método. Depois que o editor "A" terminar de modificar o arquivo "b", cancele o registro do bloqueio de edição do documento usando o UnregisterDocumentLockHolder método.

  • Se o arquivo "b" estiver aberto de forma incompatível, você poderá permitir que a tentativa de abertura do arquivo "b" pelo editor "A" falhe ou você pode deixar a exibição associada ao editor "A" abrir parcialmente e exibir uma mensagem de erro apropriada. A mensagem de erro deve instruir o usuário a fechar o arquivo "b" no editor incompatível e, em seguida, reabrir o arquivo "a" usando o editor "A". Você também pode implementar o método QueryCloseRunningDocument SDK do Visual Studio para solicitar que o usuário feche o arquivo "b" aberto no editor incompatível. Se o usuário fechar o arquivo "b", a abertura do arquivo "a" no editor "A" continuará normalmente.

Considerações adicionais sobre o bloqueio de edição de documentos

Você obterá um comportamento diferente se o editor "A" for o único editor que tem um bloqueio de edição de documento no arquivo "b" do que você faria se o editor "B" também tiver um bloqueio de edição de documento no arquivo "b". No Visual Studio, o Designer de Classe é um exemplo de um designer visual que não contém um bloqueio de edição no arquivo de código associado. Ou seja, se o usuário tiver um diagrama de classe aberto no modo de exibição de design e o arquivo de código associado abrir simultaneamente, e se o usuário modificar o arquivo de código, mas não salvar as alterações, as alterações também serão perdidas no arquivo diagrama de classe (.cd). Se o Designer de Classe tiver o único bloqueio de edição de documento no arquivo de código, o usuário não será solicitado a salvar as alterações ao fechar o arquivo de código. O IDE solicita que o usuário salve as alterações somente depois que o usuário fechar o Designer de Classe. As alterações salvas são refletidas em ambos os arquivos. Se o Designer de Classe e o editor de arquivos de código mantiverem bloqueios de edição de documento no arquivo de código, o usuário será solicitado a salvar ao fechar o arquivo de código ou o formulário. Nesse ponto, as alterações salvas são refletidas no formulário e no arquivo de código. Para obter mais informações sobre diagramas de classe, consulte Trabalhar com diagramas de classe (Designer de Classe).

Observe que, se você precisar colocar um bloqueio de edição em um documento para um não editor, deverá implementar a IVsDocumentLockHolder interface.

Muitas vezes, um designer de interface do usuário que modifica arquivos de código programaticamente faz alterações em mais de um arquivo. Nesses casos, o SaveItemsViaDlg método manipula o salvamento de um ou mais documentos por meio da caixa de diálogo Deseja salvar alterações nos itens a seguir?