powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Oracle Forms 6i и UTF-8
5 сообщений из 5, страница 1 из 1
Oracle Forms 6i и UTF-8
    #32627149
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто нибудь Forms 6i (patch16, 6.0.8.25.2) в режиме UTF-8 юзает с русскими буквами? Какие есть глюки, насколько это серьезно? Пока просто запустил наш проект на UTF-8, в результате в нескольких местах обнаружил глюки.

Если кто работает в UTF-8, просьба поделиться опытом. Какой patch лучше взять? Если какие еще глюки и насколько они серьезны, как обходили. Если у кого опыт работы одних и тех-же форм в режиме CL8MSWIN1251 и UTF-8, насколько "перенос" форм между charset'ами безопасен/безглючен? В каком режиме лучше вести разработку 1251 или UTF-8. Достаточно ли просто перекомпиляции всего проекта (через ifcmp60.exe) перед передачей заказчику или жалательны еще какие-нибудь телодвижения?

P.S. В UTF-8. Весь русский текст при редактировании Program Unit'ах в Builder'е стал отображаться через символ. Это у меня Builder (6.0.8.25.2) глючит или по жизни так и должно быть? На Forms 6.0.5.0.2 с UTF-8 такого эффекта вроде не было. Это нормально или у меня проект сконвертировался некоректно (вроде на новых формах тот-же эффект)?
...
Рейтинг: 0 / 0
Oracle Forms 6i и UTF-8
    #32635218
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто нибудь Subj юзает?

Буду очень счастлив, если кто-то сможет по ICQ на пару простых вопросов ответить.
...
Рейтинг: 0 / 0
Oracle Forms 6i и UTF-8
    #32639922
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
up.
...
Рейтинг: 0 / 0
Oracle Forms 6i и UTF-8
    #32706635
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо Oracle Support в Москве. Все вроде работает.

1. Forms 6i + patch 16 работает с UTF8 стабильно.
2. Для запуска под UTF8 достаточно просто перекомпиляции проекта. Сами программы и формы (тексты) могут быть в кодировке 1251.
3. Существует кучка багов, которые очень мешают жизни. Workaround'ы см. ниже.
4. Куча самописных C функций и пакеты TEXT_IO, DDE etc. - конечно сглючили, как и предполагалось с самого начала.

Весь код в виде одного архива см.: www.pravdin.spb.ru/tmp/utf-8/workaround.zip

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
 1 . MESSAGE build-ins. Bug N  3484481 

Строку состояния можно "стереть" из программы принудительно,
передав ф-ции Message длинную строку из символов CHR( 160 ).

CHR( 160 ) -  В кодировке Windows  1251  - non break space, в
кодировке UTF- 8  - это некорректный символ, но Message
build-in обрабатывает его как Non break space. Строка из
 2000  штук CHR( 160 ) затирает Status line во всех режимах:
CL8MSWIN1251 и UTF8 - без всяких последствий

Т.е. вместо Message build-ins можно воспользоваться ф-цией
UTF.ShowMes. См. текст пакета в конце письма.

 2 . SET_MENU_ITEM_PROPERTY

Menu можно "перевысветить" принудительно. Workaround'ы различны
для Main menu (в верху экрана) и для Popup menu в формах.

Для Popup menu: вроде просто достаточно последовательность команд:

SET_MENU_ITEM_PROPERTY(
  menuitem_name,
  LABEL,
  GET_MENU_ITEM_PROPERTY( menuitem_name, LABEL )
  );

Что бы пункт заново высвечивался корректно.

Для Main menu:

Меню "перевысвечивается" когда происходит навигация мужду форм.
Для того, что бы обойти проблему нужно:

I. Создать форму REDRAW_MENU как описано ниже

1. Создать пустую форму REDRAW_MENU.FMB
2. Переменовать окно WINDOW1 в REDRAW_MENU_WINDOW. Форма должна
содержать одно окно REDRAW_MENU_WINDOW.
3. Создать блок с navigatable item'ом (например
Text item BLOCK1.ITEM1)
 4 . Добавить в Forms'у триггер PRE-FORM со следующим содержанием:

DECLARE
  s varchar2(4000);
  t timer;
  f FormModule;
BEGIN
  s := :GLOBAL.CALLER;
  f := FIND_FORM( s );
  IF ID_NULL( f ) THEN
    EXIT_FORM;
  END IF;
  HIDE_WINDOW( 'REDRAW_MENU_WINDOW' );
  RAISE FORM_TRIGGER_FAILURE;
END;

II. Создать библиотеку с пакетом UTF (текст см. в конце письма),
добавить ее ко всем формам и использовать UTF.SetMenuItemPropery
вместо SET_MENU_ITEM_PROPERTY:

III. Во все Forms'ы проекта добавить триггер
WHEN-TIMER-EXPIRED со следующим содержанием:

DECLARE
  s varchar2( 100 );
BEGIN
  s := GET_APPLICATION_PROPERTY( TIMER_NAME );
  UTF.ProcessTimer( s );
END;

 3 . Ошибка с SELECT_ALL build-ins. Bug  3710017 

Workaround:
Создать C-функцию со следующим содержанием и
вызывать ее из Forms вместо SELECT_ALL

#define FUNC_SPEC __declspec(dllexport)

extern "C" FUNC_SPEC void _cdecl SelectAll( HWND hWnd )
{
  WPARAM wParam;
  LPARAM lParam;

  if ( ! hWnd  )
  {
    hWnd = ::GetFocus();
  }

  ::SendMessage( hWnd, EM_SETSEL,  0 , - 1  );
}

Содержание пакета UTF

 --- PACKAGE SPECIFICATION 

PACKAGE utf IS

codepage varchar2( 20 );
 -- Non break space char. 
nbsp varchar2( 10 );

PROCEDURE ProcessTimer( timer_name varchar2);

PROCEDURE ShowMes( s varchar2, n number := ACKNOWLEDGE );

PROCEDURE SetMenuItemProperty(
        menuitem_name  varchar2,
        property NUMBER,
        val NUMBER
);

PROCEDURE SetMenuItemProperty(
        menuitem_name VARCHAR2,
        property NUMBER,
        val VARCHAR2
);
 /*
PROCEDURE SelectAll( itm varchar2 := '' );
*/ 
END;

 --- PACKAGE BODY 

PACKAGE BODY UTF IS

futil_libhandle ora_ffi.libHandleType;
SelectAll_fhandle ora_ffi.funcHandleType;

 /*
** Данный пакет содержит Workaround
** для ряда встроенных Build-Ins которые
** некоректно работают в режиме Utf8
** или с "новым" Forms (path 16)
*/ 

 -- This function does the same as MESSAGE build-in 
 -- (bug N 3484481) 
PROCEDURE ShowMes( s varchar2, n number ) IS
  tmp varchar2( 4000 );
BEGIN
  IF codepage='UTF8' THEN
     -- This seems to be incorect, because Non Break Space 
     -- has the other code in Unicode. But this works. 
    tmp := LPAD( chr( 160 ),  2000 , chr( 160 ) );
    Message( tmp, NO_ACKNOWLEDGE );
    SYNCHRONIZE;
  END IF;
  Message( s, n );
END ShowMes;

 -- The following functions are for internal use only. 
PROCEDURE CreaTimer( timer_name varchar2 ) IS
  t timer;
BEGIN
  t := FIND_TIMER( timer_name );
  IF ID_NULL( t ) THEN
    t := CREATE_TIMER( timer_name,  1 , NO_REPEAT );
  END IF;
END CreaTimer;

PROCEDURE ProcessTimer( timer_name varchar2) IS
  s varchar2( 2000 );
  f FormModule;
BEGIN
  IF codepage='UTF8' THEN
    IF timer_name = 'REDRAW_MENU' THEN
      COPY( NAME_IN( 'SYSTEM.CURRENT_FORM' ), 'GLOBAL.CALLER' );
      f := FIND_FORM( 'REDRAW_MENU' );
      IF ID_NULL( f ) THEN
        OPEN_FORM( 'REDRAW_MENU' );
      ELSE
        GO_FORM( f );
      END IF;
    END IF;
  END IF;
END ProcessTimer;

 -- This function does the same as SET_MENU_ITEM_PROPERTY build-in  
PROCEDURE SetMenuItemProperty( 
  menuitem_name  VARCHAR2,
  property NUMBER,
  val NUMBER
) IS
  tmp varchar2( 4000 );
BEGIN
  SET_MENU_ITEM_PROPERTY( menuitem_name, property, val );               
  IF codepage='UTF8' THEN
    CreaTimer( 'REDRAW_MENU' );
    SET_MENU_ITEM_PROPERTY(
      menuitem_name,
      LABEL,
      GET_MENU_ITEM_PROPERTY( menuitem_name, LABEL )
     );
  END IF;
END SetMenuItemProperty;

 -- This function does the same as SET_MENU_ITEM_PROPERTY build-in  
PROCEDURE SetMenuItemProperty( 
  menuitem_name  VARCHAR2,
  property NUMBER,
  val VARCHAR2
) IS
BEGIN
  SET_MENU_ITEM_PROPERTY( menuitem_name, property, val );               
  IF codepage='UTF8' THEN
    CreaTimer( 'REDRAW_MENU' );
    SET_MENU_ITEM_PROPERTY(
      menuitem_name,
      LABEL,
      GET_MENU_ITEM_PROPERTY( menuitem_name, LABEL )
     );
  END IF;
END SetMenuItemProperty;

PROCEDURE ff_SelectAll(
  fhandle Ora_FFi.funchandletype,
  hWnd pls_integer
);
PRAGMA interface( C, ff_SelectAll,  11265  );

 -- This function doesn the same as SELECT_ALL 
 -- build-in. SELECT_ALL doesn't work with
-- the patch 16. (bug N 3710017)
PROCEDURE SelectAll( itm varchar2 ) IS
BEGIN
  IF itm is not NULL then
    GO_ITEM( itm );
    SYNCHRONIZE;
  END IF;
  ff_SelectAll( SelectAll_fhandle, 0 );
END SelectAll;

PROCEDURE Init IS
  s varchar2(100);
  pos number;
BEGIN
  TOOL_ENV.GetVar( 'NLS_LANG', s );
  pos := instr( s, '.' );
  codepage := substr( s, pos +1 );
  IF codepage='UTF8' THEN 
    nbsp := chr(  49824  );
  ELSE
    nbsp := chr(  160  );
  END IF;
 /*
  -- Register SelectAll function from FUTILS.DLL
  IF Ora_Ffi.Is_Null_Ptr( futil_libhandle ) THEN
    futil_libhandle:=ora_ffi.load_library(NULL,'futils.dll');
    -- SelectAll
    SelectAll_fhandle := Ora_Ffi.Register_Function
      ( futil_libhandle, 'SelectAll', Ora_Ffi.C_Std );
    Ora_Ffi.Register_Parameter
      (SelectAll_fhandle, Ora_Ffi.C_INT );
  END IF;
*/ 
END Init;

BEGIN
  Init;
END;
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Oracle Forms 6i и UTF-8
    #33559759
Фотография Gabit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где можно скачать этот - patch 16.
Металинке что-то не нашел - 3484481.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Oracle Forms 6i и UTF-8
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]