Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2009, 17:45   #1
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию Чем больше объектов - тем меньше скорость?

Создаю документ. Делаю его невидимым. В цикле вставляю изображения.
Код:
Word::InlineShapePtr inlineImage = GetRange()->GetInlineShapes()->AddPicture(imagePath.GetString());
Word::ShapePtr shapePtr = inlineImage->ConvertToShape();
Word::WrapFormatPtr wrapFormat = shapePtr->GetWrapFormat();

if (topMost)
	wrapFormat->PutType(Word::wdWrapFront);
else
	wrapFormat->PutType(Word::wdWrapBehind);

float shapeWidth = shapePtr->Width;
float shapeHeight = shapePtr->Height;

float wScale = pdfCentimeterWidth / PointsToCentimeters(shapeWidth);
float hScale = pdfCentimeterHeight / PointsToCentimeters(shapeHeight);

if (wScale * shapeWidth >= 1.f)
	shapePtr->ScaleWidth(wScale, Office::msoFalse, Office::msoScaleFromTopLeft);
if (hScale * shapeHeight >= 1.f)
	shapePtr->ScaleHeight(hScale, Office::msoFalse, Office::msoScaleFromTopLeft);

if (reflected)
	shapePtr->Flip(Office::msoFlipVertical);
		
if (rotate != 0)
	shapePtr->PutRotation(rotate);

shapePtr->PutRelativeHorizontalPosition(Word::wdRelativeHorizontalPositionPage);
shapePtr->PutRelativeVerticalPosition(Word::wdRelativeVerticalPositionPage);

shapePtr->PutLeft(CentimetersToPoints(xPos));
shapePtr->PutTop(CentimetersToPoints(yPos));
хочу вставить много изображений. Первые 2 изображения относительно большие, остальные - с высотой в 1 пиксель. Со временем скорость вставки сильно падает. В прикреплении 2 лог файла. Один получен при вставки изображений со скрытым документом, второй с видимым. Если не отображать документ скорость больше. Но в обоих случаях заметна разница в начале и в конце. (В скрытом режиме, в начале 4 изображения в секунду, в конце - 1 изображение в несколько секунд).
Правильно ли я вставляю изображения? С текстовыми блоками и объектами WordArt - похожая ситуация. Как можно этот процесс оптимизировать/ускорить?
Проходясь под отладкой складывается впечатление, что обращения к COM модели word-а с каждым разом занимают больше времени.
Почему это происходит?
Вложения
Тип файла: txt Видимый документ.txt (6.7 Кб, 118 просмотров)
Тип файла: txt Скрытый документ.txt (9.2 Кб, 119 просмотров)

Последний раз редактировалось Diego__; 25.12.2009 в 17:48.
Diego__ вне форума Ответить с цитированием
Старый 25.12.2009, 21:59   #2
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Это естественно, ведь интерпретатору приходится пройти по всей растущей цепочке объектов и осуществить ререндеренг.
Единственное качественное решение очень грустное - НЕ РАБОТАТЬ
С ОБЪЕКНОЙ МОДЕЛЬЮ WORD а формировать одним проходом плоский
xml документ для всего результирующего документа сразу. И только его
грузить в Word. Но для вас это полная смена концепции ...
Aent вне форума Ответить с цитированием
Старый 27.12.2009, 23:11   #3
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

Цитата:
интерпретатору приходится пройти по всей растущей цепочке объектов и осуществить ререндерен
Не совсем понятно: если видна, скажем только 5ая старница, то рендерятся с 1 по 4ую и после 5ой страницы? Рисование происходит всегда не зависимо от того видим ли документ или нет? Неужели нет возможности как то задизейблить этот процесс?

Последний раз редактировалось Diego__; 28.12.2009 в 15:26.
Diego__ вне форума Ответить с цитированием
Старый 28.12.2009, 19:29   #4
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

У Application-а есть метод ScreenRefresh экран не перерисовывается, но скорости при этом не прибавляется
Пробовал m_Window->PutWindowState(Word::wdWindowState Minimize); - то же самое
Diego__ вне форума Ответить с цитированием
Старый 28.12.2009, 22:47   #5
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Mожно попробовать Application.Windows(...).Visible = false
Но при этом возникнут свои проблемы
Aent вне форума Ответить с цитированием
Старый 04.01.2010, 12:23   #6
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

пробую:
Код:
m_Window = m_Document->GetActiveWindow();
m_Window->PutVisible(false);
или так(при 1ом документе):
Код:
CComVariant num(1);
m_Application->Windows->Item(&num)->PutVisible(false);
на скорость не особо влияет, со временем скорость падает.

Данный способ подразумевался? Или установить visible для всей коллекции окон?
Diego__ вне форума Ответить с цитированием
Старый 05.01.2010, 01:39   #7
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Попробуйте разбить ваш формируемый документ на отдельные файлы.
Работайте с ними и собирайте итоговый документ только в конце.
Aent вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Царевна-лягушка съедает ежедневно на 20% комаров больше, чем в предыдущий день beliy13 Помощь студентам 2 29.11.2009 18:02
Как задать в формулу больше чем 7 условий IF??? xXx666 Microsoft Office Excel 2 29.10.2009 22:55
Да тестостерона в 3 раза больше чем норма HellMercenariess Свободное общение 3 25.08.2009 22:52
Помогите пожалуйста с лабами по делфи(чем быстрее, тем лучше) Vera_Valera Помощь студентам 1 06.06.2009 10:08
Срочно требуется программист - чем больше тем лучше ) striker Gamedev - cоздание игр: Unity, OpenGL, DirectX 0 20.09.2007 19:47