On Sat, 29 Jul 2006 23:49:43 +0930, Troll_81 <57235@users.rsdn.ru> wrote:
> Это всё замечательно работает. А теперь возник вопрос (немного
> позновато), какие метки можно проставить в шаблоне и как их отловить из
> делфи, что бы в нужные места вставить данные из БД?
Расставь в документе bookmarks (хз как это в руском ворде), а потом в коде:
WordDocument.Bookmarks.Item('BOOKMARKNAME').Range.Text := ...
Posted via RSDN NNTP Server 2.0
Здравствуйте, <Аноним>, Вы писали:
А>Всё замечательно, только ругается что автоматические объекты не поддерживают метод Bookmarks! Т.e. не работает!
Я делал так:
Определил функции для работы с закладками и самим документом:
function CreateApp: Boolean;
begin
Result := True;
try
wApp := CreateOleObject('Word.Application');
except
Result := False;
end;
end;
function OpenDoc(AFileName: WideString): Boolean;
var
wDoc: OleVariant;
begin
Result := True;
try
wDoc := wApp.Documents.Open(AFileName, False, False);
except
Result := False;
end;
end;
function CloseApp: Boolean;
begin
Result := True;
try
wApp.Quit;
except
Result := False;
end;
end;
procedure WSearch(AData: string);
var
What, Which, Count, Name: OLEVariant;
begin
What := -1;
Which := unAssigned;
Count := unAssigned;
Name := AData;
wApp.Selection.GoTo(What, Which, Count, Name);
end;
procedure WReplace(AData, AText: string);
var
What, Which, Count, Name: OLEVariant;
begin
What := -1;
Which := unAssigned;
Count := unAssigned;
Name := AData;
if wApp.ActiveDocument.Bookmarks.Exists(AData) then
begin
wApp.Selection.GoTo(What, Which, Count, Name);
wApp.Selection.TypeText(AText);
end;
end;
А сама работа с документом потом сводится к примитиву — там, где вызываешь построение отчета, пишешь примерно так:
if CreateApp then
begin
if OpenDoc(fmMain.src_dir + 'test.rtf') then
begin
wApp.Visible := False;
// Здесь вставим в закладки нужную инфу...
//WReplace('Имя_закладки', На_что_меняем_закладку);
WReplace('Date_Contract',DateToStr(dmData.quClientsCONTRACT_DATE.AsDateTime));
WReplace('Num_Contract',dmData.quClientsCONTRACT_NUMBER_CR.Value);
//------------------- и так далее, столько, сколько есть закладок.
wApp.ActiveDocument.SaveAs(fmMain.client_dir + '\test.rtf');
wApp.Visible := True;
end
else
begin
ShowMessage('Cannot open Word Document! Please, check the file name of the document.');
Exit;
end;
end
else
begin
ShowMessage('Cannot open Word Application!');
Exit;
end;
З.Ы. Парность блоков begin..end не гарантирую — код вырезал из рабочего проекта.
... << RSDN@Home 1.2.0 alpha rev. 651>>
Здравствуйте, Horror_Infinity, Вы писали:
H_I>Здравствуйте, <Аноним>, Вы писали:
А>>Всё замечательно, только ругается что автоматические объекты не поддерживают метод Bookmarks! Т.e. не работает!
H_I>Я делал так:
H_I>Определил функции для работы с закладками и самим документом:
H_I>H_I>function CreateApp: Boolean;
H_I>begin
H_I> Result := True;
H_I> try
H_I> wApp := CreateOleObject('Word.Application');
H_I> except
H_I> Result := False;
H_I> end;
H_I>end;
H_I>function OpenDoc(AFileName: WideString): Boolean;
H_I>var
H_I> wDoc: OleVariant;
H_I>begin
H_I> Result := True;
H_I> try
H_I> wDoc := wApp.Documents.Open(AFileName, False, False);
H_I> except
H_I> Result := False;
H_I> end;
H_I>end;
H_I>function CloseApp: Boolean;
H_I>begin
H_I> Result := True;
H_I> try
H_I> wApp.Quit;
H_I> except
H_I> Result := False;
H_I> end;
H_I>end;
H_I>procedure WSearch(AData: string);
H_I>var
H_I> What, Which, Count, Name: OLEVariant;
H_I>begin
H_I> What := -1;
H_I> Which := unAssigned;
H_I> Count := unAssigned;
H_I> Name := AData;
H_I> wApp.Selection.GoTo(What, Which, Count, Name);
H_I>end;
H_I>procedure WReplace(AData, AText: string);
H_I>var
H_I> What, Which, Count, Name: OLEVariant;
H_I>begin
H_I> What := -1;
H_I> Which := unAssigned;
H_I> Count := unAssigned;
H_I> Name := AData;
H_I> if wApp.ActiveDocument.Bookmarks.Exists(AData) then
H_I> begin
H_I> wApp.Selection.GoTo(What, Which, Count, Name);
H_I> wApp.Selection.TypeText(AText);
H_I> end;
H_I>end;
H_I>
H_I>А сама работа с документом потом сводится к примитиву — там, где вызываешь построение отчета, пишешь примерно так:
H_I>H_I> if CreateApp then
H_I> begin
H_I> if OpenDoc(fmMain.src_dir + 'test.rtf') then
H_I> begin
H_I> wApp.Visible := False;
H_I>// Здесь вставим в закладки нужную инфу...
H_I> //WReplace('Имя_закладки', На_что_меняем_закладку);
H_I> WReplace('Date_Contract',DateToStr(dmData.quClientsCONTRACT_DATE.AsDateTime));
H_I> WReplace('Num_Contract',dmData.quClientsCONTRACT_NUMBER_CR.Value);
H_I>//------------------- и так далее, столько, сколько есть закладок.
H_I> wApp.ActiveDocument.SaveAs(fmMain.client_dir + '\test.rtf');
H_I> wApp.Visible := True;
H_I> end
H_I> else
H_I> begin
H_I> ShowMessage('Cannot open Word Document! Please, check the file name of the document.');
H_I> Exit;
H_I> end;
H_I> end
H_I> else
H_I> begin
H_I> ShowMessage('Cannot open Word Application!');
H_I> Exit;
H_I> end;
H_I>
H_I>З.Ы. Парность блоков begin..end не гарантирую — код вырезал из рабочего проекта.
Спасибо! Мне, после некоторых эксперементов тоже удалось запустить поиск букмарков и вставку текста в нужное мне место, но тут же выявился недостаток. Нельзя создать две закладки с одним именем, т.е. продублировать инфу в нескольких местах. В итоге я сделал так:
Template := ExtractFilePath(Application.ExeName)+'\Template\kart.dot';
WA.Documents.Add(Template, EmptyParam, EmptyParam, EmptyParam);
WD.ConnectKind:=ckAttachToInterface;
WD.ConnectTo(WA.ActiveDocument);
OldStr := '#FIO#'; NewStr := T_Peop['P_Name']; Rep := 1;
repeat
b := WD.Range.Find.Execute( OldStr, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, NewStr, Rep, EmptyParam,
EmptyParam, EmptyParam, EmptyParam);
until b = FALSE;
где WA — экземпляр TWordAplication, а WD соотвесивенно TWordDocument,
Вроде всё замечательно работает!
Здравствуйте, <Аноним>, Вы писали:
А>Спасибо! Мне, после некоторых эксперементов тоже удалось запустить поиск букмарков и вставку текста в нужное мне место, но тут же выявился недостаток. Нельзя создать две закладки с одним именем, т.е. продублировать инфу в нескольких местах.
Это у меня одна из старых версий... Сейчас я делаю все на переменных (DOC_VARIABLE). Их можно пихать без ограничений и сколько угодно. Да и работает все это не в пример быстрее...
... << RSDN@Home 1.2.0 alpha rev. 651>>