Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Forms 6i OLE2  [new]
fedegor
Member

Откуда:
Сообщений: 10
День добрый, джентльмены (и леди, конечно же).
Есть вопрос по работе с Word-ом из-под Forms 6i/

В форме есть package.

[/src]PACKAGE win_word IS

Selection OLE2.Obj_Type;
Application OLE2.Obj_Type;
Documents OLE2.Obj_Type;
Document OLE2.Obj_Type;
Paragraphs OLE2.Obj_Type;
Paragraph OLE2.Obj_Type;
Bookmarks OLE2.Obj_Type;
args OLE2.LIST_TYPE;
visible number(1) := 0;

Procedure Ini_Word (vis in number);
Function New_Doc Return OLE2.Obj_Type;
Procedure Add_Paragraph;
Procedure Doc_AddText (Template IN Varchar2);
Function Paragraph_AddText (Par_Num in number, Template IN Varchar2)
return boolean;

END;


PACKAGE BODY win_word IS

Procedure Ini_Word (vis in number)
IS
begin
	visible := vis;
	Application:=OLE2.CREATE_OBJ('Word.Application'); 
	OLE2.SET_PROPERTY(Application, 'Visible', vis);
	Documents:=OLE2.GET_OBJ_PROPERTY(Application, 'Documents');
end Ini_Word;

Function New_Doc Return OLE2.Obj_Type
is
begin
	document := OLE2.INVOKE_OBJ(documents, 'Add');
	Selection:=OLE2.GET_OBJ_PROPERTY(Application, 'Selection');
	Bookmarks := OLE2.Get_Obj_Property(document, 'Bookmarks');
	Paragraphs := OLE2.Get_Obj_Property(document, 'Paragraphs');
	Return Document;
end New_Doc;

Procedure Add_Paragraph
IS
m_par ole2.Obj_Type;
Begin
  m_par := OLE2.INVOKE_OBJ (Paragraphs, 'Add');
  ole2.release_obj( m_par );
End;

Procedure Doc_AddText (Template IN Varchar2)
is
m_r ole2.Obj_Type;
begin
  m_r := OLE2.GET_OBJ_PROPERTY(Document,'Content');
  /*args:=OLE2.CREATE_ARGLIST;
  OLE2.ADD_ARG( args, 0 ); -- 0=wdCollapseEnd
  OLE2.INVOKE( m_r, 'Collapse', args );
  OLE2.DESTROY_ARGLIST( args );
  OLE2.SET_PROPERTY( m_r, 'Text', Template);*/
  args:=OLE2.CREATE_ARGLIST;
  OLE2.ADD_ARG( args, Template );
  OLE2.INVOKE (m_r, 'InsertAfter', args);
  args:=OLE2.CREATE_ARGLIST;
  ole2.release_obj( m_r );
end;


Function Paragraph_AddText (Par_Num in number, Template IN Varchar2)
return boolean
is
m_par ole2.Obj_Type;
m_r ole2.Obj_Type;
begin
  args:=OLE2.CREATE_ARGLIST;
  OLE2.ADD_ARG( args, Par_Num );
  m_par := OLE2.INVOKE_OBJ( Paragraphs, 'Item', args );
  OLE2.DESTROY_ARGLIST( args );
  m_r := OLE2.GET_OBJ_PROPERTY(m_par,'Range');
  args:=OLE2.CREATE_ARGLIST;
  OLE2.ADD_ARG( args, Template );
  OLE2.INVOKE (m_r, 'InsertAfter', args);
  args:=OLE2.CREATE_ARGLIST;
  ole2.release_obj( m_r );
  ole2.release_obj( m_par );
	return true;
exception
	when others then
	return false;
end Paragraph_AddText;
end;

[SRC oracle]


В форме по одной кнопке создаю и документ
[/src]declare
	m_doc ole2.obj_type;
BEGIN
win_word.Ini_Word (1);
m_doc := win_word.New_Doc;
win_word.Doc_AddText('111111111111111111111111111111111111111'1);
win_word.Doc_AddText('2222222222222222222222222222222222222222');
win_word.Add_Paragraph;
win_word.Doc_AddText ('3333333333333333333333333333333333333333');
win_word.Doc_AddText ('4444444444444444444444444444444444444444');
win_word.Add_Paragraph;
win_word.Doc_AddText ('5555555555555555555555555555555555555555');
END;

[SRC oracle]

А по другой хочу посмотреть содержимое N-го параграфа (в примере 1-го) и вывести его на форму
[/src]declare
	m_par ole2.obj_type;
	m_r ole2.obj_type;
BEGIN
  win_word.args:=OLE2.CREATE_ARGLIST;
  OLE2.ADD_ARG( win_word.args, 1 );
  m_par := OLE2.INVOKE_OBJ( win_word.Paragraphs, 'Item', win_word.args );
  OLE2.DESTROY_ARGLIST( win_word.args );
  m_r := OLE2.GET_OBJ_PROPERTY(m_par,'Range');
  :main.labelex := to_char(OLE2.GET_OBJ_PROPERTY (m_r, 'Text'));
END;

[SRC oracle]

Но после нажатия на вторую кнопу (первая, ессно уже была нажата) в окошке labelex появляются цифири - 2081228. И после каждого последующего нажатия цифирь увеличивается. А где же собственно сам текст, дорогие товарищи???
Проясните ситуевину, будте ласковы.
9 авг 06, 16:25    [2983638]     Ответить | Цитировать Сообщить модератору
 Re: Forms 6i OLE2  [new]
Кудрявцев Леонид
Guest
Ласковыми не будем... ситуевина хреновая... как хреново написано, так хреново и работает :=) /В конце смайлик!/

m_par := OLE2.INVOKE_OBJ( win_word.Paragraphs, 'Item', win_word.args );

Возможно все правильно, но я бы написал GET_OBJ_PROPERTY. Хотя возможно я и не прав.

to_char(OLE2.GET_OBJ_PROPERTY (m_r, 'Text'));

Что это за хрень такая? Почему не написать просто GET_CHAR_PROPERTY? В результате, ты и получаеш: черти какой объект (ID,указатель), потом переводиш его в строчку и получаеш черти какое число.

Все, что было выше этих строк - не смотрел.
9 авг 06, 17:06    [2983964]     Ответить | Цитировать Сообщить модератору
 Re: Forms 6i OLE2  [new]
fedegor
Member

Откуда:
Сообщений: 10
Э-Э-Э Леня-джан. Зачем ругаться, дорогой. ;-))
Если поставить
m_par := OLE2.GET_OBJ_PROPERTY( Paragraphs, 'Item', args );
то прога благополучно в этой точке вываливается.
А to_char поставил от безысходности, после долгих разных изысканий. Да так и забыл убрать. Но эта чара дела не меняет.
Так как все-таки посмотреть (вывести) содержимое параграфа?
9 авг 06, 17:21    [2984097]     Ответить | Цитировать Сообщить модератору
 Re: Forms 6i OLE2  [new]
fedegor
Member

Откуда:
Сообщений: 10
В догонку еще один вопросик по ентому гребаному OLE
(хотя, может, в консерватории что-то подправить?).

Хочу добавить чего-то в конец n-го параграфа.

[/src]Function Paragraph_AddText (Par_Num in number, Template IN Varchar2)
return boolean
is
m_par ole2.Obj_Type;
m_r ole2.Obj_Type;
begin
  args:=OLE2.CREATE_ARGLIST;
  OLE2.ADD_ARG( args, Par_Num );
  m_par := OLE2.INVOKE_OBJ( Paragraphs, 'Item', args );
  OLE2.DESTROY_ARGLIST( args );
  m_r := OLE2.GET_OBJ_PROPERTY(m_par,'Range');
[SRC oracle]

Далее можно действовать двумя (на самом деле больше) путями.
1-й
[/src]  args:=OLE2.CREATE_ARGLIST;
  OLE2.ADD_ARG( args, 0 ); -- 0=wdCollapseEnd
  OLE2.INVOKE( m_r, 'Collapse', args );
  OLE2.DESTROY_ARGLIST( args );
  OLE2.SET_PROPERTY( m_r, 'Text', Template);
[SRC oracle]

2-й
[/src]  /args:=OLE2.CREATE_ARGLIST;
  OLE2.ADD_ARG( args, Template );
  OLE2.INVOKE (m_r, 'InsertAfter', args);
[SRC oracle]

Но и в том и в другом случае эта хрень добавляет текст
в начало следующего параграфа.
Если попросить поставить в конец последнего, то тут все нормально.
В конце и оказывается.

Такое осчусчение, что когда добавляешь параграф, OLE автоматически
добавляет к предыдущему перевод строки, который становится частью
параграфа. Но как добавить строку (символы) именно к концу параграфа,
без перевода строки?
9 авг 06, 17:41    [2984248]     Ответить | Цитировать Сообщить модератору
 Re: Forms 6i OLE2  [new]
Tolmachov Dmitiry
Member

Откуда: Москва, Пенза
Сообщений: 1520
может поможет сей пример:
PROCEDURE Insert_Paragraph (Text Varchar2, With_Carriage Boolean := TRUE) IS
Begin
		
	-- Установить курсор в конец документа
	arglist := ole2.create_arglist;
	ole2.add_arg(arglist, 6);
	ole2.invoke(Selection, 'EndKey', arglist);
	ole2.destroy_arglist(arglist);	
		
	-- Внести текст
        OLE2.SET_PROPERTY(Selection, 'Text', Text);

	-- перенос каретки
  	Insert_Blank_String(With_Carriage);

Exception when others then Package_Failure;
End;
9 авг 06, 18:05    [2984403]     Ответить | Цитировать Сообщить модератору
 Re: Forms 6i OLE2  [new]
Tolmachov Dmitiry
Member

Откуда: Москва, Пенза
Сообщений: 1520
selection инициализируется как:
Function Init_Word (Visible BOOLEAN := TRUE) return boolean is

	Cant_Init_Word Exception;
	
Begin

	-- Получить дескрипотор приложения
	Application := ole2.create_obj('Word.Application');
 	ole2.set_property(application, 'Visible', Visible);	

	Begin
		Documents := ole2.get_obj_property(application, 'Documents');
		Document := ole2.invoke_obj(Documents, 'Add');
	exception when others then
		Raise Cant_Init_Word;
	end;

       Selection := OLE2.GET_OBJ_PROPERTY(Application, 'Selection');
  
       -- Дескрирторы элементов оформления текста
      Paragraph := ole2.get_obj_property(Selection, 'ParagraphFormat');
      Font := ole2.get_obj_property(Selection, 'Font');

      -- Дескриптор коллекции полей формы
      FormFields := ole2.get_obj_property(Selection, 'FormFields');
      Return True;
  
exception 
	When Cant_Init_Word then	
	
		Set_Application_Property(CURSOR_STYLE, 'DEFAULT');
		Message('Не могу инициализировать MS Word! Возможно он не установлен на компьютере!');
		Message(' ');
		return False;

	when OTHERS then
		Package_Failure;
End Init_Word;
9 авг 06, 18:12    [2984445]     Ответить | Цитировать Сообщить модератору
 Re: Forms 6i OLE2  [new]
Кудрявцев Леонид
Guest
Задаеш очень простые и осмысленные вопросы, но реально нет 10-15 минут, что бы запустить Word, Forms и написать нормальный ответ :=(.
10 авг 06, 10:10    [2986181]     Ответить | Цитировать Сообщить модератору
 Re: Forms 6i OLE2  [new]
Кудрявцев Леонид
Guest
P.S. Мои координаты (MSN Messanger, e-mail) отправил на твой адрес на yahoo.
10 авг 06, 10:16    [2986200]     Ответить | Цитировать Сообщить модератору
 Re: Forms 6i OLE2  [new]
fedegor
Member

Откуда:
Сообщений: 10
Ну да. Все оказалось просто.
Для получения текста нужно применять GET_CHAR_PROPERTY
вместо GET_OBJ_PROPERTY.

И это же свойство используем для добавления текста в конец параграфа.
[/src]Function Paragraph_AddText (Par_Num in number, Template IN Varchar2)
return boolean
is
m_par ole2.Obj_Type;
m_r ole2.Obj_Type;
vc varchar2(2000) := null;
begin
  args:=OLE2.CREATE_ARGLIST;
  OLE2.ADD_ARG( args, Par_Num );
  m_par := OLE2.INVOKE_OBJ( Paragraphs, 'Item', args );
  OLE2.DESTROY_ARGLIST( args );
  m_r := OLE2.GET_OBJ_PROPERTY(m_par,'Range');
  vc := OLE2.GET_CHAR_PROPERTY(m_r,'Text');
  if (substr(vc, length(vc), 1) = chr(13)) then
  	if (length(vc)=1) then
  		vc :=  Template || chr(13);
  	else
  		vc := substr (vc, 1, length(vc)-1) || Template || chr(13);
  	end if;
 	else
 		vc := vc || Template;
  end if;
  OLE2.set_property (m_r, 'text', vc);
  
  ole2.release_obj(m_r);
  ole2.release_obj(m_par);
	return true;
exception
	when others then
  ole2.release_obj(m_r);
  ole2.release_obj(m_par);
	return false;
end Paragraph_AddText;
[SRC oracle]
10 авг 06, 15:24    [2988345]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить