Share via


Administración del titular del bloqueo del documento

La tabla de documentos en ejecución (RDT) mantiene un recuento de documentos abiertos y los bloqueos de edición que tienen. Puede colocar un bloqueo de edición en un documento en el RDT cuando se edita mediante programación en segundo plano sin que el usuario vea un documento abierto en una ventana del documento. A menudo, esta funcionalidad la usan los diseñadores que modifican varios archivos a través de una interfaz gráfica de usuario.

Escenarios de soporte de bloqueo de documentos

El archivo "a" depende del archivo "b"

Considere una situación en la que implemente un editor estándar "A" para el tipo de archivo "a" y cada archivo de tipo "a" tiene una referencia a (o dependencia de) un archivo de tipo "b". Existe un editor estándar "B" para los archivos de tipo "b". Cuando el editor "A" abre el archivo "a", recupera la referencia al archivo correspondiente "b". El archivo "b" no se muestra, pero el editor "A" puede modificarlo. El editor "A" obtiene una referencia a los datos del documento del archivo "b" del FindAndLockDocument método y también mantiene un bloqueo de edición en el archivo "b". Después de que el editor "A" haya terminado de modificar el archivo "b", puede disminuir el recuento de bloqueos de edición en el archivo "b" llamando al UnlockDocument método . Puede omitir este paso si ha llamado al FindAndLockDocument método con el parámetro dwRDTLockType establecido en _VSRDTFLAGS. RDT_NoLock.

Un editor diferente abre el archivo "b"

En caso de que el editor "B" ya abra el archivo "B" cuando el editor "A" intenta abrirlo, hay dos escenarios independientes para controlar:

  • Si el archivo "b" está abierto en un editor compatible, debe tener el editor "A" registrar un bloqueo de edición de documento en el archivo "b" mediante el RegisterDocumentLockHolder método . Una vez que el editor "A" haya terminado de modificar el archivo "b", desconscriba el bloqueo de edición del documento mediante el UnregisterDocumentLockHolder método .

  • Si el archivo "b" está abierto de forma incompatible, puede permitir que se produzca un error al intentar abrir el archivo "b" por el editor "A", o bien puede permitir que la vista asociada con el editor "A" abra parcialmente y muestre un mensaje de error adecuado. El mensaje de error debe indicar al usuario que cierre el archivo "b" en el editor incompatible y, a continuación, vuelva a abrir el archivo "a" mediante el editor "A". También puede implementar el método QueryCloseRunningDocument sdk de Visual Studio para pedir al usuario que cierre el archivo "b" que está abierto en el editor incompatible. Si el usuario cierra el archivo "b", la apertura del archivo "a" en el editor "A" continúa normalmente.

Consideraciones adicionales sobre el bloqueo de edición de documentos

Obtiene un comportamiento diferente si el editor "A" es el único editor que tiene un bloqueo de edición de documentos en el archivo "b" que si el editor "B" también contiene un bloqueo de edición de documentos en el archivo "b". En Visual Studio, el Diseñador de clases es un ejemplo de un diseñador visual que no contiene un bloqueo de edición en el archivo de código asociado. Es decir, si el usuario tiene abierto un diagrama de clases en la vista de diseño y el archivo de código asociado se abre simultáneamente, y si el usuario modifica el archivo de código, pero no guarda los cambios, los cambios también se pierden en el archivo de diagrama de clases (.cd). Si el Diseñador de clases tiene el único bloqueo de edición del documento en el archivo de código, no se le pedirá al usuario que guarde los cambios al cerrar el archivo de código. El IDE pide al usuario que guarde los cambios solo después de que el usuario cierre el Diseñador de clases. Los cambios guardados se reflejan en ambos archivos. Si el Diseñador de clases y el editor de archivos de código mantienen bloqueos de edición de documentos en el archivo de código, se le pedirá al usuario que guarde al cerrar el archivo de código o el formulario. En ese momento, los cambios guardados se reflejan tanto en el formulario como en el archivo de código. Para obtener más información sobre los diagramas de clases, vea Trabajar con diagramas de clases (Diseñador de clases).

Tenga en cuenta que si necesita colocar un bloqueo de edición en un documento para un no editor, debe implementar la IVsDocumentLockHolder interfaz .

Muchas veces un diseñador de interfaz de usuario que modifica los archivos de código mediante programación realiza cambios en más de un archivo. En tales casos, el SaveItemsViaDlg método controla el guardado de uno o varios documentos mediante el cuadro de diálogo ¿Desea guardar los cambios en los siguientes elementos?