Конференция "Corba" » Внесение своих даннных в World документ [D6, D7]
 
  • p400 (20.04.07 10:51) [0]
    Здравствуйте.вот код:

    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.
    а трабл у меня вот вчём-в этом примере вносимое в закладку прописано,а мне надо вставлять из эдита...скажем по нажатию интера.эдитов много-т.е.есть форма,и забитые в эдит данные должны разносится по закладкам.вот как прикрутить это к данному примеру-никак непридумаю...
  • vl_chel © (20.04.07 11:03) [1]
    По мойму проще использовать функцию 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
  • vl_chel © (20.04.07 11:10) [2]
    либо что с виду сложнее но намного надежнее подключить библиотеку типов (project->Import Type Library)сгенерировать классы (это днльфи делает само), и пользоваться ими
    тогда по Ctrl+пробел будут видны все методы и свойства

    в прошлом примере проверка есть ли метод производиться во время выполнения программы

    с библиотекой типов во время компиляции
  • з400 (21.04.07 20:41) [3]
    Пробовал через CreateOLEObject-работает,но столкнулся с тем,сто при каждом внесении записи,ворд просит сохранить,а добавляя строку чтоб автоматом сэйвил,4-5 записей вношу,а потом выпадает в ошибку...итак-и сяк мудрил...невышло...да и код довольно весомый.тут вроди всё просто...на мой взгляд самое-то,никаких заморочек-но вот только неполучается перенести то что нужно в этот кусок..DdeConv.PokeData( 'Bm1', 'ля-ля-ля ....' );
    да и знаний сильно нехватает...мож кто может подсказать,как именно в такой реализации это сделать?
  • YurikGL © (22.04.07 10:30) [4]
  • p400 (22.04.07 14:15) [5]
    Благодарю за ссылку.есть полезное,тока в этом случае Несовсем подходит...мнеб эту задачку решить...
    мож как-то преобразовать данные из эдита,а потом вставить?текст в значение ,грубо говоря "бла-бла" из эдита в  i какоенить, и вставить?пытаюсь,но знаний катострофически нехватает...
  • YurikGL © (22.04.07 20:37) [6]
    Приведи пример...
  • p400 (22.04.07 22:53) [7]
    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]);
                                               

    -вот один из многих вариантов,что пробовал
  • YurikGL © (23.04.07 21:20) [8]

    > p400   (22.04.07 22:53) [7]
    >
    >

    Напиши словами что хочешь сделать :)
    Типа "взять число из TEdit, умножить его на два и записать в объект типа "надпись" в MSWord..."
  • p400 (25.04.07 19:53) [9]
    хочу сделать вот что: на форме расположены эдиты,-забиваются данные(номер паспорта например, Ф.И.О) и затем разносятся в в определённые места вордовского документа.грубо говоря то,что от руки вписывалось в распечатанный док-по идее будет вносится оператором.условие-должен быть док,потомучто если преобразовать в шаблон,разбивается разметка.листов много и праввить потом на руках-ещё та заморочка...заносить в док-самое оптимальное
  • YurikGL © (25.04.07 21:03) [10]
    Значит так...
    1) Делаем шаблон word-го документа. В тех местах, где надо вставить текст, делаем закладки. Сохраняем его как shablon.do_
    2) Изучаем содержание макросов перехода курсора к конкретной закладке.
    3) Прога копирует сделанный шаблон (файлик shablon.do_)  в какой-нибудь NowWork.doc
    4) Открываем его в word средствами OLE
    5) Читаем значение из едита
    6) Прыгаем курсором к нужной закладке
    7) Втыкаем после курсора текст из этого едита
    пункты 5-7 повторять пока не кончатся едиты.

    Если возникают проблемы - то пиши при выполнении какого пункта они возникают.
  • p400 (26.04.07 21:53) [11]
    Ачем неудобен такой вариант?
    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)  -отпадают

    По первому пункту -загнать этот док в шаблон-гиблое дело.на руках его редактить-обьём немалый,а док точной отчётности,т.е.все отступы абзацы и прочее-должно быть точно.

    По второму пункту-тут можно разобратся,в учебниках есть и описание и примеры

    По третему- чёт несовсем понял...шаблон загоняется в вновь созданый док?
    не...всё слишком усложняется,покрайней меря для меня.

    ...я всё стараюсь сделать какможно проще-и мне удобней и прога неперегружена.но вот как это реализовать в этом примере,или впреведённом в начале..ну неможет быть,чтоб небыло решения...
  • YurikGL © (28.04.07 21:28) [12]

    > По третему- чёт несовсем понял...шаблон загоняется в вновь
    > созданый док?
    > не...всё слишком усложняется,покрайней меря для меня.
    >

    Функция copyfile
  • p400 (30.04.07 10:15) [13]
    А есть простенький примерчик по твоему предложению? хочу просмотреть и разобратся...
  • YurikGL © (30.04.07 19:43) [14]
    Смотри статью

    w1.Connect;
    //w1.Visible:=true;

    //сюда добавляем
    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);


    за код не ручаюсь т.к. делфи под рукой нет :)
  • p400 (03.05.07 10:42) [15]
    спасибо, попробую
  • имя (29.12.07 03:54) [16]
    Удалено модератором
  • имя (11.01.08 02:04) [17]
    Удалено модератором
  • имя (11.01.08 02:05) [18]
    Удалено модератором
  • имя (11.01.08 02:06) [19]
    Удалено модератором
  • имя (12.05.08 16:07) [20]
    Удалено модератором
 
Конференция "Corba" » Внесение своих даннных в World документ [D6, D7]
Есть новые Нет новых   [120360   +41][b:0][p:0.001]