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


Автор: Winprogrammer 3.1.2007, 10:33
Доброго времени суток!

Есть проблем. Мне нужно в приложение вставить обьект WordArt и научиться работать с ним. Это срочно.

Заранее спасибо.

Автор: Albinos_x 3.1.2007, 12:15
Код
...
var FBold,FItalic:OleVariant;
...
FBold:=-1;
FItalic:=0;
WordDocument1.Shapes.AddTextEffect(msoTextEffect9, 'Hello!!!', 'Arial', 30, FBold, FItalic, 281.25, 120.75, EmptyParam);
...


1 параметр - msoTextEffect1 ..  msoTextEffect30 константы объявлены в OfficeXP = (0 .. 29) стиль WordArt, плюс к этому есть ещё эффект msoTextEffectMixed = -2 

2 параметр - текст WordArt
3 параметр - шрифт
4 параметр - размер шрифта
5 параметр - стиль шрифта - жирный (0 - не жирный, -1 - жирный)
6 параметр - стиль шрифта - курсив (0 - не курсив, -1 - курсив)
7 и 8 параметры - положение слева и сверху соответственно
9 параметр - Anchor - я так понимаю положение в тексте

возвращает функция объект типа Shape

Автор: Winprogrammer 3.1.2007, 13:28
Цитата(Albinos_x @ 3.1.2007,  12:15)
Код
...
var FBold,FItalic:OleVariant;
...
FBold:=-1;
FItalic:=0;
WordDocument1.Shapes.AddTextEffect(msoTextEffect9, 'Hello!!!', 'Arial', 30, FBold, FItalic, 281.25, 120.75, EmptyParam);
...


1 параметр - msoTextEffect1 ..  msoTextEffect30 константы объявлены в OfficeXP = (0 .. 29) стиль WordArt, плюс к этому есть ещё эффект msoTextEffectMixed = -2 

2 параметр - текст WordArt
3 параметр - шрифт
4 параметр - размер шрифта
5 параметр - стиль шрифта - жирный (0 - не жирный, -1 - жирный)
6 параметр - стиль шрифта - курсив (0 - не курсив, -1 - курсив)
7 и 8 параметры - положение слева и сверху соответственно
9 параметр - Anchor - я так понимаю положение в тексте

возвращает функция объект типа Shape

Так-то оно всё хорошо. Но как прочитать этот Shape? Как мне перерисовать всё с этого Shape' а к себе на канву???

Автор: Albinos_x 3.1.2007, 14:35
цитирую из своеё статьи:
Цитата

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

Рисунок можно не только заносить, но и получать из 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

Для обращения к нужному объекту, например 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;
...



WordArt - Для вставленной картинки тип объекта = 3

Добавлено @ 14:47 
последнии версии статьи
можно скачать здесь
http://forum.vingrad.ru/topic-113874/45.html
или http://www.zoforum.zeroes-and-ones.com.ru/index.php?showtopic=174&st=45

Автор: Albinos_x 3.1.2007, 14:56
или подождать пока выйдет DRKB 3.0... smile 

Автор: Winprogrammer 4.1.2007, 11:54
Цитата(Albinos_x @ 3.1.2007,  14:35)
цитирую из своеё статьи:
Цитата

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

Рисунок можно не только заносить, но и получать из 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

Для обращения к нужному объекту, например 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;
...



WordArt - Для вставленной картинки тип объекта = 3

Добавлено @ 14:47 
последнии версии статьи
можно скачать здесь
http://forum.vingrad.ru/topic-113874/45.html
или http://www.zoforum.zeroes-and-ones.com.ru/index.php?showtopic=174&st=45

Благодарю за помощь.

Еще один вопросик. Как показать таблицу выбора нужного обьекта WordArt и узнать какой обьект выбрал пользователь?

Автор: Albinos_x 4.1.2007, 18:12
Цитата(Winprogrammer @  4.1.2007,  11:54 Найти цитируемый пост)
узнать какой обьект выбрал пользователь

Код

ccc:=WordApplication1.Selection.InlineShapes.Item(i).TextEffect.PresetTextEffect


Ccc:Integer; - в неё будет возвращаться тип :
Цитата(Albinos_x @  3.1.2007,  12:15 Найти цитируемый пост)
msoTextEffect1 ..  msoTextEffect30 константы объявлены в OfficeXP = (0 .. 29)


Цитата(Winprogrammer @  4.1.2007,  11:54 Найти цитируемый пост)
Как показать таблицу выбора нужного обьекта WordArt

попробуй покапаться в диалогах...

Автор: Winprogrammer 5.1.2007, 11:09
Цитата(Albinos_x @ 4.1.2007,  18:12)
попробуй покапаться в диалогах...

В диалогах не нашел. Може это ActiveX компонент Ворды и к нему нужен другой, особый подход?

Автор: Albinos_x 9.1.2007, 20:29
может... но каков подход не знаю...

Автор: Winprogrammer 9.1.2007, 20:34
Цитата(Albinos_x @ 9.1.2007,  20:29)
может... но каков подход не знаю...

А как тогда? Ну очень хочется юзать WordArt в своей проге?????????

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