Модераторы: MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Импорт любых данных из MS Word в Delphi приложение 
:(
    Опции темы
RedKot
  Дата 2.3.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.3.2007

Репутация: нет
Всего: нет



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


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

Это сообщение отредактировал(а) RedKot - 15.4.2007, 08:07

Присоединённый файл ( Кол-во скачиваний: 34 )
Присоединённый файл  ________________.rar 92,91 Kb
PM MAIL   Вверх
Albinos_x
Дата 2.3.2007, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



OleConteiner
RxRichEdit

и т.д. и т.п.


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
RedKot
Дата 3.3.2007, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.3.2007

Репутация: нет
Всего: нет



Цитата(Albinos_x @ 2.3.2007,  19:28)
OleConteiner
RxRichEdit

и т.д. и т.п.

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

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

PM MAIL   Вверх
RedKot
Дата 3.3.2007, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.3.2007

Репутация: нет
Всего: нет



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


Немного оговорюсь – в данной моей проблеме тема « WordApplication, ExcelApplication, Работа с Word и Excel» к сожалению не помогла, я имел ввиду общее, так что моя тема остается открытой  smile 
PM MAIL   Вверх
Albinos_x
Дата 3.3.2007, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



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

RXLib2005
RXLib 2.752 (Delphi 7)


Цитата(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);
...



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
RedKot
Дата 3.3.2007, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.3.2007

Репутация: нет
Всего: нет



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

Кстати, точно простой пример  smile 
PM MAIL   Вверх
Albinos_x
Дата 3.3.2007, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(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);
...





--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
RedKot
Дата 4.3.2007, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.3.2007

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
Albinos_x
Дата 4.3.2007, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



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

Цитата(обновлённая статья "Работа 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;
...




--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
RedKot
Дата 4.3.2007, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.3.2007

Репутация: нет
Всего: нет



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


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



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

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

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


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
RedKot
Дата 4.3.2007, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.3.2007

Репутация: нет
Всего: нет



Поделитесь опытом создания ScrollBar’ов для OleContainer. Он показывает информацию в поле его видимости, а то что ниже невозможно просмотреть, так как нет ScrollBar у самого OleContainer’а.
PM MAIL   Вверх
Albinos_x
Дата 4.3.2007, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



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

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


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
RedKot
Дата 5.3.2007, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.3.2007

Репутация: нет
Всего: нет



Цитата(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
PM MAIL   Вверх
Albinos_x
Дата 5.3.2007, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



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


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
RedKot
Дата 26.3.2007, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.3.2007

Репутация: нет
Всего: нет



делаю поиск тегов <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 документа) не хочет.

PM MAIL   Вверх
Albinos_x
Дата 28.3.2007, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



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


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
RedKot
Дата 15.4.2007, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.3.2007

Репутация: нет
Всего: нет



выкладываю результаты моей работы по этой теме:

Код

{в принципе этот модуль можно применять в своей программе,
только немного необходимо разобраться как эти функции работают.
надеюсь этот модуль Вам чем то поможет.
на событие формы 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.

PM MAIL   Вверх
mutabor1
Дата 10.8.2010, 05:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 10.8.2010

Репутация: нет
Всего: нет



по поводу этого кода
задача - сохранить изображения из документа на диске
у меня конструкция 
Код

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

c:=WordDocument1.shapes.count;

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

PM MAIL   Вверх
Albinos_x
Дата 26.8.2010, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



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

Это сообщение отредактировал(а) Albinos_x - 26.8.2010, 21:03


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
SlavutichRed
  Дата 14.1.2016, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 13.1.2016

Репутация: нет
Всего: нет



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

...

подскажите - на строке DD:=wdCollapseEnd компилятор выдает ошибку  undeclared identifier: 'wdCollapseEnd' и дальше не компилирует. Подскажить что где прописать что б начал понимать этот параметр?
PM MAIL   Вверх
Albinos_x
Дата 11.3.2017, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



SlavutichRed
подключите модуль WordXP или Word2000


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.3433 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.