Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Импорт любых данных из MS Word в Delphi приложение


Автор: RedKot 2.3.2007, 17:41
Здравствуйте, посетители и создатели сайта!
Прочитал много литературы, статей, FAQ, обсуждений на форумах, но так и не нашел необходимой информации.
Такая проблема: создается Word документ, в котором пишутся вопросы для тестов (текстовая информация) и к этим вопросам могут соответствовать различные картинки, вставленные в документ из файлов, объекты Visio, Excel, PowerPoint, объекты WordArt, формулы и др.
Мне необходимо читать из файлов .doc  или .rtf по кускам эти вопросы и картинки или объекты и отображать точно так же это все как в документе в приложении Delphi.
В прикрепленном файле Word’a есть пример трех вопросов. Как мне из этого файла прочитать первый вопрос и идущую к нему картинку и отобразить точно так же в приложении Delphi, затем, например, по нажатию кнопки, третий вопрос и идущий к нему объект WordArt, затем второй вопрос и идущий к нему вставленный объект Visio?
Надеюсь, я смог изложить свою проблему. Очень прошу помочь.  :stena 


В конце темы я выложил свою работу по этой теме (модуль UmyWApp)

Автор: Albinos_x 2.3.2007, 19:28
OleConteiner
RxRichEdit

и т.д. и т.п.

Автор: RedKot 3.3.2007, 07:28
Цитата(Albinos_x @ 2.3.2007,  19:28)
OleConteiner
RxRichEdit

и т.д. и т.п.

Не стесняюсь спросить, потому что все мы когда то учились, а кто то только начинает…
Я не разу не работал с OleContainer…
И где взять этот RxRichEdit, что такое RichEdit я знаю, а вот это к сожалению…
Albinos_x, можно пример по моей проблеме, очень прошу.
Кстати, тема « WordApplication, ExcelApplication, Работа с Word и Excel» мне помогла с работой Word-Delphi, респект.

Ну только начинаю я учиться работать со связкой Word и Delphi, помогите!

Автор: RedKot 3.3.2007, 11:17
Цитата(RedKot @  3.3.2007,  07:28 Найти цитируемый пост)
Кстати, тема « WordApplication, ExcelApplication, Работа с Word и Excel» мне помогла с работой Word-Delphi, респект.


Немного оговорюсь – в данной моей проблеме тема « WordApplication, ExcelApplication, Работа с Word и Excel» к сожалению не помогла, я имел ввиду общее, так что моя тема остается открытой  smile 

Автор: Albinos_x 3.3.2007, 16:33
Цитата(RedKot @  3.3.2007,  07:28 Найти цитируемый пост)
И где взять этот RxRichEdit, что такое RichEdit я знаю, а вот это к сожалению…

http://www.pssoft.ru/click/index.php?jump=65
http://www.pssoft.ru/click/index.php?jump=32


Цитата(RedKot @  3.3.2007,  07:28 Найти цитируемый пост)
Я не разу не работал с OleContainer…

я тоже smile 
вот простейший пример:
Код
...
procedure TForm1.Button1Click(Sender: TObject);
var 
    FN:OleVariant;
begin
if OpenDialog1.Execute then
   begin
   WordApplication1.Connect;
   FN:=OpenDialog1.FileName;
   WordApplication1.Documents.Add(FN,EmptyParam,EmptyParam,EmptyParam);
   WordApplication1.Visible:=True;
   WordApplication1.ActiveDocument.Content.Copy;
   OleContainer1.Paste;
   end;
 end;
...


если сможешь найти способ загрузить содержимое документа в поток то :
Код
...
OleContainer1.LoadFromStream(Stream);
...

Автор: RedKot 3.3.2007, 18:17
Albinos_x, я вот подумал, если каждый тестовый вопрос со вставленными объектами заключать в какой-нибудь заранее определенный тег, ну например {….} или >>…<<, то можно же искать программно эти теги и читать всю информацию между ними, включая вставленные объекты, и отображать таким же образом как ты описал в OleContainer…
Я где-то вроде читал, но не подскажешь, как найти эти теги (начальный и конечный) и скопировать все что между ними в OleContainer?
И как сделать чтобы в программе никто не мог редактировать документ из OleContainer, а то по двойному щелчку или по правому щелчку мыши по нему загружается Word для изменения документа?

Кстати, точно простой пример  smile 

Автор: Albinos_x 3.3.2007, 21:16
Цитата(RedKot @  3.3.2007,  18:17 Найти цитируемый пост)
Я где-то вроде читал, но не подскажешь, как найти эти теги (начальный и конечный) и скопировать все что между ними в OleContainer?

как найти есть в моей статье... 
вот пример как найти теги и выделить текст между ними (тегами):
Код
...
var 
    Templ,d,dd:OleVariant;
    Start,End_:Integer;
begin
...
DD:=wdCollapseEnd;
Templ:='<teg>';
D:=wdFindStop;
WordApplication1.Selection.Find.Execute(Templ, EmptyParam, EmptyParam, EmptyParam,
                                       EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
                                       EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
Start:=WordApplication1.Selection.End_;
WordApplication1.Selection.Collapse(DD);
Templ:='<\teg>';
WordApplication1.Selection.Find.Execute(Templ, EmptyParam, EmptyParam, EmptyParam,
                                       EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
                                       EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
End_:=WordApplication1.Selection.Start;
WordApplication1.Selection.Collapse(DD);
WordApplication1.Selection.Start:=Start;
WordApplication1.Selection.End_:=End_;
WordApplication1.Selection.Select;
...

далее смотри код выше...
после копирования не забывай снимать выделение
Код
...
WordApplication1.Selection.Collapse(DD);
...



Автор: RedKot 4.3.2007, 10:15
Albinos_x, огромное спасибо за примеры, все работает (вроде как  smile , хотя в дальнейшей разработке программы может и начнутся проблемы).
Я вот нашел такое:
WordApplication1.Selection.CopyAsPicture;
Это значит что все выделенное можно копировать как изображение? Как с этим работать?
Например, я могу это - WordApplication1.Selection.CopyAsPicture вставить в Image1:TImage?

Автор: Albinos_x 4.3.2007, 11:14
на тексте я это не испытывал, испытывал только для получения картинок из текста....:

Цитата(обновлённая статья "Работа c MS Word")

Получение рисунка из документа

Рисунок можно не только заносить, но и получать из Word. Вставленные в Word формулы, также являются рисунками. Покажу пример получение рисунка со свойством обтекания текста – в тексте:
var c, i:Integer;
    OlF:OLEFormat;

WordDocument1.Content.Select;
// количество рисунков
c:=WordDocument1.Range.InlineShapes.Count;
Caption:=inttostr(‘количество рисунков - ’+c);
for i:=1 to c do
   begin
   WordDocument1.Range.InlineShapes.Item(i).Range.CopyAsPicture;
// для примера сделано только для 2-х рисунков
// рисунок 1
   if i=1 then
      Image1.Picture.Assign(Clipboard);
   Application.ProcessMessages;
// рисунок 2
   if i=2 then
      Image2.Picture.Assign(Clipboard);
// здесь записываем в memo1 тип и формат объекта
   OlF:=WordApplication1.Selection.InlineShapes.Item(i).OLEFormat;
      s:='';
   s:=Inttostr(WordApplication1.Selection.InlineShapes.Item(i).type_);
   if WordApplication1.Selection.InlineShapes.Item(i).OLEFormat<>nil then
      begin
      s:=s+' = ' +OlF.ClassType;
      end;
   memo1.Lines.add(s);
….

Для вставленной формулы тип объекта = 1, OLEFormat = Equation.3
Для вставленной картинки тип объекта = 3 , OLEFormat = nil

Для WordArt значение OLEFormat:= nil , тип объекта := 3.

Для рисунков с другими видами обтекания подходит немного другой код:

Uses …, Clipbrd;

var c, i:Integer;
      F:OleVariant;

C:=WordDocument1.Shapes.Count;
RichEdit2.Lines.Add('Count Shapes'+InttoStr©);
for i:=1 to c do
   begin
   F:=i;
   WordDocument1.Shapes.Item(f).Select(EmptyParam);
   WordApplication1.Selection.CopyAsPicture;
   if i=1 then
      Image1.Picture.Assign(Clipboard);
   if i=2 then
      Image2.Picture.Assign(Clipboard);
   if i=3 then
      Image3.Picture.Assign(Clipboard);
   end;


С помощью того же свойства можно получить и имя объекта, 


WordDocument1.Shapes.Item(f).Name


к примеру для вставленной картинки имя будет: “Рисунок 1” или с другой нумерацией, для WortAtr - “WordArt 2” и т.п., для картинки-объекта Visio – “Object 3” и т.п.

Для обращения к нужному объекту, например CheckBox1 нужно действовать по аналогии. Только ClassType для него будет равен 'Forms.CheckBox.1' (к первому например)... а далее всё просто... находим нужный элемент и обращаемся к нужному свойству:

...
procedure TForm1.Button1Click(Sender: TObject);
var c, i:Integer;
      F:OleVariant;
begin
if not OpenDialog1.Execute then exit;
f:=OpenDialog1.FileName   ;
WordApplication1.ConnectKind:=ckNewInstance;
WordApplication1.AutoQuit:=false;
WordApplication1.Visible:=true;
WordApplication1.AutoConnect:=true;
WordDocument1.ConnectTo(WordApplication1.Documents.Open(f, EmptyParam, 
                                                                 EmptyParam, EmptyParam, EmptyParam,
                                                                 EmptyParam,EmptyParam,EmptyParam,
                                                  EmptyParam, EmptyParam, EmptyParam,EmptyParam, 
                                                                EmptyParam,EmptyParam,EmptyParam));
Application.ProcessMessages;
WordDocument1.Content.Select;
c:=WordDocument1.Range.InlineShapes.Count;
Caption:=inttostr©;
for i:=1 to c do
   begin
   if WordApplication1.Selection.InlineShapes.Item(i).OLEFormat<>nil then
      begin
      if OlF.ClassType='Forms.CheckBox.1' then
         begin
         f:=WordApplication1.Selection.InlineShapes.Item(i).OLEFormat.Object_;
         F.Value:=True;
         end;
      end;
   end;
end;
...


Автор: RedKot 4.3.2007, 16:16
Albinos_x, подскажи пожалуйста, как правильно найти и подсчитать все буквы А, или, например, тот же <teg> (описанный выше) по всему документу от начала до конца.
Пробовал подсчитать количество тегов <teg> циклами repeat и while с помощью WordApplication1.Selection.Find.Execute(...) (FindText:=Templ,Wrap:=wdFindContinue) и с помощью WordApplication1.Selection.Find.Text:='<teg>' тоже пробовал, но ничего не вышло, точнее выходит, что у меня либо один раз находит либо бесконечно ищет по всему документу слово '<teg>'.
Или хотя бы как определить что документ закончился, и надо прекратить поиск?
И где можно взять русское описание всех 15 параметров .Execute(…..)?
заранее спасибо.

Автор: Albinos_x 4.3.2007, 17:28
использовать для подсчёта способов можно множество...
начиная от того, что грузить весь текст в переменную и анализировать её...
Цитата(RedKot @  4.3.2007,  16:16 Найти цитируемый пост)
WordApplication1.Selection.Find.Execute(...)

эта функция возвращает True если нашла и False если не нашла... ищет от текущего места, так что после каждого нахождения необходимо снимать выделение с перемещением курсора в конец...
Цитата(RedKot @  4.3.2007,  16:16 Найти цитируемый пост)
И где можно взять русское описание всех 15 параметров .Execute(…..)?

нигде не видел... переводи справку по VB...

Автор: RedKot 4.3.2007, 17:55
Поделитесь опытом создания ScrollBar’ов для OleContainer. Он показывает информацию в поле его видимости, а то что ниже невозможно просмотреть, так как нет ScrollBar у самого OleContainer’а.

Автор: Albinos_x 4.3.2007, 19:26
кидай на форму 
ScrollBox1: TScrollBox
в него помещай
OleContainer1: TOleContainer
свойство OleContainer1.SizeMode:=AutoSize - выставь в инспекторе объектов, 
для того, чтоб OleContainer занимал всё видимое пространство ScrollBox, выставь сначала у OleContainer свойство Align в alClient, после верни в alNone....

всё запускай и наслаждайся smile 

Автор: RedKot 5.3.2007, 17:33
Цитата(Albinos_x @  4.3.2007,  19:26 Найти цитируемый пост)
для того, чтоб OleContainer занимал всё видимое пространство ScrollBox, выставь сначала у OleContainer свойство Align в alClient, после верни в alNone....

что то у меня не получается.
пробовал и в инспекторе объектов менять как описано: выставь сначала у OleContainer свойство Align в alClient, после верни в alNone
и програмно пробовал: form1.olecontainer1.align:=alClient;
                                             form1.olecontainer1.align:=alNone;
где только в программе не ставил эти строчки...
все равно OleContainer не занимает все видимое пространство ScrolBox

Автор: Albinos_x 5.3.2007, 19:45
программно не поможет... делай в инспекторе объектов...
при установки Align в alClient, он сразу должен растянуться по всей видимой части ScrolBox, при установке обратно в alNone, уйдёшь от масштабирования в OleContainer...

Автор: RedKot 26.3.2007, 17:20
делаю поиск тегов <teg> и <\teg> с помощью .Execute(...) (как было описано выше в примерах от Albinos_x (за что ему спасибо smile )), если не находит их, то выполняется код except...end:

try
...
DD:=wdCollapseEnd;
...
except
  WordApplication1.ActiveDocument.Content.Copy;
  WordApplication1.Selection.Collapse(DD);
  OleContainer1.Paste;
end;
...

то есть, если нет тегов, то я хочу скопировать весь документ и вставить его в OleContainer.
Но он копирует только одну страницу (первую) в документе, а остальные нет. Как с этим бороться?

И вот еще: программа находит начальный тег <teg> и конечный <\teg>, веделяет все содержимое между ними, копирует и вставляет в OleContainer, но если начальный тег находится на одной странице, а конечный на другой, то в OleContainer вставляется только та информация, которая находится на первой (начальной) странице, а продолжение информации на другой странице вставлять в OleContainer (или копировть, или выделять из Word документа) не хочет.

Автор: Albinos_x 28.3.2007, 23:21
попробуй сначала снять выделение а потом использовать content , а вообще это скорее всего проблема заключена в OleContainer...

Автор: RedKot 15.4.2007, 08:51
выкладываю результаты моей работы по этой теме:

Код

{в принципе этот модуль можно применять в своей программе,
только немного необходимо разобраться как эти функции работают.
надеюсь этот модуль Вам чем то поможет.
на событие формы OnCreate необходимо глобальной переменной
tegNum присвоить 1 (то есть первый вопрос).
далее необходимо tegNum присваивать значение функций NextQuestion
и PreviousQuestion.
также необходимо объявить глоб. переменную (у меня kolQ),
которой будет присваиваться значение функции KolTeg,
и в дальнейшем она будет использоваться для функций NextQuestion
и PreviousQuestion.
кстати, эти две глоб. переменные можно объявить прямо в этом модуле
(все равно этот модуль подключается к другим, там где он нужен),
просто я их объявлял в модуле главной формы :-) }
unit UmyWApp;

interface

uses StdCtrls, SysUtils, OleCtnrs, Dialogs, Variants, OleServer, Word2000;

//определяет количество вопросов (тегов <teg>) в документе,
//возвращает это количество
function KolTeg(WApp:TWordApplication; myLabel:TLabel):integer;
//выход из Ворда без сохранений в открытых для данного сервера Ворд документах
function QuitWordAppNotSave(WApp:TWordApplication):boolean;
//переход к следующему вопросу (к следующему <teg>...</teg>) в документе
//необходимо применять эту функцию после функции KolTeg
//возвращает номер вопроса
function NextQuestion(WApp:TWordApplication; myOleContainer:TOleContainer;
                      myLabel:TLabel; tegNum, KolTeg:Integer):integer;
//переход к предыдущему вопросу (к предыдущему <teg>...</teg>) в документе
//необходимо применять эту функцию после функции KolTeg
//возвращает номер вопроса
function PreviousQuestion(WApp:TWordApplication; myOleContainer:TOleContainer;
                          myLabel:TLabel; tegNum, KolTeg:Integer):integer;
//соединение (точнее создание своего нового) с сервером Ворда и открытие нового документа
function WAppConnect_Add(WApp:TWordApplication; myAutoConnect, myAutoQuit:Boolean;
                          myConnectKind:TConnectKind; AddFileName:OleVariant):boolean;
//соединение (точнее создание своего нового) с сервером Ворда
// и открытие уже существующего документа
function WAppConnect_Open(WApp:TWordApplication; myAutoConnect, myAutoQuit:Boolean;
                          myConnectKind:TConnectKind; AddFileName:OleVariant):boolean;
//показывает первый вопрос в документе
//у меня применяется эта функция во время активации формы (OnActivate)
//необходимо (обязательно) применять эту функцию до функции KolTeg
//так как KolTeg вносит изменения в теги, и эта функция будет материться
function ShowFirstQuestion(WApp:TWordApplication; myOleContainer:TOleContainer;
                           ShowNotTegFile:boolean):boolean;
//копирует из документа определенный вопрос в буфер обмена
function CopyQuestionToClipboard(WApp:TWordApplication; tegNum:Integer):boolean;
//вставляет из буфера обмена в любой другой документ (этого сервера Ворд,
//с которым идет работа)
function PasteFromClipboardToFile(WApp:TWordApplication;
                                  IntoWhatItemToInsert, ReturnBackToItem:OleVariant):boolean;
//удаляет определеный вопрос из документа (вместе с тегами <teg>...</teg>)
function DeleteQuestion(WApp:TWordApplication; tegNum:Integer):boolean;

implementation

function KolTeg(WApp:TWordApplication; myLabel:TLabel):integer;
var
  L,d,DD,Templ:OleVariant;
  tr:boolean;
  text_:string;
  kol:integer;
begin
    L:=wdStory;
    WApp.Selection.HomeKey(L,EmptyParam);
    tr:=true;
    kol:=0;
    d:=wdFindStop;
    Templ:='<teg>';
    repeat
    begin
      try
      begin
        kol:=kol+1;
        tr:=WApp.Selection.Find.Execute(Templ,EmptyParam,EmptyParam,EmptyParam,
                                        EmptyParam,EmptyParam,EmptyParam,d,EmptyParam,
                                        EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
        if tr=true then
        begin
          text_:='<te'+inttostr(kol)+'>';
          WApp.Selection.Delete(EmptyParam,EmptyParam);
          WApp.Selection.InsertAfter(text_);
        end;
        WApp.Selection.End_;
        WApp.Selection.Collapse(DD);
      end
      except
        tr:=false;
      end;
    end
    until tr=false;
    kol:=kol-1;
    myLabel.Caption:='Всего вопросов: '+inttostr(kol);
    L:=wdStory;
    WApp.Selection.HomeKey(L,EmptyParam);
    Result:=kol;
end;

function QuitWordAppNotSave(WApp:TWordApplication):boolean;
var
  NotSave: OleVariant;
begin
  NotSave:=wdDoNotSaveChanges;
  try
    WApp.Quit(NotSave);
    WApp.Disconnect;
  except
    Result:=false;
    exit;
  end;
  Result:=true;
end;

function NextQuestion(WApp:TWordApplication; myOleContainer:TOleContainer;
                       myLabel:TLabel; tegNum, KolTeg:Integer):integer;
var
  Templ,D,DD:OleVariant;
  Start,End_:Integer;
begin
  try
    tegNum:=tegNum+1;
    if tegNum>KolTeg then tegNum:=1;
    myLabel.Caption:='№ вопроса: '+inttostr(tegNum);
    if tegNum=1 then
    begin
      D:=wdStory;
      WApp.Selection.HomeKey(D,EmptyParam);
    end;
    DD:=wdCollapseEnd;
    Templ:='<te'+inttostr(tegNum)+'>';
    D:=wdFindStop;
    WApp.Selection.Find.Execute(Templ, EmptyParam, EmptyParam, EmptyParam,
                                EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
                                EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                                EmptyParam, EmptyParam);
    Start:=WApp.Selection.End_;
    WApp.Selection.Collapse(DD);
    Templ:='<\teg>';
    WApp.Selection.Find.Execute(Templ, EmptyParam, EmptyParam, EmptyParam,
                                EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
                                EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                                EmptyParam, EmptyParam);
    End_:=WApp.Selection.Start;
    WApp.Selection.Collapse(DD);
    WApp.Selection.Start:=Start;
    WApp.Selection.End_:=End_;
    WApp.Selection.Select;
//////////////////////////////////////////////////////////////////////////////
    WApp.Selection.Copy;
    WApp.Selection.Collapse(DD);
    myOleContainer.Paste;
  except
    showmessage('в документе нет тегов!');
  end;
  Result:=tegNum;
end;

function PreviousQuestion(WApp:TWordApplication; myOleContainer:TOleContainer;
                          myLabel:TLabel; tegNum, KolTeg:Integer):integer;
var
  Templ,D,DD:OleVariant;
  Start,End_:Integer;
begin
  try
    tegNum:=tegNum-1;
    if tegNum=0 then tegNum:=KolTeg;
    myLabel.Caption:='№ вопроса: '+inttostr(tegNum);
    D:=wdStory;
    WApp.Selection.HomeKey(D,EmptyParam);
    DD:=wdCollapseEnd;
    Templ:='<te'+inttostr(tegNum)+'>';
    D:=wdFindStop;
    WApp.Selection.Find.Execute(Templ, EmptyParam, EmptyParam, EmptyParam,
                                EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
                                EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                                EmptyParam, EmptyParam);
    Start:=WApp.Selection.End_;
    WApp.Selection.Collapse(DD);
    Templ:='<\teg>';
    WApp.Selection.Find.Execute(Templ, EmptyParam, EmptyParam, EmptyParam,
                                EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
                                EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                                EmptyParam, EmptyParam);
    End_:=WApp.Selection.Start;
    WApp.Selection.Collapse(DD);
    WApp.Selection.Start:=Start;
    WApp.Selection.End_:=End_;
    WApp.Selection.Select;
//////////////////////////////////////////////////////////////////////////////
    WApp.Selection.Copy;
    WApp.Selection.Collapse(DD);
    myOleContainer.Paste;
  except
    showmessage('в документе нет тегов!');
  end;
  Result:=tegNum;
end;

function WAppConnect_Add(WApp:TWordApplication; myAutoConnect, myAutoQuit:Boolean;
                          myConnectKind:TConnectKind; AddFileName:OleVariant):boolean;
begin
  try
    WApp.AutoConnect:=myAutoConnect;
    WApp.AutoQuit:=myAutoQuit;
    WApp.ConnectKind:=myConnectKind;
    //if  ReadStrParam('Сервер')='#' then str:='' else str:=ReadStrParam('Сервер');
    //WordApplication1.RemoteMachineName:=str;
    WApp.Connect;
    //////////////////////отключение проверки на грамматику/////////////////////////
    WApp.Options.CheckSpellingAsYouType:=False;
    WApp.Options.CheckGrammarWithSpelling:=False;
    WApp.Options.CheckGrammarAsYouType:=False;
    ////////////////////////////////////////////////////////////////////////////////
    WApp.Documents.Add(AddFileName,EmptyParam,EmptyParam,EmptyParam);
  except
    Result:=false;
    exit;
  end;
  Result:=true;
end;

function WAppConnect_Open(WApp:TWordApplication; myAutoConnect, myAutoQuit:Boolean;
                          myConnectKind:TConnectKind; AddFileName:OleVariant):boolean;
begin
  try
    WApp.AutoConnect:=myAutoConnect;
    WApp.AutoQuit:=myAutoQuit;
    WApp.ConnectKind:=myConnectKind;
    //if  ReadStrParam('Сервер')='#' then str:='' else str:=ReadStrParam('Сервер');
    //WordApplication1.RemoteMachineName:=str;
    WApp.Connect;
    //////////////////////отключение проверки на граматику/////////////////////////
    WApp.Options.CheckSpellingAsYouType:=False;
    WApp.Options.CheckGrammarWithSpelling:=False;
    WApp.Options.CheckGrammarAsYouType:=False;
    ////////////////////////////////////////////////////////////////////////////////
    WApp.Documents.Open(AddFileName,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                        EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                        EmptyParam,EmptyParam);
  except
    Result:=false;
    exit;
  end;
  Result:=true;
end;

function ShowFirstQuestion(WApp:TWordApplication; myOleContainer:TOleContainer;
                           ShowNotTegFile:boolean):boolean;
var
  Templ,D,DD:OleVariant;
  Start,End_:Integer;
begin
  try
    DD:=wdCollapseEnd;
    Templ:='<teg>';
    D:=wdFindStop;
    WApp.Selection.Find.Execute(Templ, EmptyParam, EmptyParam, EmptyParam,
                                EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
                                EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                                EmptyParam, EmptyParam);
    Start:=WApp.Selection.End_;
    WApp.Selection.Collapse(DD);
    Templ:='<\teg>';
    WApp.Selection.Find.Execute(Templ, EmptyParam, EmptyParam, EmptyParam,
                                EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
                                EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                                EmptyParam, EmptyParam);
    End_:=WApp.Selection.Start;
    WApp.Selection.Collapse(DD);
    WApp.Selection.Start:=Start;
    WApp.Selection.End_:=End_;
    WApp.Selection.Select;
//////////////////////////////////////////////////////////////////////////////
    WApp.Selection.Copy;
    WApp.Selection.Collapse(DD);
    myOleContainer.Paste;
  except
    if ShowNotTegFile=true then
    begin
      WApp.ActiveDocument.Content.Copy;
      WApp.Selection.Collapse(DD);
      myOleContainer.Paste;
    end;
    Result:=false;
    exit;
  end;
  Result:=true;
end;

function CopyQuestionToClipboard(WApp:TWordApplication; tegNum:Integer):boolean;
var
  Templ,D,DD:OleVariant;
  Start,End_:Integer;
begin
  try
    D:=wdStory;
    WApp.Selection.HomeKey(D,EmptyParam);
    DD:=wdCollapseEnd;
    Templ:='<te'+inttostr(tegNum)+'>';
    D:=wdFindStop;
    WApp.Selection.Find.Execute(Templ, EmptyParam, EmptyParam, EmptyParam,
                                EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
                                EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                                EmptyParam, EmptyParam);
    Start:=WApp.Selection.End_;
    WApp.Selection.Collapse(DD);
    Templ:='<\teg>';
    WApp.Selection.Find.Execute(Templ, EmptyParam, EmptyParam, EmptyParam,
                                EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
                                EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                                EmptyParam, EmptyParam);
    End_:=WApp.Selection.Start;
    WApp.Selection.Collapse(DD);
    WApp.Selection.Start:=Start;
    WApp.Selection.End_:=End_;
    WApp.Selection.Select;
    WApp.Selection.Copy;
    WApp.Selection.Collapse(DD);
  except
    Result:=false;
    exit;
  end;
  Result:=true;
end;

function PasteFromClipboardToFile(WApp:TWordApplication;
                                  IntoWhatItemToInsert, ReturnBackToItem:OleVariant):boolean;
begin
  try
    WApp.Windows.Item(IntoWhatItemToInsert).Activate;
    WApp.Selection.TypeText('<teg>');
    WApp.Selection.TypeParagraph;
    WApp.Selection.Paste;
    WApp.Selection.TypeParagraph;
    WApp.Selection.TypeText('<\teg>');
    WApp.Selection.TypeParagraph;
    WApp.Windows.Item(ReturnBackToItem).Activate;
  except
    Result:=false;
    exit;
  end;
  Result:=true;
end;

function DeleteQuestion(WApp:TWordApplication; tegNum:Integer):boolean;
var
  Templ,D,DD:OleVariant;
  Start,End_:Integer;
begin
  try
    D:=wdStory;
    WApp.Selection.HomeKey(D,EmptyParam);
    DD:=wdCollapseEnd;
    Templ:='<te'+inttostr(tegNum)+'>';
    D:=wdFindStop;
    WApp.Selection.Find.Execute(Templ, EmptyParam, EmptyParam, EmptyParam,
                                EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
                                EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                                EmptyParam, EmptyParam);
    Start:=WApp.Selection.Start;
    WApp.Selection.Collapse(DD);
    Templ:='<\teg>';
    WApp.Selection.Find.Execute(Templ, EmptyParam, EmptyParam, EmptyParam,
                                EmptyParam, EmptyParam, EmptyParam, D, EmptyParam,
                                EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                                EmptyParam, EmptyParam);
    End_:=WApp.Selection.End_;
    WApp.Selection.Collapse(DD);
    WApp.Selection.Start:=Start;
    WApp.Selection.End_:=End_;
    WApp.Selection.Select;
    D:=wdCharacter;
    Templ:=1;
    WApp.Selection.Delete(D,Templ);
    //WApp.Selection.Collapse(DD);
  except
    Result:=false;
    exit;
  end;
  Result:=true;
end;

end.

Автор: mutabor1 10.8.2010, 05:39
по поводу этого http://forum.vingrad.ru/index.php?showtopic=139439&view=findpost&p=1053931
задача - сохранить изображения из документа на диске
у меня конструкция 
Код

c:=WordDocument1.range.inlineShapes.Count;
 (и все следующие с inlineshapes) не работает, возвращается ноль
работает так 
Код

c:=WordDocument1.shapes.count;

как в этом случае быть? нигде не могу найти нормального хелпа 

Автор: Albinos_x 26.8.2010, 21:02
1. 1 топик, 1 вопрос
mutabor1, создай для этого отдельную тему
2. если работает - хорошо, в чем суть вопроса? 
3.  хелпа, как такового нет... только если пробовать лезть в хелп по VB, но код последнего может существенно отличаться от Dephi.
4. возвращаемый вариант тоже может отличаться от действительности, если ты обратил внимание на мои комментарии, то там написано что этот код у меня работал только на картинках, которые размещены "в тексте". "За текстом" и "перед текстом" этот вариант может не прокатить, тогда возможно работает твой вариант... в общем нужно проверять...

Автор: SlavutichRed 14.1.2016, 13:10
Цитата(Albinos_x @ 3.3.2007,  21:16)
Код
...
var 
    Templ,d,dd:OleVariant;
    Start,End_:Integer;
begin
...
DD:=wdCollapseEnd;

...

подскажите - на строке DD:=wdCollapseEnd компилятор выдает ошибку  undeclared identifier: 'wdCollapseEnd' и дальше не компилирует. Подскажить что где прописать что б начал понимать этот параметр?

Автор: Albinos_x 11.3.2017, 14:08
SlavutichRed
подключите модуль WordXP или Word2000

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)