Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
АРМ Администратор :  ИРБИС Irbis
 
&unifor('+8...)
Пользователь: goirvi (IP-адрес скрыт)
Дата: 05, June, 2007 13:24

Добрый день! Прошу помощи. Ситуация следующая: имеется текстовый файл(*.txt). Данные из него нужно поместить в поле 922 (статьи из журнала), предварительно их обработав. Пытаюсь сделать это при помощи &unifor(‘+8…).
DLL создала в Delphi6. Процедура DLL работает, если вызвать ее из клиентского приложения, созданного в Delphi6. Пробую вызвать ее в редакторе форматов через &unifor(‘+8…). Результат : при наличии стандартной процедуры Reset(Fi) /эта процедура как раз открывает исходный текстовый файл для чтения/ unifor не работает. Убираю Reset - работает. Подскажите, пожалуйста, что тут можно сделать. Работаем в Ирбис-64 версия 2006.1. С уважением, Гончарова Ирина.

Re: &unifor('+8...)
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 05, June, 2007 19:50

А вы полный формат приведите.

Re: &unifor('+8...)
Пользователь: goirvi (IP-адрес скрыт)
Дата: 06, June, 2007 08:43

Собственно, формат выглядит так: &unifor('+8SodergJur,Soderg1,',&unifor("Q"v200^a)' 'v936' 'v934)
Все происходит внутри функции Soderg1. Так вот если там присутствует этот самый Reset, то на выходе ничего нет.

Re: &unifor('+8...)
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 06, June, 2007 17:41

Ну тут просто код функции не правильный. Юнифор тут совершенно не причем.

Re: &unifor('+8...)
Пользователь: Денисова Лариса (IP-адрес скрыт)
Дата: 07, June, 2007 16:14

По-моему, для Delphi надо ставить * после "8" в &unifor(‘+8. Попробуйте.

Re: &unifor('+8...)
Пользователь: goirvi (IP-адрес скрыт)
Дата: 09, June, 2007 12:32

Дело в следующем. При передаче данных из Ирбис в функцию DLL меняется кодировка русских букв. Например,строка
'животноводство россии.txt'
воспринимается функцией как
'PпPёPIPsC,PSPsPIPsPѓCЃC,PIPs CЂPsCЃCЃPёPё.txt'
Видно, что это и есть 'животноводство россии.txt', только в другой кодировке. Естественно, что файл с таким измененным именем отсутствует.
Проставление * после 8 не помогает. Со звездочкой результат ещё хуже:
[]ш[].txt'



Редактировано 1 раз. Последний раз 09.06.2007 12:43 пользователем goirvi.

Re: &unifor('+8...)
Пользователь: ochagova (IP-адрес скрыт)
Дата: 09, June, 2007 13:03

Если вы в ИРБИС-64, то, конечно, все , что вы берете из БД (v200^a), будет в кодировке UTF8. Вы должны это учитывать в своей функции.

Re: &unifor('+8...)
Пользователь: goirvi (IP-адрес скрыт)
Дата: 15, June, 2007 12:55

Спасибо всем за ответы. Сделала перекодировку, теперь файл открывается. Но вот еще вопрос :

Допустим, в некотором РЛ я хочу воспользоваться режимом ввода 12 (ввод через обращение к внешнему файлу); ДОП.ИНФ. ставлю ‘2’ с тем, чтобы в поле загрузилось содержимое файла. Если поле неповторяющееся – все замечательно. Если поле повторяющееся, то все содержимое файла оказывается в первом повторении. Вопрос: какой разделитель между повторениями поля я должна проставить во внешнем файле, чтобы все повторения встали на свое место?

С уважением, Гончарова Ирина.



Редактировано 2 раз. Последний раз 20.06.2007 14:18 пользователем goirvi.

Re: &unifor('+8...)
Пользователь: Alio (IP-адрес скрыт)
Дата: 25, June, 2007 11:52

goirvi написал(а):
-------------------------------------------------------
> Спасибо всем за ответы. Сделала перекодировку,
> теперь файл открывается. Но вот еще вопрос :
>
> Допустим, в некотором РЛ я хочу воспользоваться
> режимом ввода 12 (ввод через обращение к внешнему
> файлу); ДОП.ИНФ. ставлю ‘2’ с тем, чтобы в поле
> загрузилось содержимое файла. Если поле
> неповторяющееся – все замечательно. Если поле
> повторяющееся, то все содержимое файла оказывается
> в первом повторении. Вопрос: какой разделитель
> между повторениями поля я должна проставить во
> внешнем файле, чтобы все повторения встали на свое
> место?
В каждое повторение надо вводить отдельный файл...

>
> С уважением, Гончарова Ирина.

Re: &unifor('+8...)
Пользователь: goirvi (IP-адрес скрыт)
Дата: 28, June, 2007 06:13

Спасибо.

Re: &unifor('+8...)
Пользователь: iLq (IP-адрес скрыт)
Дата: 04, October, 2007 16:26

заметил особенность запуска функций из dll:
они "запускаются" на сервере: сообщения типа messagebox появляются на сервере. пути при копировании "С:\\Темр" тоже берутся с сервера, а не с локальной машины ...
Это так и должно быть?
Для того, чтобы сообщения появлялись на локальной машине необходимо использовать режим ввода 14? Для режима ввода библиотеку надо держать на каждой локальной машине в папке с ирбисом?

Re: &unifor('+8...)
Пользователь: Alio (IP-адрес скрыт)
Дата: 05, October, 2007 11:18

Для &uf('+8...)
DLL надо устанавливать - в общем случае - и на сервере и у клиента, поскольку в зависимости от ситуации формат может выполняться и на сервере и у клиента...

Re: &unifor('+8...)
Пользователь: iLq (IP-адрес скрыт)
Дата: 08, October, 2007 13:52

У меня длл вызывалась из автоин.гбл - и сообещения MessageBox вызывались на сервере.

Сделал сейчас через режим ввода 14. Но столкнулся с такой проблемкой, как передача кириллицы через buf2.

функции типа StringToWideChar возвращают WideChar, а в функциях dll оговаривалось, что buf2 имеет тип PChar.
Подскажите, плиз, как мне это можно сделать?

Re: &unifor('+8...)
Пользователь: Alio (IP-адрес скрыт)
Дата: 08, October, 2007 14:30

iLq написал(а):
-------------------------------------------------------
> У меня длл вызывалась из автоин.гбл - и сообещения
> MessageBox вызывались на сервере.
Что это за MessageBox, о чем сообщения?


>
> Сделал сейчас через режим ввода 14. Но столкнулся
> с такой проблемкой, как передача кириллицы через
> buf2.
>
> функции типа StringToWideChar возвращают WideChar,
> а в функциях dll оговаривалось, что buf2 имеет тип
> PChar.
> Подскажите, плиз, как мне это можно сделать?
Данные передаются и принимаются в UTF8 (это обычный PChar)

Re: &unifor('+8...)
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 08, October, 2007 14:36

Александр Иосифович. Для того, чтобы с юникодом работать удобнее и привычнее было, его проще конвертнуть сначала в win, затем после всех манипуляций в UTF. Или вы как-то по другому со строками работаете?
Приведите, пожалуйста, несколько примеров. Просто какие-нить элементарные выдержки из юнифора :)

Re: &unifor('+8...)
Пользователь: iLq (IP-адрес скрыт)
Дата: 08, October, 2007 14:51

> > MessageBox вызывались на сервере.
> Что это за MessageBox, о чем сообщения?
Я планировал спрашивать пользователей при определнных случаях - хотят они продолжать или нет: if MessageBox(0,'продолжить?,'вопрос',MB_YESNO) = IDYES then ... ;

> Данные передаются и принимаются в UTF8 (это
> обычный PChar)
но когда я делаю StrCopy(buf2,'привет');
затем опять же делаю эхо с помощью MessageBox(0,buf2,'11',0);
и мне показывает то. что надо и кириллицу и не кириллицу, но вот Ирбису меня ничего не возвращается :( (без кириллицы все передается нормально).

Или например меняем в test_dll в функции Test_Function2 строчку:
StrLCopy(buf2,Pchar(String(buf1)+'2222'),size);
на
StrLCopy(buf2,Pchar(String(buf1)+'привет'),size);
и её вызов перестает что-либо возвращать :(
Подскажите, плиз, как передать в ирбис кириллицу через buf2 ?



Редактировано 1 раз. Последний раз 08.10.2007 15:37 пользователем iLq.

Re: &unifor('+8...)
Пользователь: Alio (IP-адрес скрыт)
Дата: 08, October, 2007 17:51

iLq написал(а):
-------------------------------------------------------
> > > MessageBox вызывались на сервере.
> > Что это за MessageBox, о чем сообщения?
> Я планировал спрашивать пользователей при
> определнных случаях - хотят они продолжать или
> нет: if
> MessageBox(0,'продолжить?,'вопрос',MB_YESNO) =
> IDYES then ... ;
Эта идея абсолютно не приемлема. АВТОВВОД не может иметь диалоговый характер - тем более что он выполняется на сервере.

>
> > Данные передаются и принимаются в UTF8 (это
> > обычный PChar)
> но когда я делаю StrCopy(buf2,'привет');
> затем опять же делаю эхо с помощью
> MessageBox(0,buf2,'11',0);
> и мне показывает то. что надо и кириллицу и не
> кириллицу, но вот Ирбису меня ничего не
> возвращается :( (без кириллицы все передается
> нормально).
>
> Или например меняем в test_dll в функции
> Test_Function2 строчку:
> StrLCopy(buf2,Pchar(String(buf1)+'2222'),size);
> на
> StrLCopy(buf2,Pchar(String(buf1)+'привет'),size);
> и её вызов перестает что-либо возвращать :(
> Подскажите, плиз, как передать в ирбис кириллицу
> через buf2 ?
Простите, но у меня такое впечатление, что Вы не вполне понимаете, что такое UTF8...
Как Вы работаете с UTF8? Какими функциями?

Re: &unifor('+8...)
Пользователь: iLq (IP-адрес скрыт)
Дата: 08, October, 2007 18:11

согласен. не понимаю. не работаю с УТФ8. впринципе у меня вопрос и есть - как мне передать кириллицу в ирбис - то есть как мне работать с утф8?
извиняюсь за ламерский подход ...

Re: &unifor('+8...)
Пользователь: Alio (IP-адрес скрыт)
Дата: 08, October, 2007 19:24

Все зависит от того, на чем Вы работаете, т.е. программируете...

Re: &unifor('+8...)
Пользователь: iLq (IP-адрес скрыт)
Дата: 08, October, 2007 22:01

Delphi 7.0

Re: &unifor('+8...)
Пользователь: Alio (IP-адрес скрыт)
Дата: 09, October, 2007 10:40

И в чем же проблема. Неужели Вы не видите в Delphi 7 функций
Utf8ToAnsi и AnsiToUtf8

Re: &unifor('+8...)
Пользователь: iLq (IP-адрес скрыт)
Дата: 09, October, 2007 11:19

клево. работает. Спасибо большое, Александр Иосифович.
Опять же извиняюсь за неграмотность. я профан в Делфи.

Re: &unifor('+8...)
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 09, October, 2007 14:17

А если не секрет, то вы тоже этими функциями пользуетесь? Ведь это не совсем корректно. В случае присутствия не переводимых в анси символов, они потеряются (теоретически, не проверял). Вообще этими функциями пользоваться можно только локально для себя, но никак не в случае широкого распространения библиотеки.

Re: &unifor('+8...)
Пользователь: Alio (IP-адрес скрыт)
Дата: 09, October, 2007 16:10

...разумеется, надо работать с WideString и в этом случае применять
WideStringToUTF8 и Utf8ToWideString

Re: &unifor('+8...)
Пользователь: iLq (IP-адрес скрыт)
Дата: 22, October, 2007 09:24

Не совсем понятно для меня поведение функции Utf8ToAnsi() в след. примере:

PromptForFileName(FName) //выбор файла
Ext:=Copy(ExtractFileName(FName),Length(ExtractFileName(FName))-3,4); // расширение файла
MessageBox(0,PChar(FName),PChar(Ext),0); //вывод сообщения - работает
StrCopy(buf3,PChar(UTF8ToAnsi(String(buf1)))); //копируем в buf3 переведенный в анси buf1.
MessageBox(0,PChar(FName),PChar(Ext),0); //после перевода из утф8 в анси уже FName не выводится, а Ext нормально выводится..

Может кто-нить прояснить для меня - что в данном случае я делаю не так?

Re: &unifor('+8...)
Пользователь: iLq (IP-адрес скрыт)
Дата: 29, October, 2007 15:55

Кто-нибудь делал уже что-нибудь через dll c передачей кириллицы??
Все ли нормально у Вас работает? пользовались ли вы функцией UTF8ToAnsi ? Не замечалось ли таких непонятных последствий, как отмеченные в предыдущем посте?

Re: &unifor('+8...)
Пользователь: iLq (IP-адрес скрыт)
Дата: 24, December, 2007 11:54

Сейчас все работает. Извиняюсь за предыдущие панические сообщения :)



Извините, только зарегистрированные пользователи могут писать в этом форуме.
This forum powered by Phorum.