OLE в Делфи
От: Troll_81  
Дата: 29.07.06 14:19
Оценка:
В общем мне неообходимо реализовать такую вещь:
Отчет в приложении, но что б макет отчёта мог менять пользователь программы и при создании/печати отчёта туда подставлялись данные и БД. Обдумав ситуацию, я не придумал ни чего лучше, чем создать макет в ворде и занружать ворд из программы соответсвенно с этим макетом.
Получилось что-то вроде:

procedure TFrm_Main.TB_RepKartClick(Sender: TObject);
var XPWord : Variant;
Template : OleVariant;
begin
ConIni := TIniFile.Create(extractfilepath(paramstr(0))+'App.ini');
Mask := ConIni.ReadString('Options', 'Mask', ' ');
ConIni.Free;
//Открываем шаблон договора
Template := 'D:\kart.dot';
XPWord := CreateOleObject('Word.Application');
XPWord.Documents.Add(Template, EmptyParam);
XPWord.Visible := TRUE;
end;

Это всё замечательно работает. А теперь возник вопрос (немного позновато), какие метки можно проставить в шаблоне и как их отловить из делфи, что бы в нужные места вставить данные из БД?
Re: OLE в Делфи
От: wellwell Австралия https://www.softperfect.com
Дата: 29.07.06 14:25
Оценка:
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
Re[2]: OLE в Делфи
От: Аноним  
Дата: 29.07.06 14:49
Оценка:
Здравствуйте, wellwell, Вы писали:

W>On Sat, 29 Jul 2006 23:49:43 +0930, Troll_81 <57235@users.rsdn.ru> wrote:

>> Это всё замечательно работает. А теперь возник вопрос (немного
>> позновато), какие метки можно проставить в шаблоне и как их отловить из
>> делфи, что бы в нужные места вставить данные из БД?

W>Расставь в документе bookmarks (хз как это в руском ворде), а потом в коде:

W>WordDocument.Bookmarks.Item('BOOKMARKNAME').Range.Text := ...

Всё замечательно, только ругается что автоматические объекты не поддерживают метод Bookmarks! Т.e. не работает!
Re[3]: OLE в Делфи
От: Horror_Infinity Россия  
Дата: 31.07.06 06:30
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Всё замечательно, только ругается что автоматические объекты не поддерживают метод 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>>
Re[4]: OLE в Делфи
От: Аноним  
Дата: 31.07.06 14:30
Оценка:
Здравствуйте, 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,
Вроде всё замечательно работает!
Re[5]: OLE в Делфи
От: Horror_Infinity Россия  
Дата: 31.07.06 14:48
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Спасибо! Мне, после некоторых эксперементов тоже удалось запустить поиск букмарков и вставку текста в нужное мне место, но тут же выявился недостаток. Нельзя создать две закладки с одним именем, т.е. продублировать инфу в нескольких местах.


Это у меня одна из старых версий... Сейчас я делаю все на переменных (DOC_VARIABLE). Их можно пихать без ограничений и сколько угодно. Да и работает все это не в пример быстрее...
... << RSDN@Home 1.2.0 alpha rev. 651>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.