|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
09.02.2009, 19:05 | #11 | |
Регистрация: 09.02.2009
Сообщений: 9
|
Цитата:
UPD: Обновление оглавления! Оно работает в моем документе около 30 секунд. По сути-то оно делает что-то похожее - собирает инфомрацию о структуре файла. Последний раз редактировалось satyr_of_frost; 09.02.2009 в 19:31. |
|
09.02.2009, 19:39 | #12 |
Балуюсь кодами
Участник клуба
Регистрация: 09.01.2009
Сообщений: 1,837
|
Не совсем так. Оглавление работает с ссылками. Нажми на оглавлении Alt+F9 увидишь, что jyj из себя представляет. Оно работает намного быстрее, потому что делается не на VBA, а на компилированном C++ или даже C#
Лучше день потерять — потом за пять минут долететь!©
|
10.02.2009, 10:39 | #13 |
Балуюсь кодами
Участник клуба
Регистрация: 09.01.2009
Сообщений: 1,837
|
Вот так. Ищет только в части документа от текущего параграфа до конца. Вот этот вариант, похоже, окончательный. Предыдущие искали неправильно, например, если после параграфа 2.4.5.6 сразу шел параграф 3, или 2.5, или 2.4.6, т.е. более высокого уровня, то выделялся фрагмент от текущего параграфа и вверх. Теперь же проверяются все уровни по очереди, пока не будет найден следующий абзац более высокого уровня. Работает довольно шустро. oRng.Select можно не делать, а сразу копировать диапазон в буфер. Просто так видно, что копируется
Код:
Добавлено позже Пока неправильно работает с 1 уровнем. Все остальные обрабатывает правильно.
Лучше день потерять — потом за пять минут долететь!©
Последний раз редактировалось viter.alex; 10.02.2009 в 14:33. Причина: Убрал лишнее. |
10.02.2009, 14:48 | #14 |
Балуюсь кодами
Участник клуба
Регистрация: 09.01.2009
Сообщений: 1,837
|
Вот теперь совсем правильно. Все уровни вложенности (проверял до 5 включительно) работают. Проблема была во всякой мелочи, типа маркированных списков и пр. Кроме того, оказывается, что пункты находятся в коллекции ListParagraphs не по порядку номеров, а в порядке создания. Т.е. если я сначала создал пункт 8, а потом 7.9, то в коллекции они будут идти именно в таком порядке. Это увеличивает время поиска, если документ много раз редактировался, в него добавлялись пункты и пр. Да-а-а-а-а-а-а-а-а-а-а-а-а-а-а!
Код:
Лучше день потерять — потом за пять минут долететь!©
|
10.02.2009, 17:05 | #15 |
Регистрация: 09.02.2009
Сообщений: 9
|
Так, пока тестирую, не работает для посленего куска в документе. Но это я так, случайно обнаружил, послений кусок можно и руками скопировать :-)
Если поставить на просто текст - вылетает ошибка, но это тоже не предъява. Работает, корректно, но, увы 6 минут. Давайте попробуем сменить концепцию: 1) начинаем обработку с позиции курсора (я ставлю курсор перед заголовком). 2)первый символ за курсором задает формат который мы сохраняем в некую переменную. (а можно и вообще hardcode сделать у меня всегда оин и тот же формат) 3)идем посимвольно вниз 4)начиная с 200-го символа проверяем формат символа, следующего за курсором. Если совпадает с сохраненным форматом - стоп, нашли следующий абзац. 5)выделяем от начал до момета "стоп" Я понимаю, что это не общий случай и вообще костыль. Но фигли делать ;-) Как тут поставить плюсы пользователю, те самые, что завуться репутацией? UPD: я рботал с макро из сообщения от 10:39! При ламерском взгляде на новый макрос видно, что проблема с произвоительностью не исправится. Последний раз редактировалось satyr_of_frost; 10.02.2009 в 17:11. |
10.02.2009, 17:11 | #16 |
Балуюсь кодами
Участник клуба
Регистрация: 09.01.2009
Сообщений: 1,837
|
В блоке с аватарой в самой нижней строке вторая иконка слева
алгоритм странный Зачем искать посимвольно? Ты знаешь сколько он будет пересчитывать посимвольно? Ты хочешь смотреть по 200 символов, а у тебя в документе найдется 200 нумерованых заголовков? Да и то, смотрит не все, а начиная с текущей позиции. С концом документа можно доработать, а может и сам сообразишь? Добавлено после раздумий Можно и по стилям смотреть, но не символов, а абзацев. Но, что будет если потом идет стиль более высокого уровня? Тогда оно перешагнет через этот уровень и подойдет дальше.
Лучше день потерять — потом за пять минут долететь!©
Последний раз редактировалось viter.alex; 10.02.2009 в 17:16. |
10.02.2009, 17:24 | #17 | |
Регистрация: 09.02.2009
Сообщений: 9
|
Цитата:
Суть в том, что у главы, которую я хочу выделить, занимает 3-4 страницы. То есть явно больше 200 символов. Заголовок явно меньше 200 символов. Таким образом мы начнем проверять формат раньше чем глава кончилась, но позже, чем мы вышли из заголовка (заголово-то имеет искомый формат, на котором мы говорим "стоп"). На начало главы я легко встаю используя то, что называется "схема документа". Проверять формат можно только для первого символа каждой строки (лечше для пятого, на случай невидимых пробелов). Я бы с радостью писал и не мучал тебя тупорылыми задачами, но не знаю как: 1) достать формат 1.1) сравнить формат 2) устроить обход посимвольно от текущей позиции 3) ставить некие маркеры и потом выделять\копировать\вырезать от маркера до маркера. я физик, не программер. UPD По стилям круче? Можно и так. ОПисанный тобой исключительынй случай я буду иметь в виду и последнюю главу перед более высокоуровневым заголовком руками скопирую. Последний раз редактировалось satyr_of_frost; 10.02.2009 в 17:27. |
|
10.02.2009, 20:25 | #18 |
Балуюсь кодами
Участник клуба
Регистрация: 09.01.2009
Сообщений: 1,837
|
Я тоже не программер, а инженер.
Посимвольно это неправильно однозначно, потому что номер нам задает не символ, а стиль абзаца. Как я сразу не подумал? Ведь если у нас заголовок имеет стиль, например, «Заголовок 3», то, просматривая по абзацам, нужно искать абзац с таким же стилем, но с номером списка на 1 больше. Так можно делать, но сколько абзацев может быть между этими заголовками? У меня есть документ и там между заголовоками третьего уровня 18 страниц. Сколько абзацев не считал, но немало, да еще и вложенных заголовков до 5 уровня включительно. Конечно, можно ограничиться только сравнением стилей абзацев, которые имеют уровень, отличный от нулевого (т.е. те, которые отображаются в «Схеме документа» и в содержании. Но здесь опять встает проблема с заголовком более высокого уровня, т.е. нужно еще проверять не только стиль , но и, чтобы уровень абзаца был равен или на 1 больше исходного. Пример: если искать абзац 3-го уровня. то нужно проверять, чтобы по дороге не попался абзац второго уровня. Одного сравнения стилей мало. Теперь поясню как работает мой макрос:
Лучше день потерять — потом за пять минут долететь!©
|
11.02.2009, 10:26 | #19 | |
Регистрация: 09.02.2009
Сообщений: 9
|
Цитата:
Структура документа у меня достаточно жестко регламентирована. В главе, которую надо выделить, меньше либо равно 20 подпунктов 4-го уровня, то есть максимум 20. Загловки разного уровня имеют разные стили, то есть заголовок третьего уровня имеет стиль, не совпадающий с форматом других уровней а форматы более высоких уровней известны. То есть стоп-форматы можно опрделить как множество. |
|
11.02.2009, 10:59 | #20 |
Балуюсь кодами
Участник клуба
Регистрация: 09.01.2009
Сообщений: 1,837
|
Это понятно, я знаю как нужно делать нумерацию заголовков.
Пробуйте этот код. Работает быстрее. Даже кода меньше, чем в первом варианте. Комментарии достаточно полно описывают его работу. С простым текстом уже ошибки не будет, а вот с концом документа я еще работаю. Надеюсь получится. Код:
Лучше день потерять — потом за пять минут долететь!©
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Кодирование на основе ключевого слова и шифрование файла | Шульц | Помощь студентам | 5 | 24.09.2008 22:09 |
Чтение структуры файла | SDK | Помощь студентам | 4 | 23.01.2008 19:30 |
Выделение части изображения | Luboff | Помощь студентам | 1 | 26.11.2007 08:07 |
Копирование структуры в буфер обмена | bill | Общие вопросы Delphi | 14 | 20.11.2007 17:22 |
Вывод части текста из файла | CoDeR | Общие вопросы Delphi | 10 | 16.08.2007 14:30 |