Corel Draw: как сохранить копию текущего листа

Corel Draw: как сохранить копию текущего листа

Corel Draw: как сохранить копию текущего листа
Corel Draw: как сохранить копию текущего листа
18/6/2024
Иногда, необходимо сделать копию текущего документа и продолжить работу с ним. В программе Corel Draw есть метод у документа Document.SaveAsCopy, но, увы, он некорректно работает. Причем уже много лет и проблема не исправлена до сих пор.
Рассмотрим, как работает этот метод.
Sub my_SaveAsCopy()
Dim OptSave As New StructSaveAsOptions

OptSave.Range = cdrSelection

ActiveDocument.SaveAsCopy "D:\copy_file.cdr", OptSave
End Sub
Если в качестве параметра Range указан cdrSelection (выделение), то все происходит нормально. Сохраняется копия файла, которая не открывается и вы продолжаете работать в исходном файле. Все хорошо, но нужно выделять всё, что необходимо сохранить. Неудобно.
Sub my_SaveAsCopy()
Dim OptSave As New StructSaveAsOptions

OptSave.Range = cdrAllPages

ActiveDocument.SaveAsCopy "D:\copy_file.cdr", OptSave
End Sub
Если в качестве параметра Range указан cdrAllPages (все страницы), то результат будет идентичен пункту меню Save As (сохранить как). Текущий документ сохранится с новым именем и он будет текущим открытым. Это совсем не то, чего хотелось.
Есть еще одно значение данного параметра cdrCurrentPage (текущая страница).
Sub my_SaveAsCopy()
Dim OptSave As New StructSaveAsOptions

OptSave.Range = cdrCurrentPage

ActiveDocument.SaveAsCopy "D:\copy_file.cdr", OptSave
End Sub
Но результат выдает ошибку и... длится это уже много лет.
В сообществе Корела недавно вспомнили эту проблему и решили поделиться, кто как решает её. Одно из решений следующее (учитывайте, что это все делается через одно место):
1. Создаем новый документ
2. Копируем всё с текущего листа в новый документ
3. Сохраняем новый документ с другим именем
4. Закрываем новый документ
Sub my_SaveCurrentPageAsCopy()
Dim cdrDoc As Document
Dim tempDoc As Document
Dim page As Page
Dim filePath As String

' Определяем путь для записи копии текущей страницы
filePath = "D:\current_page_copy.cdr"

' Проверяем, что есть текущий документ открытый
If Application.ActiveDocument Is Nothing Then
MsgBox "Нет открытого документа", vbCritical
Exit Sub
End If

' Ссылаемся на активный документ и на текущую активную страницу
Set cdrDoc = Application.ActiveDocument
Set page = cdrDoc.ActivePage

' Создаем новый документ
Set tempDoc = Application.CreateDocument

' Копируем все объекты с текущей страницы активного документа
page.Shapes.All.Copy

' Вставляем скопированные объекты в новый документ
tempDoc.ActiveLayer.Paste

' Сохраняем новый документ и закрывем его
tempDoc.SaveAs filePath
tempDoc.Close

' Выводим сообщение об успешном сохранении копии
MsgBox "Текущая страница сохранена, как " & filePath, vbInformation
End Sub
Вот с такими «костылями» сохраняем копию нашей текущей страницы 🤪.
Комментарии: