Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
Опыт и разработки пользователей ИРБИС :  ИРБИС Irbis
 
Фрагменты кода
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 19, November, 2004 18:47

По скольку на ЛЫБКОМе Александр Иосифович пообещал, что если кому что надо (я про код), то он с удовольствием поделиться парой строк.
Так вот лично меня интересует, как можно расформатировать запись. Допустим я ее вытащил и лежит она в буфере. Какие функции надо вызвать, что бы получить результат?
Если не сложно, то хотелось бы увидеть вообще список функций что называется от и до (создание ISIS-приложения, полки, вытаскивание записи, ее расформатирование и убийство всего этого). Я примерно представляю, но это примерно и попробовать все руки не доходят.
Правда вот мне больше всего интересно именно расформатирование. Я хочу это в свою программу печати ЧБ вставить. А поскольку запись я буду брать не из базы на прямую, а из буфера виндов, то мне придется ее из формата, в котором она помещается в буфер, преобразовывать в тот формат, который возвращает ISIS-API.
Надеюсь изъяснился понятно.

Re: Фрагменты кода
Пользователь: Михайленко Илья (IP-адрес скрыт)
Дата: 22, November, 2004 09:37

С буфером легко врядли получится. Проблема заключается в том, что внутреннее устройство записи скрыто в Dll (isis32). Мы знаем только набор "ключей" для доступа и совершения операций с этими записями (хендлы приложения и пространства и еще по мелочи). Расформатировать же запись можно несколькими способами. Самый простой - используя isis32.dll (языки форматирования Isis, CIsis). Если Необходимо использовать unifor (язык форматирования irbis) - то расформатировать через isis32dll+format32.dll (функциями первой читать записи, функциями второй расформатировть).
Примеров по работе с isis32.dll достаточно много в инете, а вот с format32.dll - есть только заголовки и общее представление как это должно работать. + проблема с передачей компонента delphi TIniFile в качестве параметра, что делает возможным использование format32 только из Delphi. :-(
Что б работать с буфером (IMSHO) придется идти еще на уровень ниже - разбираться с физическим устройством mst и xrf



Отправка отредактированного (22-11-04 09:49)

Re: Фрагменты кода
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 22, November, 2004 10:13

Привет, Илья.

А в чем заключаются проблемы при формировании своего буфера из исходного?
На сколько я понял из мануала, запись помещается в XML-подобном (по умолчанию) виде в буфер. Следовательно переконвертировать ее из исходного формата ALL в XML-подобный большого труда не составляет. Меня интересует, как потом этот буфер расформатировать? Желательно использовать форматирование ИРБИС (т.е. format32). А поскольку я isis32 использовать не буду (просто не нужно), то можно ли вообще использовать функции format32 без использования isis32? В качестве хенделов можно передать 0?



Отправка отредактированного (22-11-04 10:28)

г. Ярославль

Re: Фрагменты кода
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 22, November, 2004 10:30

А хотя веть не получиться без isis32 работать :(. Сам формат помешается веть в полку. Ладно, кажется начинаю доходить потихоньку, буду пробовать.

Re: Фрагменты кода
Пользователь: Михайленко Илья (IP-адрес скрыт)
Дата: 22, November, 2004 10:32

А, разговор про XML... Почемуто подумалось, что есть желание работать с записью как она лежит в mst... :-)
С XML проще, но без isis32 все равно не обойтись - придется создать новую запись, в которую запихать эту XML. После этого хендлы передаются в format32.dll. Без хендлов ничего не получится. Если установить их в NULL - вывалится с ошибкой.
Плюс к этому, если есть возможность обойтись без unifor - лучше обходится. :-) Работать будет быстрее, плюс независимость от языка программирования, плюс еще не известно как себя поведет в тех или иных случаях связка isis32+format32. У разработчиков Ирбиса, как оказалось, очень большая часть функций isis32 не используется и под это написаны свои модули. От isis32, как я понял, фактически используются только функции чтения/записи в mst.
В среде isis32 можно воспользоваться функцией
long r = IsisRecUpdate(hApp, hSpa, Area);
где в Area лежит XML вида
<tag>FieldData (subfield *)^aSubField a^bsubfield b</tag><cr><lf>
tag - номер поля.

Re: Фрагменты кода
Пользователь: Карауш (IP-адрес скрыт)
Дата: 22, November, 2004 12:23

А вот я не понял вопроса.
Про какой буфер обмена идет речь? Если внутриирбисовский, так он работает только внутри ИРБИСа, и получить доступ к нему - проблема, поскольку нужно, чтобы ИРБИС отдал адрес системной памяти, которую он отвел для этих данных.

Если нужно из ИРБИСа забирать запись в Windows-овский буфер обмена, то такого еще не было. И относительно такого формата нужно еще обсуждать. Но если задача такая, то здается мне, что это уже было при изобретении коммуникативных форматов MARC.

Как мне кажется, идея состояла в том, чтобы брать запись, найденную и отредактированную средствами ИРБИСа, прямо из ИРБИСа. И вставлять куда-либо (в программу).
Или что-то не так?

Re: Фрагменты кода
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 22, November, 2004 12:36

Александр Сергеевич, Вы знаете о механизме печати КК, когда в ини устанавливается параметр KKKOlePriz=0 и KKKPrintProg(кажется)=<свое приложение> и при нажатии на кнопку Печать КК не запускается ОЛЕ-объект, а вызывается свое приложение, а в буфер виндов помещается текущая запись в формате ALL?
Так вот я веду речь про этот механизм. Он у меня используется. Сейчас в шаблоне ЧБ я указываю выводимое поле так [200.a] к примеру, а хочется формат писать. Так вот проблема в том, как мне преобразовать запись в формате ALL из буфера виндов к тому виду, как она используется форматером. Т.е. запехать ее в буфер, возвращаемый функцией IsisRecRead и что еще нужно, чтобы потом этот буфер расформатировать согласно формату.



Отправка отредактированного (22-11-04 13:18)

г. Ярославль

Re: Фрагменты кода
Пользователь: Куделя (IP-адрес скрыт)
Дата: 22, November, 2004 12:37

Ребята, Максим имел в виду (видимо) использование буфера в случае использования параметра KKKOLEpriz=0, когда именно в буфер сбрасывается дамп записи с тэгами полей (это уже обсуждалось в этом огромном :) форуме). Только это не рационально, поскольку, расформатировать этот дамп через format32 не получится. Библиотека работает ТОЛЬКО с хандлом реально запущенного приложения и реально скормленным ей ини-файлом. Так что если есть желание работать именно с буфером - это значит писать свою собственную альтернативу библиотеки расформатирования. Имхо, это уже прямая дорога к собственной АБИС на базе isis. Смелые - шаг вперед :))

Или я неправильно понял про буфер?

Re: Фрагменты кода
Пользователь: Куделя (IP-адрес скрыт)
Дата: 22, November, 2004 12:42

Хотя нет - в принципе можно. Скормить isis32 дамп через IsisRecUpdate, а потом оттуда уж расформатировать. Но это как-то странно, сначала туда, потом оттуда, лишние совершенно телодвижения, однако.

Re: Фрагменты кода
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 22, November, 2004 13:21

Максим, если бы в буфер сбрасывался дамп записи, то вопросов бы не возникло, но там не дамп, а запись в формате ALL. В общем, я кажися все понял. Спасибо за помощь. Когда получиться, покажу что натворил :).

Re: Фрагменты кода
Пользователь: Михайленко Илья (IP-адрес скрыт)
Дата: 22, November, 2004 14:04

Итого - еще хуже. :-)
Нужно переформатировать тип All в XML, и потом развлекаться с isis32, при этом создавая новые хендлы приложения, полки, а заодно и новую запись (не сохраняя ее).
Проблема появляется еще и такого характера: в формате ALL не содержится информации о БД, откуда эта запись взята. Т.е. еще и локальную пустую БД придется создать, в которой никогда не будет ни одной записи - только для работы форматера isis. irbis же и вовсе использовать не получится, т.к. требуется передавать еще и ini-файл, в контексте которого Ирбис запущен (либо использовать свой, что IMSHO, будет не совсем корректно.).
В общем, с первого взгляда простая программа превращается в нечто весьма серьезное и трудно преодолимое. (при условии, что мною правильно понята исходная задача)
Может, в OLE передается не только этот буфер? Или есть возможность внутри Ирбиса расформатировать этот буфер перед отправкой?
Действительно хотелось бы посмотреть на способ решения.

Re: Фрагменты кода
Пользователь: Бродовский (IP-адрес скрыт)
Дата: 22, November, 2004 15:35

Для того чтобы работать с БД ИРБИС32 из собственных приложений, необходимо использовать ISIS32.DLL (для логического доступа к записям и полям) и FORMAT32.DLL (для форматирования с применением UNIFOR, при этом сам format32.dll использует isis32.dll) - никакие иные варианты неприменимы (если не считать создания собственного доступа)
Могу написать примерный код на ПАСКАЛе, который демонстрирует доступ к записи и ее форматирование...
По поводу использования в FORMAT32.DLL дельфийского типа TIniFile - такой параметр используется только в одной функции SetIniFmt, ее можно не использовать, правда при этом НЕ БУДУТ выполняться UNIFOR, связанные с обращением к другой (отличной от текущей) БД...

Re: Фрагменты кода
Пользователь: Копытков (IP-адрес скрыт)
Дата: 27, December, 2004 15:12

Можно ли где-нибудь увидеть код расформатирования записи с использованием format32.dll, и вообще назначение функций библиотеки format32 и их параметров?

Re: Фрагменты кода
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 26, March, 2005 12:03

format32.pas с объявлениями функций лежит на открытом ФТП... или на моем хоумпаге :)



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