Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1570 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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