All Forums
 Категория Visio
 Форум Вопросы и ответы
 Новый документ
Author Previous Topic Topic Next Topic  

mers

Russia
159 Posts

Posted - 09/20/2005 :  14:33:22
Здравствуйте.
Проблема в следующем.
Есть приложение использующее DrawingControl. На DrawingControle изображена какая то схема. Нужно сделать кнопку "Новый документ".
Я делал это следующим образом: выделял все объекты, удалял их, и менял параметры страницы на параметры по умолчанию. Это все отлично работает, пока элементов на странице немного.. Но как только элементов переваливает за сотню-полторы (очевидно это количество меняется в зависимости от мощности компьютера) эта функция просто жутко тормозит, селекция всех присутсвующих объектов происходит невероятно долго. Как избавиться от этого? Может быть есть какой-то другой способ?

Еще один интересный момент. При открытии пустого документа все происходит очень быстро. Т.е. если есть документ с большим количеством шейпов и мы открываем пустой документ, то получаем туже самую функцию работающую в десятки раз быстрее... Но это как то криво...

Voland

91 Posts

Posted - 09/20/2005 :  14:40:07
А каким образом ты провизводишь выделение?
Я вот, делаю так:
---
vsoSelection := MyVisioApp.ActiveWindow.Selection;
vsoSelection.SelectAll;
Shape_Res:=vsoSelection.Group;
Shape_Res.Delete;
---
На странице 984 шейпа, комп Athlon 700 - удаляет на раз - два!


___ Кто ищет тот найдет __
Go to Top of Page

mers

Russia
159 Posts

Posted - 09/20/2005 :  15:16:55
выделение делаю именно так...

хм.. да, с парой сотен я дал маху..
но проверил на странице с 5763 объектами... именно такая ситуация, как я описывал
Go to Top of Page

Voland

91 Posts

Posted - 09/21/2005 :  13:57:57
Ясно, вполне возможно...
Тогда попробуйте так:

var MyPage:IVPage;
begin
MyPage:=DrawingControl1.Window.Page;
MyPage.Delete(0);
end;

Если конечно вам это подойдет, после удаления страници, компонент сразу же создаст новую, и нужно будет выставить ее параметры так, как вам нужно....

___ Кто ищет тот найдет __
Go to Top of Page

mers

Russia
159 Posts

Posted - 09/21/2005 :  16:53:18
нет к сожалению это мне не подойдет, более того я нашел диалог из которого следует что он вообще не предпочтителен.
quote:
1. Anne Nonyme
Hi
I try to clear the contents of Visio ActiveX Control, same as doing a "New Document". How to do that, "Document.Close" do no work with control.
Thanks
Anne

2. Chris Roth [ Visio MVP ]
Found this in my tech-stash:
Using Blank Documents in the Control
To load a blank drawing in the control when the control is initialized for the first time, set the Src property to an empty string. However, if you want to emulate creating a new blank drawing in the control after loading an existing drawing document, you have three choices:
- Select all and delete all shapes in the drawings. This approach allows the developer to preserve any existing styles in the currently loaded document.
- Load a new, blank document using the Src property.
- Dynamically destroy and reinitialize the Visio drawing
control in the document.

3. Anne Nonyme
I do :
foreach ( Page l_Page in m_VisioCtrl.Document.Pages )
{
l_Page.Delete (0);
}
And it works. Thanks
Regards
Anne

4. Mark Nelson [MS]
One of the three methods mentioned by Chris is preferred. I do not recommend deleting the last page in a document to make it blank. This can cause unpredictable results.

--
Mark Nelson
Microsoft Corporation

This posting is provided "AS IS" with no warranties, and confers no rights.

5. Mai-lan [MS]
The preferred method is to load a blank document. This means using the SCR property to load a blank document that you have explicitly created and put on your file system.

Selecting and deleting shapes may leave layers and other legacy items in the document. Dynamically destroying and intializing the control seems like overkill.

Thanks,
Mai-lan
Microsoft Corp.



я пользовался способом загрузки пустой страницы.. если программа не находит нужного файла, тогда выделяет и удаляет все объекты.

Edited by - mers on 09/21/2005 16:55:17
Go to Top of Page

Voland

91 Posts

Posted - 09/22/2005 :  13:13:41
Хм... не пробовал именно так.
А работает быстрее чем самому выделять и удалять объекты?

___ Кто ищет тот найдет __
Go to Top of Page

Voland

91 Posts

Posted - 09/22/2005 :  16:05:39
Да,по поводу диалога найденого вами, полностью теперь соглашаюсь что не подходит...
А по описанному вам способу

mers Posted - 09/20/2005 : 14:33:22
-----------------------------------------------------
я пользовался способом загрузки пустой страницы.. если программа не находит нужного файла, тогда выделяет и удаляет все объекты.
-----------------------------------------------------

Я сделал так:

MyVisioApp.Documents.Add('');

К сожалению ни чего не происходит... :(
Может я что то делаю не так? Или я вас не верно понял...


___ Кто ищет тот найдет __
Go to Top of Page

mers

Russia
159 Posts

Posted - 09/23/2005 :  13:19:25
нет.. я именно открываю пустой файл - DrawingControl.Src = "полный путь файла".. у меня в определенном месте есть файл "~default" (при инсталяции моей программы я засовываю его в системную папку), этот файл - есть обычный файл визио с пустой страницей, который я переименовал (сделал без расширения)..

кривовато конечно.. зато очень быстро...

хотя я может тоже не так что-то понял :)

Edited by - mers on 09/23/2005 13:21:37
Go to Top of Page

Voland

91 Posts

Posted - 09/23/2005 :  14:01:18
А.., теперь понятно. Ум.. попробую у себя так сделать.
Но конечно порпзбираюсь еще, может есть что-нибуть более официальное :)

___ Кто ищет тот найдет __
Go to Top of Page

W.U.N.Un

Ukraine
3 Posts

Posted - 01/15/2007 :  17:13:40
Пост старый, но тем не менее. Идея не моя.

private void НовыйДокументToolStripMenuItem_Click(object sender, EventArgs e)
        {
            const int visualFeedbackOn = 1;
            const int visualFeedbackOff = 0;

            Microsoft.Office.Interop.Visio.Application visioApplication;

            // Only one document can be open.
            visioApplication = (Microsoft.Office.Interop.Visio.Application)axDrawingControl1.Window.Application;
            axDrawingControl1.Src = "";

            // Get the current state of the visual feedback. If visual
            // feedback is on the end user will see changes in the drawing
            // window as the code operates on the shapes.
            int visualFeedbackStatus = visioApplication.ScreenUpdating;

            // Don't let the user see the visual feedback while the shapes
            // are deleted.
            if (visualFeedbackStatus == visualFeedbackOn)
            {
                visioApplication.ScreenUpdating = visualFeedbackOff;
            }

            // Delete all of the shapes from the Visio window.
            // Note: when invoking Selection.Delete(), the EventSink class will raise
            // an event and call onRemoveProductInformation for each shape deleted
            // from the page. That will update the product data and grid control.
            Window targetWindow;
            targetWindow = (Window)axDrawingControl1.Window;
            if (targetWindow.PageAsObj.Shapes.Count > 0)
            {
                targetWindow.SelectAll();
                targetWindow.Selection.Delete();
            }

            // Set the document saved flag since the drawing control is now
            // displaying a blank document.
            axDrawingControl1.Document.Saved = true;

            // Restore the screen updating status.
            if (visualFeedbackStatus == visualFeedbackOn)
            {
                visioApplication.ScreenUpdating = visualFeedbackOn;
            }
        }
    }
Go to Top of Page

mers

Russia
159 Posts

Posted - 01/19/2007 :  15:00:51
Здравствуйте.
Если я не ошибаюсь, вы взяли это откуда-то из мсдн.
targetWindow.Selection.Delete();
Вот из-за этой строчки все будет тормозить.
Естественно рассматриваем случай когда шейпов много (больше 3000 например). Способ загрузки пустой страницы самый быстрый.
Go to Top of Page
  Previous Topic Topic Next Topic  
Данный сайт является архивом форума visio.artberg.ru, который был закрыт в связи с переходом на новую платформу visio.getbb.ru
Все материалы доступны только для чтения! Если у вас появились вопросы, или вы хотите что-то обсудить, связанное с Visio, обращайтесь на новый форум!
Архив был создан благодаря совместным усилиям Генадия Туманова @Tumanov (visio.artberg.ru), Александра ака @Surrogate (visio.getbb.ru), и Николая Белых @nbelyh (unmanagedvisio.com)