Конференции:  3D графика Delphi Игры Бизнес Потрепаться PHP&MySQL QuarkXPress Turbo Pascal WEB-дизайн 
<<<    Конференция "Delphi"   >>>
Jim [2003-08-18 20:27:14]
Как распечатать Word'овский файлик не открывая Word?
Есть файл RTF, который нужно послать на печать без лишних геморов с word'ом.
Как это сделать?

Скрыты сообщения от: "Man in Black" "Jim"
Смотреть ветвь полностью

Man in Black ® [2003-08-19 10:09:35]    [3]
Странно. WordDocument.Close и FreeAndNil должны все закрывать.
Покажи, как ты его открываешь, пожалуйста.

Nick [2003-08-19 10:13:34]    [4]
Может поможет.

function CreateMSWordFile(FileName: string; DBGrid: TDBGrid): boolean;
const
xlLCID = LOCALE_USER_DEFAULT;
var
i, CurCol, CurRow, RowCount, ColCount: integer;
WordApplication: Word97.TWordApplication;
WordDocument: Word97.TWordDocument;
iWordDocument: Word97._Document;
iTable: Word97.Table;
DataSet: TDataSet;
ErrorMsg: string;
OleFileName, OleTrueParam, OleFalseParam, Template, NewTemplate, StartInd: OleVariant;
begin
Result := False;

if not Assigned(DBGrid) or not Assigned(DBGrid.DataSource) or
  not Assigned(DBGrid.DataSource.DataSet) then Exit;

Screen.Cursor := crHourGlass;

DataSet := DBGrid.DataSource.DataSet;

WordApplication := Word97.TWordApplication.Create(Application);
WordDocument := Word97.TWordDocument.Create(Application);

DataSet.DisableControls;
DataSet.First;

try
  WordApplication.Connect;
  WordApplication.ConnectKind := ckRunningOrNew;
  WordApplication.Caption := FileName;

  Template := EmptyParam;
  NewTemplate := False;
  iWordDocument := WordApplication.Documents.Add(Template, NewTemplate);
  WordDocument.ConnectTo(iWordDocument);

  WordApplication.Options.CheckSpellingAsYouType := False;
  WordApplication.Options.CheckGrammarAsYouType := False;

  ColCount := DBGrid.Columns.Count;
  RowCount := DataSet.RecordCount + 1;

  StartInd := WordDocument.Characters.Count-1;
 
  iTable := WordDocument.Tables.Add(WordDocument.Range(StartInd), RowCount, ColCount);
  CurRow := 1;
  CurCol := 1;
 
  for i := 0 to DBGrid.Columns.Count - 1 do
  begin
    if not DBGrid.Columns[i].Visible then Continue;

    iTable.Cell(CurRow, CurCol).Range.Font.Size := 10;
    iTable.Cell(CurRow, CurCol).Range.Font.Bold := 0;
    iTable.Cell(CurRow, CurCol).Range.InsertAfter(DBGrid.Columns[i].Title.Caption);
    iTable.Cell(CurRow, CurCol).Borders.OutsideLineStyle := Word97.wdLineStyleSingle;
    iTable.Cell(CurRow, CurCol).VerticalAlignment := Word97.wdCellAlignVerticalTop;

    Inc(CurCol);
  end;
  Inc(CurRow);
  // ---

  // --- Write Data
  while not DataSet.Eof do
  begin
    CurCol := 1;
 
    for i := 0 to DBGrid.Columns.Count - 1 do
    begin
if not DBGrid.Columns[i].Visible then Continue;

iTable.Cell(CurRow, CurCol).Range.Font.Size := 10;
iTable.Cell(CurRow, CurCol).Range.Font.Bold := 0;
iTable.Cell(CurRow, CurCol).Range.InsertAfter(DBGrid.Columns[i].Field.Text);
iTable.Cell(CurRow, CurCol).Borders.OutsideLineStyle := Word97.wdLineStyleSingle;

Inc(CurCol);
    end;

    DataSet.Next;
    Inc(CurRow);
  end;

  iTable.Columns.AutoFit;

  WordApplication.ScreenUpdating := True;
  WordApplication.Visible := True;

  Result := True;
except
  on E: Exception do
  begin
    Result := False;
    ErrorMsg := E.Message;
  end
end;

DataSet.First;
DataSet.EnableControls;

FreeAndNil(WordDocument);
FreeAndNil(WordApplication);

Screen.Cursor := crDefault;

if not Result then ShowMessage(ErrorMsg);
end;




Jim [2003-08-19 11:32:03]    [5]
После закрытия смотрю список открытых процессов (у меня WinXP) и там WINWORD процесс остается, который кушает ~16Мб памяти, что мне и не нравится...

Вот как открываю:
WordApplication := TWordApplication.Create(self);
WordDocument := TWordDocument.Create(self);
WordApplication.Connect;
WordApplication.Visible := false;
WordApplication.Documents.Open(FileName,
        EmptyParam,EmptyParam,EmptyParam,
        EmptyParam,EmptyParam,EmptyParam,
        EmptyParam,EmptyParam,EmptyParam,
        EmptyParam,EmptyParam,EmptyParam,
        EmptyParam,EmptyParam);
WordDocument.ConnectTo(WordApplication.ActiveDocument);
WordApplication.Options.CheckSpellingAsYouType:=False;
WordApplication.Options.CheckGrammarAsYouType:=False;
WordDocument.PrintOut;
... ну и закрываю...

Man in Black ® [2003-08-19 12:14:03]    [6]
Наверное, документ не закрывается (WordDocument.Close).
Добавь такие параметры:
WordDocument.Close(SaveChanges, EmptyParam,EmptyParam);

Jim [2003-08-19 13:54:59]    [7]
Не... не помогает любой из параметров:
SaveChanges:=wdDoNotSaveChanges;
//wdDoNotSaveChanges = $00000000;
//wdSaveChanges = $FFFFFFFF;
//wdPromptToSaveChanges = $FFFFFFFE;
WordDocument.Close(SaveChanges, EmptyParam,EmptyParam);

Может само приложение (WordApplication) не выгружается?
Или при соединении пускается сервер - процесс, который как-то иначе надо выгрузить?

Jim [2003-08-19 14:02:39]    [8]
Ну точно...  WordApplication.Quit помогает,
правда долгова-то выгружается - MS Office, блин 8)


Man in Black ® [2003-08-19 14:17:14]    [9]
FreeAndNil(WordDocument);
FreeAndNil(WordApplication);

Проверь после этих команд на Nil.


Man in Black ® [2003-08-19 14:20:28]    [10]
А ну да. Ну и ладушки. :)

Jim [2003-08-19 14:20:55]    [11]
Все нормально...
Спасибо

SERGOFAN [2010-10-25 14:09:18]    [12]
И в чем сложность?

procedure ???;

var
 WordDoc: Variant;

begin
 //открываем документ
 WordDoc:= CreateOleObject('Word.Application');
 WordDoc.Documents.Open('имя файла');
 //печать документа
 WordDoc.PrintOut;
 //закрываем документ
 WordDoc.Quit;
end;



ПОДПИСАТЬСЯ НА ТЕМУ

E-mail
7+8?



приветя улыбаюсьхадаподмигиваюя тащусьмое почтениесчастливоцелуюбухаемужас
не понялплачуфупечальзлойстесняюсьсогласеннетгыкурю
суперязыкмузонпыворыдаю


Ваше имя: 
     Осталось: 

 

Допускается форматирование текста:
[•B]полужирный[B•] [•I]наклонный[I•] [•U]подчеркнутый[U•] [•‹]URL картинки[›•].
Для кода программ используйте [•¤] код программы [¤•]
Количество открывающих и закрывающих тэгов форматирования текста должно быть равным, иначе форматирование не осуществится.


Adelavida Link       Рейтинг@Mail.ru