Author |
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 - удаляет на раз - два!
___ Кто ищет тот найдет __ |
|
|
mers
Russia
159 Posts |
Posted - 09/20/2005 : 15:16:55
|
выделение делаю именно так...
хм.. да, с парой сотен я дал маху.. но проверил на странице с 5763 объектами... именно такая ситуация, как я описывал |
|
|
Voland
91 Posts |
Posted - 09/21/2005 : 13:57:57
|
Ясно, вполне возможно... Тогда попробуйте так:
var MyPage:IVPage; begin MyPage:=DrawingControl1.Window.Page; MyPage.Delete(0); end;
Если конечно вам это подойдет, после удаления страници, компонент сразу же создаст новую, и нужно будет выставить ее параметры так, как вам нужно....
___ Кто ищет тот найдет __ |
|
|
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 |
|
|
Voland
91 Posts |
Posted - 09/22/2005 : 13:13:41
|
Хм... не пробовал именно так. А работает быстрее чем самому выделять и удалять объекты?
___ Кто ищет тот найдет __ |
|
|
Voland
91 Posts |
Posted - 09/22/2005 : 16:05:39
|
Да,по поводу диалога найденого вами, полностью теперь соглашаюсь что не подходит... А по описанному вам способу
mers Posted - 09/20/2005 : 14:33:22 ----------------------------------------------------- я пользовался способом загрузки пустой страницы.. если программа не находит нужного файла, тогда выделяет и удаляет все объекты. -----------------------------------------------------
Я сделал так:
MyVisioApp.Documents.Add('');
К сожалению ни чего не происходит... :( Может я что то делаю не так? Или я вас не верно понял...
___ Кто ищет тот найдет __ |
|
|
mers
Russia
159 Posts |
Posted - 09/23/2005 : 13:19:25
|
нет.. я именно открываю пустой файл - DrawingControl.Src = "полный путь файла".. у меня в определенном месте есть файл "~default" (при инсталяции моей программы я засовываю его в системную папку), этот файл - есть обычный файл визио с пустой страницей, который я переименовал (сделал без расширения)..
кривовато конечно.. зато очень быстро...
хотя я может тоже не так что-то понял :) |
Edited by - mers on 09/23/2005 13:21:37 |
|
|
Voland
91 Posts |
Posted - 09/23/2005 : 14:01:18
|
А.., теперь понятно. Ум.. попробую у себя так сделать. Но конечно порпзбираюсь еще, может есть что-нибуть более официальное :)
___ Кто ищет тот найдет __ |
|
|
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;
}
}
} |
|
|
mers
Russia
159 Posts |
Posted - 01/19/2007 : 15:00:51
|
Здравствуйте. Если я не ошибаюсь, вы взяли это откуда-то из мсдн.
targetWindow.Selection.Delete();
Вот из-за этой строчки все будет тормозить. Естественно рассматриваем случай когда шейпов много (больше 3000 например). Способ загрузки пустой страницы самый быстрый. |
|
|
|
Topic |
|