-
Здравствуйте.вот код:
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DdeMan, ShellAPI, StdCtrls;
type TForm1 = class(TForm) DdeConv: TDdeClientConv; Word: TButton; procedure WordClick(Sender: TObject); //procedure FormShow(Sender: TObject); private { Private declarations }
public { Public declarations } end; { Свойства DdeConv: } { ConnectMode : ddeManual } { DdeService : [None] } { DdeTopic : [None] } { FormatChars : False } { Name : DdeConv }
var Form1: TForm1; MsWord: Variant; //проверка запущен-ли? и запустить implementation
{$R *.dfm}
procedure TForm1.WordClick(Sender: TObject); begin ShellExecute(0, nil, 'c:\Test.doc', nil,nil, SW_SHOWNORMAL); if DdeConv.SetLink( 'WINWORD', 'C:\Test' ) and DdeConv.OpenLink then begin ShowMessage( 'Установлена связь с WinWord !' ); { убедимся в наличии соединения } DdeConv.PokeData( 'Bm1', 'ля-ля-ля ....' ); { вставляем 'Данные из Delphi' в документ word } DdeConv.CloseLink ;
end ; end; end. а трабл у меня вот вчём-в этом примере вносимое в закладку прописано,а мне надо вставлять из эдита...скажем по нажатию интера.эдитов много-т.е.есть форма,и забитые в эдит данные должны разносится по закладкам.вот как прикрутить это к данному примеру-никак непридумаю...
-
По мойму проще использовать функцию CreateOLEObject var Wrd : OLEVariant;
Wrd := CreateOLEObject('Word.Application); wrd.ActiveDocument.insertParagraphAfter(Edit1.text);
wrd.quit;
Для узнавания команд Word'а записываем макрос и смотрим - это для ленивых для остальных читаем справку по объектной модели Word'а C:\Program Files\Microsoft Office\OFFICE11\1049\VBAWD10.CHM
-
либо что с виду сложнее но намного надежнее подключить библиотеку типов (project->Import Type Library)сгенерировать классы (это днльфи делает само), и пользоваться ими тогда по Ctrl+пробел будут видны все методы и свойства
в прошлом примере проверка есть ли метод производиться во время выполнения программы
с библиотекой типов во время компиляции
-
Пробовал через CreateOLEObject-работает,но столкнулся с тем,сто при каждом внесении записи,ворд просит сохранить,а добавляя строку чтоб автоматом сэйвил,4-5 записей вношу,а потом выпадает в ошибку...итак-и сяк мудрил...невышло...да и код довольно весомый.тут вроди всё просто...на мой взгляд самое-то,никаких заморочек-но вот только неполучается перенести то что нужно в этот кусок..DdeConv.PokeData( 'Bm1', 'ля-ля-ля ....' ); да и знаний сильно нехватает...мож кто может подсказать,как именно в такой реализации это сделать?
-
-
Благодарю за ссылку.есть полезное,тока в этом случае Несовсем подходит...мнеб эту задачку решить... мож как-то преобразовать данные из эдита,а потом вставить?текст в значение ,грубо говоря "бла-бла" из эдита в i какоенить, и вставить?пытаюсь,но знаний катострофически нехватает...
-
Приведи пример...
-
type TWordReplaceFlags = set of (wrfReplaceAll, wrfMatchCase, wrfMatchWildcards); function WordStringReplace(ADocument: TFileName; SearchString, ReplaceString: string; Flags: TWordReplaceFlags): Boolean; const wdFindContinue = 1; wdReplaceOne = 1; wdReplaceAll = 2; wdDoNotSaveChanges = 0; var WordApp: OLEVariant; begin Result := False; { Существует ли файл? } if not FileExists(ADocument) then begin ShowMessage('Файл не найден!'); Exit; end; { Создаем OLE объект } try WordApp := CreateOLEObject('Word.Application'); except on E: Exception do begin E.Message := 'Word недоступен'; raise; end; end;
try { тут -показуем / непоказуем} WordApp.Visible := false; { Открываем документ } WordApp.Documents.Open(ADocument); { Инициализируем параметры} WordApp.Selection.Find.ClearFormatting; WordApp.Selection.Find.Text := SearchString; WordApp.Selection.Find.Replacement.Text := ReplaceString; WordApp.Selection.Find.Forward := True; WordApp.Selection.Find.Wrap := wdFindContinue; WordApp.Selection.Find.Format := False; WordApp.Selection.Find.MatchCase := wrfMatchCase in Flags; WordApp.Selection.Find.MatchWholeWord := False; WordApp.Selection.Find.MatchWildcards := wrfMatchWildcards in Flags; WordApp.Selection.Find.MatchSoundsLike := False; WordApp.Selection.Find.MatchAllWordForms := False; { Ищем} if wrfReplaceAll in Flags then WordApp.Selection.Find.Execute(Replace := wdReplaceAll) else WordApp.Selection.Find.Execute(Replace := wdReplaceOne); { Сохраняем word } // WordApp.ActiveDocument.SaveAs(ADocument); { Всё нормально } //Result := True; { Закрываем document } WordApp.ActiveDocument.Close(wdSaveChanges); finally { Закрываем Word } // WordApp.Quit; // WordApp := Unassigned; end; end; /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// procedure TForm1.JvEdit0KeyPress(Sender: TObject; var Key: Char); var WordApp: OLEVariant; begin //WordStringReplace('C:\Visa.doc', '@',Edit1.Text,[wrfReplaceAll]); при таком -в ворде стирается внесённое If Key=#13 Then begin //если нажат интер -переход в след едит и.... Key:=#0; SelectNext(Sender as TWinControl, true, true); ////// WordStringReplace('C:\Program Files\Borland\Delphi7\Projects\Visa-union\Visa.doc','$',JvEdit0.Text,[wrfReplaceAll]); JvGIFAnimator3.Visible:=true; //....вносим данные в отмеченное $ -дата
end; end;
procedure TForm1.JvEdit1KeyPress(Sender: TObject; var Key: Char); var WordApp: OLEVariant; begin If Key=#13 Then begin //если нажат интер -переход в след едит и.... Key:=#0; SelectNext(Sender as TWinControl, true, true); ////// WordStringReplace('C:\Program Files\Borland\Delphi7\Projects\Visa-union\Visa.doc','@',JvEdit1.Text,[wrfReplaceAll]);
-вот один из многих вариантов,что пробовал
-
> p400 (22.04.07 22:53) [7] > >
Напиши словами что хочешь сделать :) Типа "взять число из TEdit, умножить его на два и записать в объект типа "надпись" в MSWord..."
-
хочу сделать вот что: на форме расположены эдиты,-забиваются данные(номер паспорта например, Ф.И.О) и затем разносятся в в определённые места вордовского документа.грубо говоря то,что от руки вписывалось в распечатанный док-по идее будет вносится оператором.условие-должен быть док,потомучто если преобразовать в шаблон,разбивается разметка.листов много и праввить потом на руках-ещё та заморочка...заносить в док-самое оптимальное
-
Значит так... 1) Делаем шаблон word-го документа. В тех местах, где надо вставить текст, делаем закладки. Сохраняем его как shablon.do_ 2) Изучаем содержание макросов перехода курсора к конкретной закладке. 3) Прога копирует сделанный шаблон (файлик shablon.do_) в какой-нибудь NowWork.doc 4) Открываем его в word средствами OLE 5) Читаем значение из едита 6) Прыгаем курсором к нужной закладке 7) Втыкаем после курсора текст из этого едита пункты 5-7 повторять пока не кончатся едиты.
Если возникают проблемы - то пиши при выполнении какого пункта они возникают.
-
Ачем неудобен такой вариант? procedure TForm1.JvEdit0KeyPress(Sender: TObject; var Key: Char); var WordApp: OLEVariant;//вот он ворд begin If Key=#13 Then begin //если нажат интер -переход в след едит и.... Key:=#0; SelectNext(Sender as TWinControl, true, true); ////// WordStringReplace('C:\Program Files\Borland\Delphi7\Projects\Visa-union\Visa.doc','$',JvEdit0.Text,[wrfReplaceAll]); //....вносим данные в отмеченное $ -дата
в доке в определённых местах стоят символы. набираем текст,жмём интэр-данные внеслись,курсор перешол на другой эдит- пункты 2) ; 6) и 7) -отпадают
По первому пункту -загнать этот док в шаблон-гиблое дело.на руках его редактить-обьём немалый,а док точной отчётности,т.е.все отступы абзацы и прочее-должно быть точно.
По второму пункту-тут можно разобратся,в учебниках есть и описание и примеры
По третему- чёт несовсем понял...шаблон загоняется в вновь созданый док? не...всё слишком усложняется,покрайней меря для меня.
...я всё стараюсь сделать какможно проще-и мне удобней и прога неперегружена.но вот как это реализовать в этом примере,или впреведённом в начале..ну неможет быть,чтоб небыло решения...
-
> По третему- чёт несовсем понял...шаблон загоняется в вновь > созданый док? > не...всё слишком усложняется,покрайней меря для меня. >
Функция copyfile
-
А есть простенький примерчик по твоему предложению? хочу просмотреть и разобратся...
-
Смотри статью
w1.Connect;
CopyFile(GetCurrentDir+'\Shablon.do_',GetCurrentDir+'\Shablon.doc');
vr:=GetCurrentDir+'\Shablon.doc';
W1.Documents.Open(vr,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,Empt yParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
за код не ручаюсь т.к. делфи под рукой нет :)
-
спасибо, попробую
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
|