Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Редактирование документа Word


Автор: former 1.9.2010, 15:15
Есть база данных договоров. Информация о договорах сохраняется в БД, а сами файлы договоров (.doc, .rtf) генерируются на машинах пользователей и загружаются по FTP.
Иногда договоры требуют редактирования. В этом случае файл загружается на машину пользователя с FTP. И тут возникает вопрос.
Каким образом лучше всего выполнять редактирование?
Думал о следующих вариантах:
- использовать RichEdit или более продвинутый аналог (не совсем удобен в плане редактирования таблиц)
- OleContainer (тормозит и глючит) 
- открывать в Word (но тут проблемы с загрузкой нового файла на сервер после редактирования)

Какие будут рекомендации, замечания, варианты реализации? Может у кого-нибудь есть опыт?

Автор: Albinos_x 1.9.2010, 15:59
Вам скорее вот в этот раздел:
http://forum.vingrad.ru/forum/delphi-activex-com-corba-ole.html

Цитата(former @  1.9.2010,  15:15 Найти цитируемый пост)
- открывать в Word (но тут проблемы с загрузкой нового файла на сервер после редактирования)

почему так решили?

Автор: former 1.9.2010, 16:35
Цитата(Albinos_x @  1.9.2010,  15:59 Найти цитируемый пост)
почему так решили? 

Albinos_x, я тоже склонен к этому варианту. Но...
Предположим, что открыто несколько документов в Word. Загружаем файл с сервера, открываем для редактирования. Выполнили редактирование, сохраняем и закрываем документ. Теперь файл необходимо отправить на сервер. Возникает вопрос: Как определить, что отредактированный файл закрыт после сохранения и может быть отправлен на сервер?

Автор: Albinos_x 1.9.2010, 16:54
Цитата(former @  1.9.2010,  16:35 Найти цитируемый пост)
Возникает вопрос: Как определить, что отредактированный файл закрыт после сохранения и может быть отправлен на сервер? 

http://forum.vingrad.ru/index.php?showtopic=84634&view=findpost&p=650752

Автор: former 1.9.2010, 16:59
О! А я только что изучал его! Буду смотреть.

Добавлено @ 17:09
К сожалению, не смог найти в Delphi 2009 WordApplication. Может плохо искал?

Понял. Болван.smile)

Автор: former 1.9.2010, 19:03
Спасибо. Разобрался. Одно не пойму. Почему Word открывается на заднем плане?

Автор: Albinos_x 3.9.2010, 11:33
Цитата(former @  1.9.2010,  19:03 Найти цитируемый пост)
Почему Word открывается на заднем плане? 
а тебе нужно именно на переднем? перемести окно в нужную позицию...

Автор: former 3.9.2010, 19:16
Цитата(Albinos_x @  3.9.2010,  11:33 Найти цитируемый пост)
а тебе нужно именно на переднем?

Именно.
Цитата(Albinos_x @  3.9.2010,  11:33 Найти цитируемый пост)
перемести окно в нужную позицию... 

???

Автор: Albinos_x 6.9.2010, 15:37
можно попробовать что вроде:
Код

WordDoc.ActiveWindow.SetFocus;

или с помощью команды SetWindowPos(...)

Автор: former 8.9.2010, 20:01
Вопрос решил так:
Код

uses Shellapi
...
function TForm1.StartAssociatedExe(FileName: string; var ErrorCode: Cardinal): Boolean;
var Prg: string;
    ProcessInfo: TProcessInformation;
    StartupInfo: TStartupInfo;
begin
  SetLength(Prg, MAX_PATH);
  Result := False;
  ErrorCode := FindExecutable(PChar(FileName), nil, PChar(Prg));
  if ErrorCode >= 32 then
  begin
    SetLength(Prg, StrLen(PChar(Prg)));
    FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
    with StartupInfo do
    begin
      cb := SizeOf(TStartupInfo);
      wShowWindow := SW_SHOW;
    end;
    if CreateProcess(nil, PChar(Format('%s %s', [Prg, FileName])),
      nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
    begin
      WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
      GetExitCodeProcess(ProcessInfo.hProcess, ErrorCode);
      CloseHandle(ProcessInfo.hProcess);
      CloseHandle(ProcessInfo.hThread);
      Result := True;
    end
    else
      ErrorCode := GetLastError;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var ErrorCode: Cardinal;
begin
  if StartAssociatedExe(ExtractFilePath(ParamStr(0))+'01.doc', ErrorCode) then
   ShowMessage('Отредактирован!');
end;

Автор: Albinos_x 9.9.2010, 13:41
вообще странно... проверял... у меня и так он поверх открывается...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)