Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.13;
Скачать: CL | DM;

Вниз

Проблема с колонтитулами   Найти похожие ветки 

 
Stalko   (2006-05-18 17:54) [0]

Здравствуйте!
Делаю одну програмку, которая работает с Вордом через Ole. И наблюдаю чудеса на виражах.
В генерируемом документе два раздела, в каждом из которых есть нарисованные линии и TextBox-ы. Естественно, для отладки сразу сделал ворд видимым. Запускаю и вижу: все линии легли куда надо, а вот текстбоксы из второго раздела легли в первый. Пошел по шагам. Все ложиться куда надо!!
Добавил после установки каждого текстбокса по Application.ProccessMessages. Все заработало!!!
...и тут я сделал ворд невидимым... Все отработало... и что я вижу: все те же текстбоксы из второго раздела лежат снова в первом!!!
И теперь даже не понимаю, что еще делать и из-за чего такая странность?
Может кто знает, как это лечить?


 
YurikGL ©   (2006-05-18 21:01) [1]

Код давай...
Только сокращенный по максимуму т.е. открытие ворда, залезание в колонтитулы, работа с текстбоксами, выход из колонтитула и т.п.


 
Stalko   (2006-05-18 22:58) [2]

Сильно порезаный вид, надеюсь, пока резал ничего лишнего не замочил:

procedure WordLineAdd(sect:byte;BX,BY,EX,EY,W: single);
begin
 WinWord.ActiveDocument.Sections.Item(sect).Headers.Item(wdHeaderFooterPrimary).S hapes.AddLine(CentimetersToPoints(BX)/10,
                                       WinWord.ActiveDocument.PageSetup.PageHeight-CentimetersToPoints(BY)/10,
                                       CentimetersToPoints(EX)/10,
                                       WinWord.ActiveDocument.PageSetup.PageHeight-CentimetersToPoints(EY)/10)
                                       .Line.Weight:=CentimetersToPoints(W)/10;
 Application.ProcessMessages;
end;

procedure WordTextAdd(sect:byte;X,Y,W,H:single;Orient:byte;S: string;FontSize: byte);
var S1: variant;
    O: variant;
begin
 Application.ProcessMessages;
 case Orient of
  0: O:= msoTextOrientationHorizontal;
  1: O:= msoTextOrientationUpward;
 end;
 S1:=WinWord.ActiveDocument.Sections.Item(sect).Headers.Item(wdHeaderFooterPrimar y).Shapes.AddTextBox(O,
                                                  CentimetersToPoints(X-W/2)/10,
                                                  WinWord.ActiveDocument.PageSetup.PageHeight-CentimetersToPoints(Y+H/2)/10,
                                                  CentimetersToPoints(W)/10,
                                                  CentimetersToPoints(H)/10);
 Application.ProcessMessages;
 S1.TextFrame.TextRange.Font.Size:=10;
 S1.TextFrame.TextRange.ParagraphFormat.Alignment := wdAlignParagraphCenter;
 S1.Fill.Transparency     := 1;
 S1.TextFrame.MarginLeft  := 0;
 S1.TextFrame.MarginRight := 0;
 S1.TextFrame.MarginTop   := 0;
 S1.TextFrame.MarginBottom:= 0;
 S1.Line.Visible          := msoFalse;
 S1.TextFrame.TextRange   := S;
 Application.ProcessMessages;
end;

procedure WordGener;
...
begin
DocPointer:=WinWord.Documents.Add;
WinWord.Visible:=true; // то самое место :)
WinWord.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageHeader;
WordLineAdd(1,20,45,205,45,0.3);
WordLineAdd(1,20,40,85,40,0.3);
...
WordTextAdd(1,23,32,7,5,0,"Текст1",10);
WordTextAdd(1,32,32,10,5,0,"Текст2",10);
WinWord.ActiveWindow.ActivePane.View.SeekView := wdSeekMainDocument;
 WinWord.Selection.InsertBreak(wdSectionBreakNextPage);
 WinWord.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageHeader;
 WinWord.ActiveDocument.Sections.Item(2).Headers.Item(wdHeaderFooterPrimary).Link ToPrevious := msoFalse;
 WinWord.ActiveDocument.Sections.Item(2).Footers.Item(wdHeaderFooterPrimary).Link ToPrevious := msoFalse;
 WinWord.ActiveWindow.ActivePane.View.SeekView := wdSeekMainDocument;
 WinWord.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageHeader;
 WinWord.ActiveDocument.Sections.Item(2).Headers.Item(wdHeaderFooterPrimary).Rang e.ShapeRange.Delete;
 WinWord.ActiveDocument.Sections.Item(2).Footers.Item(wdHeaderFooterPrimary).Rang e.ShapeRange.Delete;
 WinWord.ActiveWindow.ActivePane.View.SeekView := wdSeekMainDocument;
WinWord.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageHeader;
WordLineAdd(10,20,45,205,45,0.3);
WordLineAdd(10,20,40,85,40,0.3);
...
WordTextAdd(2,123,132,17,15,0,"Текст3",10);
WordTextAdd(2,132,132,110,15,0,"Текст4",10);
WinWord.ActiveWindow.ActivePane.View.SeekView := wdSeekMainDocument;
...  
end;


 
Stalko   (2006-05-19 10:25) [3]

Попробовал пройти по шагам с невидимым вордом, точнее половину AddTextBox-ов по шагам, а половину - в реальном режиме.
Так вот те, что по шагам - лежат нормально, остальные - абы как.


 
YurikGL ©   (2006-05-19 21:58) [4]


> Stalko   (18.05.06 22:58) [2]

А не проще создать файл шаблона в который изначально добавлены все линии и текстбоксы, поставлять его вместе с программой и в нужном месте просто копировать и открывать во ворде?
По моему, быстрее и безглючнее будет.


 
Stalko   (2006-05-19 22:15) [5]


> А не проще создать файл шаблона в который изначально добавлены
> все линии и текстбоксы, поставлять его вместе с программой
> и в нужном месте просто копировать и открывать во ворде?
>
> По моему, быстрее и безглючнее будет.

Об этом я думал изначально, однако, у меня есть свои основания так не делать... Хотя, согласен, и быстрее и надежнее...


 
Stalko   (2006-05-21 21:08) [6]

Всё, сам разобрался. Может кому пригодиться: у AddTextBox есть еще необязательный параметр Anchor. Нужно им указывать на нужный диапазон и тогда все будет хорошо.
Тема закрыта.



Страницы: 1 вся ветка

Текущий архив: 2008.07.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
15-1211816666
Tualatin
2008-05-26 19:44
2008.07.13
файл ресурса (где картинки jpg)


15-1211801480
тимохов
2008-05-26 15:31
2008.07.13
Совсем оффтоп, но на вас вся надежда


15-1208540966
Loginov Dmitry
2008-04-18 21:49
2008.07.13
Полезный глюк :)


15-1211938701
DimonS
2008-05-28 05:38
2008.07.13
Знатокам Access. Рухнула база (похоже).


8-1180758338
Sdach
2007-06-02 08:25
2008.07.13
Какими способами можно проиграть звуковой файл