Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Doc2TXT [D5, D6, D7, WinXP]


PRT ©   (2006-06-15 15:41:00) 

Здравсвуйте Мастера!
Возникла вот такая проблемка:

Можно ли сделать так, чтоб при вызове следующей процедуры
не мигал экран. Если можно, подскажите как ?

procedure Doc2TXT(const doc_path,txt_path: string);
var WordApp: Variant;
begin
    WordApp:=CreateOleObject('Word.Basic');
    WordApp.FileOpen(doc_path);
    WordApp.FileSaveAs(Name:=txt_path, Format := 2);
    WordApp.AppClose;
    WordApp:= Unassigned;
end;


KilkennyCat   (2006-06-20 19:36:00) [1]

> [19] MARU   (20.06.06 14:59)


Я знаю.
Я напишу сегодня-завтра статью, как это делать. Давно собирался...


MARU   (2006-06-20 14:59:00) [2]

А может кто нибудь знает как используя конвертеры
> C:\Program Files\Common Files\Microsoft Shared\TextConv
> msconv97.dll и MSWRD832.CNV
тоже самое cltkfnm, у меня задача стоит без установленного офиса сконвертить в текст DOC, XLS, PPT.
Заранее спасибо.


PRT   (2006-06-16 18:20:00) [3]

Теперь работает нормально. EvS спасибо за помощь !


EvS   (2006-06-16 17:34:00) [4]

В меню Tools->Debugger Options на вкладке Language Exceptions убери галку на Stop on Delphi Exceptions


PRT   (2006-06-16 17:27:00) [5]

А у меня в этом месте
try
  WordApp:=GetActiveOleObject('Word.Application');
except

возникает ошибка raised exception class EOleSysError with message 'Операция недоступна'. Process stopped.


EvS   (2006-06-16 15:57:00) [6]

Все работает, Select_Dir - не проверял
procedure TForm1.Button1Click(Sender: TObject);
var Docs_Dir,Text_Dir,new_name: string;
  WordApp: Variant;
  sr: TSearchRec;
begin
   Docs_Dir:=Select_Dir(Form1);
   if Docs_Dir='' then Exit;
   Text_Dir:=ExtractFilePath(Application.ExeName)+'TXT';
   If not DirectoryExists(Text_Dir) then CreateDir(Text_Dir);
   If FindFirst(Docs_Dir+'\*.doc',faArchive,sr)=0 then
    begin
      try
       WordApp:=GetActiveOleObject('Word.Application');
      except
       WordApp := CreateOleObject('Word.Application');
      end;
      try
       repeat
         new_name:=ChangeFileExt(sr.Name,'.txt');
         WordApp.Documents.Open(Docs_Dir+'\'+sr.Name);
         Application.ProcessMessages;
         WordApp.ActiveDocument.SaveAs(Text_Dir+'\'+new_name,2);
         WordApp.ActiveDocument.Close(EmptyParam, EmptyParam, EmptyParam);
       until FindNext(sr)<>0;
      finally
       WordApp.Quit(EmptyParam, EmptyParam, EmptyParam);
       WordApp:= Unassigned;
       FindClose(sr);
      end;
   end;
end;


PRT   (2006-06-16 13:27:00) [7]


> Посмотри для примера
> http://delphiworld.narod.ru/base/save_word_like_rtf.html

Я там и смотрел )) ... не работает ( Почему ???


EvS   (2006-06-16 00:43:00) [8]

Посмотри для примера
http://delphiworld.narod.ru/base/save_word_like_rtf.html


PRT   (2006-06-16 00:06:00) [9]

Вот весь модуль:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComObj, ShlObj;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 private
 public
 end;

var Form1: TForm1;

implementation

{$R *.dfm}

function Select_Dir(Form: TForm): string;
var
 TitleName, s: string;
 lpItemID : PItemIDList;
 BrowseInfo : TBrowseInfo;
 DisplayName : array[0..MAX_PATH] of char;
 TempPath : array[0..MAX_PATH] of char;
begin
 FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
 BrowseInfo.hwndOwner := Form.Handle;
 BrowseInfo.pszDisplayName := @DisplayName;
 TitleName := 'Выберите папку :';
 BrowseInfo.lpszTitle := PChar(TitleName);
 BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;
 lpItemID := SHBrowseForFolder(BrowseInfo);
 if lpItemId<>nil then
 begin
   SHGetPathFromIDList(lpItemID, TempPath);
   s:=TempPath ;
   if s[length(s)]<>'\' then Result:=s+'\'
     else Result:=s;
   GlobalFreePtr(lpItemID);
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    if not(DirectoryExists(ExtractFilePath(Application.ExeName)+'TXT'))then
      CreateDir(ExtractFilePath(Application.ExeName)+'TXT');
end;

procedure TForm1.Button1Click(Sender: TObject);
var Docs_Dir,Text_Dir,new_name: string;
   WordApp: Variant;
   sr: TSearchRec;
begin
    Docs_Dir:=Select_Dir(Form1);
    Text_Dir:=ExtractFilePath(Application.ExeName)+'TXT';
    if Docs_Dir='' then Exit;
    FindFirst(Docs_Dir+'*.doc',faArchive,sr);
    WordApp:=CreateOleObject('Word.Basic');
    repeat
          new_name:=ChangeFileExt(sr.Name,'.txt');
          WordApp.FileOpen(Docs_Dir+sr.Name);
          WordApp.FileSaveAs(Name:=Text_Dir+'\'+new_name, Format := 2);
    until FindNext(sr)<>0;
    WordApp.AppClose;
    WordApp:= Unassigned;
    FindClose(sr);
end;

end.

если кого заинтерисовало, посмотрите скажите что я не так сделал ....
P.S.: нужно указать папку с несколькими файлами (*.doc) чтоб посмотреть как программа работает


PRT   (2006-06-16 00:03:00) [10]

Есть еще у меня такая функция:

function ConvertDoc2Rtf(var FileName: string) : Boolean;
var
 oWord: OleVariant;
 oDoc: OleVariant;
begin
 Result := False;
 try
   oWord := GetActiveOleObject('Word.Application');
 except
   oWord := CreateOleObject('Word.Application');
 end;
 oWord.Documents.Open(FileName);
 oDoc  := oWord.ActiveDocument;
 FileName := ChangeFileExt(FileName, '.rtf');
 oDoc.SaveAs(FileName);
 oWord.ActiveDocument.Close(EmptyParam, EmptyParam);
 oWord.Quit(EmptyParam, EmptyParam, EmptyParam);
 oDoc := VarNull;
 oWord := VarNull;
 Result := True;
end;

тоже не работает по какой-то причине .... может кому удастся исправить???


PRT   (2006-06-16 00:02:00) [11]


> Сделай Visible:=false он вообще будет невидимым.

Идея хорошая, но если писать так: WordApp.Visible:=False, то возникает следующая ошибка 'raised exception class EOleError with message 'Method 'Visible' not supported by automation object'.
Может я что-то не так понял ??


EvS   (2006-06-15 22:49:00) [12]

Сделай Visible:=false он вообще будет невидимым.


PRT   (2006-06-15 21:52:00) [13]


> делай
> WordApp:=CreateOleObject('Word.Basic');
>
> WordApp.AppClose;
> один раз


Если б еще можно было чтоб Word запускался свернутым ???
Или так сохранять не будет ???


EvS   (2006-06-15 21:16:00) [14]

делай
WordApp:=CreateOleObject('Word.Basic');

WordApp.AppClose;
один раз


PRT   (2006-06-15 20:21:00) [15]

Я хочу сделать программу которая бы конвертировала не 1 файл, а много.
Пользователь указывает путь к папке с файлами *.doc и программа создает папку с такими же именами файлов, только *.txt
Это основная процедура.
> procedure Doc2TXT(const doc_path,txt_path: string);
> var WordApp: Variant;
> begin
>     WordApp:=CreateOleObject('Word.Basic');
>     WordApp.FileOpen(doc_path);
>     WordApp.FileSaveAs(Name:=txt_path, Format := 2);
>     WordApp.AppClose;
>     WordApp:= Unassigned;
> end;

Но когда прога начинает конвертить то для каждого файла открывается  и закрывается Word.
Если файлов много , то занимает много времени (((
Если кто знает что можно сделать , подскажите...


PRT   (2006-06-15 20:01:00) [16]


> WordApp := CreateOleObject('Word.Application');
> ...
> WordApp.quit;

тогда WordApp.FileOpen(doc_path); не работает ( ?????


> C:\Program Files\Common Files\Microsoft Shared\TextConv
> msconv97.dll и MSWRD832.CNV

что мне с этим делать ???


KilkennyCat   (2006-06-15 19:34:00) [17]

C:\Program Files\Common Files\Microsoft Shared\TextConv
msconv97.dll и MSWRD832.CNV


TUser   (2006-06-15 17:02:00) [18]

Используй программу antiword. Она никаких вордов не грузит, будет работать и без него. А сама легкая и гнушная.


Dmitrij_K   (2006-06-15 16:42:00) [19]

У меня ничего не мигает.
Только я делаю так

begin
WordApp := CreateOleObject('Word.Application');
...
WordApp.quit;
end


PRT   (2006-06-15 16:36:00) [20]

Не забудьте подключить uses ComObj


Наверх

Титульная страница Поиск, карта сайта Написать письмо