Страница 6 из 12
------------------------------------------------------------ Q-71: Как мне работать с файлами MS Word или таблицами MS Excel? ------------------------------------------------------------ Воспользоваться функцией CreateOLEObject и работать с VBA (Visual Basic for Applications) или WordBasic. NB: Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc'); Пример проверен только на русском Word 7.0! Может, поможет... unit InWord; interface uses ... ComCtrls; // Delphi3 ... OLEAuto; // Delphi2 [skip] procedure TPrintForm.MPrintClick(Sender: TObject); var W: Variant; S: String; begin S:=VarToStr(Table1['Num']); file://В D3 без промежуточной записи // в var у меня не пошло :( try // А вдруг где ошибка :) W:=CreateOleObject('Word.Basic'); // Создаем документ по шаблону MyWordDot // с указанием пути если он не в папке шаблонов Word W.FileNew(Template:='C:\MyPath\DB\MyWordDot',NewTemplate:=0); // Отключение фоновой печати (на LJ5L без этого был пустой лист) W.ToolsOptionsPrint(Background:=0); // Переходим к закладке Word'a 'Num' W.EditGoto('Num'); W.Insert(S); file://Сохранение W.FileSaveAs('C:\MayPath\Reports\MyReport') W.FilePrint(NumCopies:='2'); // Печать 2-х копий finally W.ToolsOptionsPrint(Background:=1); W:=UnAssigned; end; end; {.....} Sergey Arkhipov 2:5054/88.10 ----------------------- Второй путь, более правильный. Нужно импортировать TLB библиотеку соответствующего COM-сервера (MS Word, MS Excel, AutoCAD, и т.п.) или воспользоваться готовыми компонентами из палитры Servers поставляемыми с Delphi 5 и более свежими версиями. Среда построит unit содержащий описания всех доступных интерфейсов сервера. Кроме того будут созданы классы-обертки для некоторых интерфейсов сервера. Преимущество этого метода заключается в том что компилятор может проверить правильность синтаксиса обращений к серверу, кроме того повышается скорость работы за счет меньших накладных расходов на каждое обращение. Пример использования TLB. program wordemo; {$APPTYPE CONSOLE} uses SysUtils, ActiveX, Word2000, OleCtrls, Variants; var W:TWordApplication; D:_Document; P:Paragraph; FileName:OleVariant; begin CoInitialize(NIL); try // создадим экземпляр объекта-обертки вокруг Word 2000 W:=TWordApplication.Create(NIL); try // создадим новый документ на основе шаблона Normal D:=W.Application.Documents.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam); // добавим новый параграф P:=D.Paragraphs.Add(EmptyParam); // Запишем туда какой-нибудь текст P.Range.InsertAfter('Hello Word :-)'); // сохраним документ FileName:='wordemo.doc'; D.SaveAs(FileName,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam); finally // завершим работу Word W.Free; end; finally CoUnInitialize; end; end. Andrew V. Fionik <
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
> ------------------------------------------------------------ Q-72: Как сделать так, чтобы запущенная программа не была видна на панели задач?
------------------------------------------------------------ Во-первых, можно по примеру Back Orifice воспользоваться функцией RegisterServiceProcess. Во-вторых, предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib, иначе непонятно, как вы будете возвращать программу обратно из минимизированного состояния. (EM, DS): type TForm1 = class(TForm) Label1: TLabel; RxTrayIcon1: TRxTrayIcon; procedure FormCreate(Sender : TObject); procedure RxTrayIcon1DblClick(Sender: TObject); private { Private declarations } procedure ApplicationMinimize(Sender : TObject); procedure ApplicationRestore(Sender : TObject); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMinimize := ApplicationMinimize; Application.OnRestore := ApplicationRestore; ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationMinimize(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.ApplicationRestore(Sender : TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; procedure TForm1.RxTrayIcon1DblClick(Sender: TObject); begin Application.Restore; Application.BringToFront; end; (AK): Только сpазу предупреждаю про грабли, на которые я наступал -- будь готов к тому, что если пpи попытке закрытия приложения в OnCloseQuery или OnClose выводится вопрос о подтверждении, то могут быть проблемы с автоматическим завершением пpогpаммы пpи shutdown -- под Win95 просто зависает, под WinNT не завершается. Очевидно, что сообщение выводится, но его не видно (причем SW_RESTORE не сpабатывает). Решение -- ловить WM_QUERYENDSESSION и после всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt.
|