[CDR X5-X8] Быстрый перебор букв в тексте

SSInf

Участник
Топикстартер
Сообщения
40
Реакции
11
Допустим надо каждую букву закрасить рандомным цветом.
C#
Код:
private void TextRndColor(corel.Shape s)
{
     Random rnd = new Random();
     foreach (corel.TextRange tr in s.Text.Story.Characters)
     {
          tr.Fill.UniformColor.CMYKAssign(rnd.Next(100), rnd.Next(100), rnd.Next(100), rnd.Next(100));
     }
}
Вот так работает ну очень медленно. Может кто-то знает как лучше получить символ и изменить его свойство.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 195
Реакции
10 846
Генерировать "на лету" rtf и импортировать его. Кореловская автоматизация весьма нетороплива.
 

SSInf

Участник
Топикстартер
Сообщения
40
Реакции
11
В кореле буква может иметь заливку (даже градиентную), обводку и фиг знает что еще. Как это в rtf перетащить? Мне надо изменить значения свойства символа, на основании его текущих значений.
Рандом это для примера.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 195
Реакции
10 846
Это вы сильно странного хотите. Но лично я бы сделал (делал уже) примерно так - брал простенький распакованный CDR(CMX) и парсил на лету, затем импортировал
 

SSInf

Участник
Топикстартер
Сообщения
40
Реакции
11
Да вроде не странного.
Есть открытый файл.
Находим в нем текстовые шейпы.
Берем значение свойства у буквы (к примеру заливка), меняем значения свойства.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 195
Реакции
10 846
Находим в нем текстовые шейпы.
Берем значение свойства у буквы (к примеру заливка), меняем значения свойства.
Ну ведь вы так и делаете
Вам же хочется оптимизации по скорости?
К слову сказать, и дотнет и VBA - антонимы к слову "быстро"
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 195
Реакции
10 846

SSInf

Участник
Топикстартер
Сообщения
40
Реакции
11
Отключение прорисовки на время работы делается.
А экспорт, импорт как то не совсем правильно мне кажется. Или я не понял сути.
TextRange как я понимаю это тот-же ShapeRange, по сути просто коллекция. Зафига они сделали, что коллекция TextRange содержит тип коллекции (а не просто тип char какой ни будь) мне не совсем понятно.
Но ShapeRange перебирается быстро, а вот TextRange долго. Может какие-то методы у TextRange есть которые быстрее работают чем доступ к свойству Characters ?
Я пробовал через TextRange.Range символ выцеплять в цикле, тоже долго.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 195
Реакции
10 846
Но ShapeRange перебирается быстро, а вот TextRange долго. Может какие-то методы у TextRange есть которые быстрее работают чем доступ к свойству Characters ?
Ну понятное дело, изменение элемента ShapeRange при отключенной прорисовке особо никаких изменений не порождает, изменение же одного символа порождает лавинообразную перестройку всего текстового фрейма и всех фреймов, связанных с ним, если они имеются. Это же черный ящик, повлиять на скорость работы внутри него вы при всем желании не сможете через предоставляемые вам бутылочные горлышки. Поэтому для радикального ускорения работы надо применять какие то хакерские решения иначе никак.
 

SSInf

Участник
Топикстартер
Сообщения
40
Реакции
11
изменение же одного символа порождает лавинообразную перестройку всего текстового фрейма и всех фреймов, связанных с ним, если они имеются.
Вот про это не подумал.
А может отключить как то перестройку TextRange, до внесения всех изменений. По примеру с отключением прорисовки. '))'
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 195
Реакции
10 846
А может отключить как то перестройку TextRange, до внесения всех изменений.
Ну если залезть в нативный код реализации класса TextRange и подправить там в консерватории, то, наверное, можно.
Но, IMHO, проще и быстрее, таки файл править и импортировать '))'
 

SSInf

Участник
Топикстартер
Сообщения
40
Реакции
11
Нда ). Ладно буду в сторону парсинга копать.