Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сложный отчет в формате RTF [D6, D7]


Opilki_Inside ©   (2004-05-26 18:06:00) 

Есть программа, она формирует отчет, который состоит скажем из 200 листов. Отчет содежрит в себе кучу разных таблиц (название талблицы, шапка, итого)...

Проблема такая: иногда название таблицы остается на одной странице, а содержимое улетает на другую, или графа "итого" переходит на следующию страницу...

Как этого избежать? Может кто сталкиволся с этим?

Причем надо сделать это всё с помощью компонентов с открытым кодом, или же вовсе руками на уровне тегов RTF...

Может можно как-то узновать на какой странице расположено то или иное слово? Например, с помощью вызова preview...

И вообще, куда копать?


Opilki_Inside   (2004-06-01 10:36:00) [1]

Спасибо огромное! Всё заработало!
Даже после конвертации в RTF, таблица отображется так как я хотел, осталось только найти какие теги за что отвечают, а это уже дело времени!

Еще раз спасибо!


YurikGL   (2004-05-31 22:17:00) [2]

Что именно?

Где красный фонарь вылетает?


Opilki_Inside   (2004-05-31 22:15:00) [3]

Я идею понял. Только у меня код немного подклюкивает, красный фонарь иногда вылетает....
Можно немного поподробнее?


YurikGl   (2004-05-30 20:07:00) [4]

Не знаю, поможет ли, но я приведу код формирования документа, где формируются таблицы. Причем, название таблицы не отрывается от самой таблицы, а сама таблица не разрывается, если есть возможность. Ключевые строчки я выделил.
Проверено Word2000, WordXP.
Используются компоненты от Office2000
Надеюсь ничего не забуду и кодотобразится корректно


   W1.Connect;
   W1.Visible:=true;
   par:=1;
   tabl:=0;

 inc(par);
 W1.ActiveDocument.Range(EmptyParam,EmptyParam).InsertAfter(заголовок+#13);
 W1.ActiveDocument.Paragraphs.Item(par).Range.Select;
 W1.Selection.Font:=WF1.Duplicate;        

 W1.Selection.ParagraphFormat.KeepWithNext:=-1;  

 W1.Selection.ParagraphFormat.SpaceAfter:=14;
 inc(par);
 inc(tabl);
 DSwap.First;
 W1.ActiveDocument.Range(EmptyParam,EmptyParam).InsertAfter('Столбец1'+#9+'Столбец2'+#9+'Ðåäàê&# 246;èÿ'+#9+'Íàèìåíîâàíèå'+#9+'Êîë&# 232;÷åñòâî');
 W1.ActiveDocument.Paragraphs.Item(par).Range.Select;
 W1.Selection.Font:=WF2.Duplicate;
 W1.Selection.ConvertToTable(EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,Empt yParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
   par:=par+6;
if DSwap.RecordCount>0 then begin
 Repeat
 if DSwap.Fields[0].value=null then st:=''
                               else st:=DSwap.Fields[0].value;
 if DSwap.Fields[2].value=null then st:=st+#9+''
                               else st:=st+#9+DSwap.Fields[2].value;
 if DSwap.Fields[3].value=null then st:=st+#9+''
                               else st:=st+#9+DSwap.Fields[3].value;
 if DSwap.Fields[4].value=null then st:=st+#9+''
                               else st:=st+#9+DSwap.Fields[4].value;
 if DSwap.Fields[5].value=null then st:=st+#9+''
                               else st:=st+#9+IntToStr(DSwap.Fields[5].value);

 W1.ActiveDocument.Range(EmptyParam,EmptyParam).InsertAfter(ConvertString(st)+#13);
 W1.ActiveDocument.Paragraphs.Item(par).Range.Select;
 W1.Selection.Font:=WF3.Duplicate;
 W1.Selection.ConvertToTable(EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,Empt yParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
   par:=par+6;
 DSwap.Next;
 until DSwap.Eof;
                           end  else begin
 W1.ActiveDocument.Range(EmptyParam,EmptyParam).InsertAfter(''+#9+''+#9+''+#9+''+#9+''); //Если записей в таблице нет - добавляем пустую строку
 W1.ActiveDocument.Paragraphs.Item(par).Range.Select;
 W1.Selection.Font:=WF3.Duplicate;
 W1.Selection.ConvertToTable(EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,Empt yParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
   par:=par+6

                            end;
 W1.ActiveDocument.Tables.Item(tabl).Columns.Item(1).Width:=round(1.76*100000/3527);
 W1.ActiveDocument.Tables.Item(tabl).Columns.Item(2).Width:=round(3.53*100000/3527);
 W1.ActiveDocument.Tables.Item(tabl).Columns.Item(3).Width:=round(2.47*100000/3527);
 W1.ActiveDocument.Tables.Item(tabl).Columns.Item(4).Width:=round(5.68*100000/3527);
 W1.ActiveDocument.Tables.Item(tabl).Columns.Item(5).Width:=round(2.25*100000/3527);
 TableLineSet;//Процедурка, которая прорисовывает все границы таблицы
 W1.ActiveDocument.Tables.Item(tabl).Columns.Item(3).Select;
 W1.Selection.ParagraphFormat.Alignment:=wdAlignPageNumberCenter;
 W1.ActiveDocument.Tables.Item(tabl).Columns.Item(5).Select;
 W1.Selection.ParagraphFormat.Alignment:=wdAlignPageNumberCenter;


 W1.Selection.ParagraphFormat.KeepWithNext:=-1;



Opilki_inside   (2004-05-30 17:46:00) [5]

есть такой тег \page - перенос на следующую страницу (или "разрыв страницы" как его называет ворд)

Я в курсе, только как мне узнать когда нужно на следующую страницу переносить, а когда не надо?

Можно еще управлять вордом через COM, но получать вразумительные данные от него гораздо сложнее, чем передавать. Однако чуть более умные люди таблицы делают на Ёкселе.

Не, такое не подойдет... Всё работает под Windows TSE, а клиентские машины на Линуксах... "Ёксель" и MS Word использовать нельзя...

Просто я думал, может в RTF есть какой-нибудь тег который делает так, что бы выделенные слова могли находиться только на одной странице... или что-то в этом духе...


Курдль   (2004-05-28 09:49:00) [6]


> Может можно как-то узновать на какой странице расположено
> то или иное слово?

Узновать это можно только подготовив графическийобраз отчета, причем с учетом того принтера, на котором предполагается печать отчета. Средствами RTF это сделать нельзя.
Но все это легко делается отчетными инструментами "...Report".
Можно еще управлять вордом через COM, но получать вразумительные данные от него гораздо сложнее, чем передавать. Однако чуть более умные люди таблицы делают на Ёкселе.


KADAN   (2004-05-28 07:26:00) [7]

есть такой тег \page - перенос на следующую страницу (или "разрыв страницы" как его называет ворд)


Opilki_Inside   (2004-05-27 18:12:00) [8]

блин! в этом вопрос и состит.. разработчик-то - Я !

Может кто подскажет, чем вы пользуитесь при создании отчетов?


Jeer   (2004-05-26 18:23:00) [9]

В сторону разработчика этой программы.


Наверх

Титульная страница Поиск, карта сайта Написать письмо