Неразрывная печать длинных Detail’ов

Обсуждение извечных проблем кларионовских (и не только) отчетов

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
NewUser
Старожил
Сообщения: 226
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 4 раза

Неразрывная печать длинных Detail’ов

Сообщение NewUser »

Похоже, карма серьезно решила накрыть меня медным тазом да и еще постучать сверху! :) И это в канун Новогодних праздников, с которыми я вас сердечно и поздравляю!
Никогда раньше не получалось, сколько не пробовал, распечатать неразрывно два детайла, если они в сумме превышают размер Detail area. И если раньше удавалось уйти от данной проблемы, то на сей раз, похоже, надо разобраться с траблом.
Обстановка: С6.3 АВС.
Что нужно: Вывести детайлом заголовок статьи (максимум 2 см высотой) а затем, СРАЗУЖЕ, на этой же странице – другим детайлом тело этой статьи. Если текста в статье много и он в сумме с заголовком превышает размер страницы (Detail area), то заголовок печатается на этой же странице, а вот текст – на следующей.
Что печально: Всевозможные комбинации с With prior и с With next, ровным счетом ни к чему вообще не приводят.
Вопрос: Что можно предпринять в этом случае?
BOB
Ветеран
Сообщения: 336
Зарегистрирован: 17 Июль 2005, 5:43

Re: Неразрывная печать длинных Detail’ов

Сообщение BOB »

Можно предположить что второй детайл это текст с признаком авторазмера ?
Почуму его не сделать фиксированным до конца листа или есть еще третий детайл ?
Нет ясности с задачей.
NewUser
Старожил
Сообщения: 226
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 4 раза

Re: Неразрывная печать длинных Detail’ов

Сообщение NewUser »

Вывод текста (как заголовка, так и содержимого абзаца) производиться в текстовое поле (TEXT) с атрибутом RTF и опцией Resize.
Посредством данного отчета выводиться собираемый конструктором документ, состоящих из заранее не определенного (на момент написания программы) количества абзацев. Ряд абзацев объединяются в главы, которые должны иметь названия (заголовок, печатаемый первым детайлом), и который должен следовать неотрывно до первого абзаца в блоке абзацев.
BOB
Ветеран
Сообщения: 336
Зарегистрирован: 17 Июль 2005, 5:43

Re: Неразрывная печать длинных Detail’ов

Сообщение BOB »

Ну так если третьего детайла нет (а первый детайл фиксированный) , то почему бы не сделать второй детайл не resize, а фиксированный и до конца страницы . Ели исходный rtf будет больше одной страницы , то делать подкачку в rpt:rtf поле при печать второго детайла в цикле. Правда не знаю будут ли проблемы с управляющими символами (типа центровки , абзац и тд ), надо пробовать.
NewUser
Старожил
Сообщения: 226
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 4 раза

Re: Неразрывная печать длинных Detail’ов

Сообщение NewUser »

BOB писал(а):Ели исходный rtf будет больше одной страницы , то делать подкачку в rpt:rtf поле при печать второго детайла в цикле.
Как это? Ведь если сделать второй детайл фиксированной высоты, а в каком-то случае RTF-файл будет больше этого детайла, то в момент вывода на печать данные из этого файла будут, непредсказуемым на момент написания программы образом, обрезаны. Как узнать, с какого места продолжать подкачку?
Далее. Если у нас совсем коротенький абзац (ртф-файл), то при выводе на печать он займет целую страницу. Как быть с этим?
При таком подходе вырисовываются новые проблемы.
BOB
Ветеран
Сообщения: 336
Зарегистрирован: 17 Июль 2005, 5:43

Re: Неразрывная печать длинных Detail’ов

Сообщение BOB »

Ну дык в чем и вопрос . Я понял что печатается заголовок и детайл один раз , т.е. главная задача напечатать детайл без отрыва от заголовка. Если после второго детайла печатается третий (или опять второй из другого ртф) , то тогда для исключения пустот нужно пробовать вычислять высоту и управлять через report $ ?detail{prop:at,4} =?? .По моему других вариантов нет.Лично я для печати ртф стандартный отчет не использую , а использую библиотеку в libsrc\rtf.int
рекомендую.
NewUser
Старожил
Сообщения: 226
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 4 раза

Re: Неразрывная печать длинных Detail’ов

Сообщение NewUser »

Хорошо. Если сосредоточится на главной проблеме – неразрывного печатанья детайла заголовка и детайла текста, то, исходя из предложенной выше схемы, нужно сделать второй детайл фиксированной высоты, равной детайл-области отчета минус размер первого детайла заголовка. Но тогда при выводе на печать текста бо’льшего, нежели второй детайл, не поместившаяся часть не сможет быть напечатана. Тогда ее логично было бы перенести (в цикле) в этот же детайл. Только как узнать позицию в тексте, начиная с которой надо печатать очередную порцию текста на следующей странице?
И еще вопрос. Какова функция With prior и With next? Ведь по идее, которую я увидел в документации, они как раз и призваны обеспечить неразрывность 2х структур. Что это, моя кривизна восприятия написанного или кривизна реализации заявленного?
BOB
Ветеран
Сообщения: 336
Зарегистрирован: 17 Июль 2005, 5:43

Re: Неразрывная печать длинных Detail’ов

Сообщение BOB »

Какова функция With prior и With next? Ведь по идее, которую я увидел в документации, они как раз и призваны обеспечить неразрывность 2х структур
По хэлпу да ,но там еще нужно указать правильно предыдущую структуру (когда-то пробовал по моему были проблемы). А у Вас что служит источником детайла файл ртф или блоб или просто стринговое поле файла , лучше бы текст программы увидеть . Какие требования к форматированию отчета ?
Например если заголовок НЕ нужен на каждой странице т.е. не нужно разбивать на страницы тогда можно сделать высоту отчета метра на полтора и пусть на страницы разбивает принтер , ну и тд. Не могу посоветовать ничего дельного без понимания задачи.
NewUser
Старожил
Сообщения: 226
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 4 раза

Re: Неразрывная печать длинных Detail’ов

Сообщение NewUser »

BOB писал(а):...но там еще нужно указать правильно предыдущую структуру...
А вот об этом немного поподробней. Согласно документации, предыдущие структуры задаются «целочисленной константой или константным выражением, определяющие сколько предыдущих структур должно быть напечатано на странице». И согласно АВС шаблону, если в поле With prior установить какое-нибудь, отличное от нуля значение, например 1, то в сгенерированном этим шаблоном коде мы увидим: DETAIL,WITHPRIOR(1),AT(….

В моем проекте на данный момент реализовано, касательно рассматриваемой проблемы, следующее:
1. Имеется детайл заголовка. В нем находиться текстовое поле с атрибутом resize, в которое из внешнего файла заголовков конструктора вноситься текст заголовка, а также все сопутствующие атрибуты, такие как цвет, шрифт, размер и т.д. Т.к. длина заголовка равно как и размер шрифта заранее не могут быть известны, то, в идеале, нужно обеспечить «резиновость» данному Detail’у. Для упрощения, на первом этапе развития программы есть возможность сделать высоту данного детайла фиксированной.
2.Также имеется второй детайл. В нем - текстовое поле с атрибутом resize. В него из внешних файлов (на данный момент из RTF, хранящихся в tps в мемо поле БД, но уже сейчас бросаются серьезные взоры на файлы формата MS Word) заноситься УЖЕ ОТФОРМАТИРОВАННЫЙ ПОЛЬЗОВАТЕЛЕМ текст.
3. Заголовки заголовкам рознь. Это могут быть заголовки тем или глав, которые нужно печатать с новой строки. Но также могут быть заголовки абзацев и параграфов. Вот их-то и нужно выводить сразу же после предыдущего текста. Теоретически здесь ничего сложного не должно было быть, знай - анализируй галочки, поставленный в конструкторе пользователем и применяй или не применяй ENDPAGE(Report,0), но на поверку это оказалось одним из основных камнем преткновения.
NewUser
Старожил
Сообщения: 226
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 4 раза

Re: Неразрывная печать длинных Detail’ов

Сообщение NewUser »

BOB писал(а):... тогда можно сделать высоту отчета метра на полтора и пусть на страницы разбивает принтер....
Реализовал предложенный Вами вариант с полуторометровым вторым детайлом и почти что таким же по высоте текстовым RTF полем с убранным Resiz’ом. Что получилось?
1. Было обеспечено 100% разнесение заголовка с текстом. Караул! Даже текст в одну строку печатался с новой страницы.
2. Происходил корректный перенос текста со страницы на страницу – это порадовало.
3. Печатались все полтора метра пустого текста, в том числе и в виде чистых страниц – ужос!
4. Время формирования отчета увеличилось ориентировочно в три раза – терпимо, но все же…
5. При данном подходе не была решена ни одна из двух глобальных проблем, да еще прибавилась своя. А вот над пунктом № 2 надо будет основательно подумать – может найдет он свое применение когда-нибудь.
BOB
Ветеран
Сообщения: 336
Зарегистрирован: 17 Июль 2005, 5:43

Re: Неразрывная печать длинных Detail’ов

Сообщение BOB »

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