Compartilhar via


Gerenciamento de porta-fechadura de documentos

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

Cenários de suporte 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 (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 FindAndLockDocument método e também mantém um bloqueio de edição no arquivo "b". Depois que o editor "A" é feito modificando o arquivo "b" você pode diminuir a contagem de bloqueio de edição no arquivo "b" chamando o UnlockDocument método. Você pode omitir essa etapa se tiver chamado o método com o FindAndLockDocument 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" tenta abri-lo, há dois cenários separados para manipular:

  • Se o arquivo "b" estiver aberto em um editor compatível, você deve ter o editor "A" registrar 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ê pode permitir que a tentativa de abertura do arquivo "b" pelo editor "A" falhe, ou você pode deixar a exibição associada ao editor "A" parcialmente aberta 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" que está 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 bloqueio de edição de documentos

Você terá 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 se o editor "B" também mantiver um bloqueio de edição de documento no arquivo "b". No Visual Studio, o Class Designer é um exemplo de um designer visual que não manté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 design e o arquivo de código associado aberto 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 para o arquivo de 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 arquivo 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, você deve 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 método manipula o SaveItemsViaDlg salvamento de um ou mais documentos por meio da caixa de diálogo Deseja salvar alterações nos seguintes itens? .