
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.219.236.143] |
![]() |
|
![]() |
|
|
Творю программу для подготовки отчетов в *.doc-формат.
Вот кусок кода: ![]() ![]() procedure TForm1.Button1Click(Sender: TObject); begin ... ... if CreateWord then begin VisibleWord(true); If OpenDoc(ExtractFileDir(application.ExeName)+'\1.doc') then begin StartOfDoc; FindAndPasteTextDoc('###a1!',a1.text); StartOfDoc; FindAndPasteTextDoc('###a2!',a2.text); StartOfDoc; FindAndPasteTextDoc('###a3!',a1.text); Шаблон документа выглядит так: ![]() ![]() ###a1! ###a2! ###a3! Как, например, удалить строку в шаблоне ###a2!, если a2.text не трогаю (под "контролем" чекбокса), чтобы не было текста "###2!" между ###1! и ###a3! ![]() Сейчас так: ![]() ![]() текст из а1 ###a2! текст из а3 Хочу так: ![]() ![]() текст из а1 текст из а3 |
![]() |
Сообщ.
#2
,
|
|
1) вставлять пустоту
2) зделать парсер. не делать заменой слова а сначала в какойто масив положить слово = значение. потом пробегатся по доку и если это слово совпадает с именем переменной в масиве то заменяем. нам это даст добавление возможности условий. например в доке ты пишеш ![]() ![]() ###a1!{if ###a2!} ###a2! {/if}###a3! получится чето типа SMARTY но под делфи. |
Сообщ.
#3
,
|
|
|
а ещё в ворде есть Bookmarks или Закладки.
Не надо никаких поисков и парсеров ![]() Просто значению Закладки присваиваем нужный текст, исключается блок просто - весь блок в шаблоне выделяется и назначается закладка типа "Блок1_есть" и если по условию его не должно быть - присваивается пустая строка. Минусы - если надо вставлять какой-то одинаковый текст - там, наверное, удобнее заменить несколько спец символов на нужную последовательность |
Сообщ.
#4
,
|
|
|
Для Word-отчетов можно использовать ArWordReport.
В шаблоне пишем: <#a1>%IF <#checked_a2>%THEN <#a2>%ELSE%ENDIF <#a3> В коде: ![]() ![]() //Указываем, где брать шаблон WordReport1.WordReport1.Filename := 'c:\мой_шаблон.doc'; //На вход отчета передаем три параметра WordReport1.CustTagValues['a1'] := EditA1.Text; WordReport1.CustTagValues['a2'] := EditA2.Text; WordReport1.CustTagValues['a3'] := EditA3.Text; WordReport1.CustTagValues['checked_a2'] := IntToStr(Ord(CheckBoxA2.Checked)); //Запускаем отчет try WordReport1.Preview; finally WordReport1.CloseWord; end; |
Сообщ.
#5
,
|
|
|
Всем спасибо, но сделал по другому
![]() Была функция ![]() ![]() Function FindAndPasteTextDoc(findtext_,pastetext_:string):boolean; begin FindAndPasteTextDoc:=true; try W.Selection.Find.Forward:=true; W.Selection.Find.Text:= findtext_; if W.Selection.Find.Execute then begin W.Selection.Delete; W.Selection.InsertAfter (pastetext_); end else FindAndPasteTextDoc:=false; except FindAndPasteTextDoc:=false; end; End; Добавил новую ![]() ![]() Function FindAndPasteTextDoc2(findtext_,pastetext_:string):boolean; begin FindAndPasteTextDoc2:=true; try W.Selection.Find.Forward:=true; W.Selection.Find.Text:= findtext_; if W.Selection.Find.Execute then begin W.Selection.Delete; W.Selection.Delete; end else FindAndPasteTextDoc2:=false; except FindAndPasteTextDoc2:=false; end; End; И по условию выполняю FindAndPasteTextDoc и FindAndPasteTextDoc2. |