Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
Опыт и разработки пользователей ИРБИС :  ИРБИС Irbis
 
Страницы: 12>>
Страница: 1 из 2
АБИС ИРБИС + Delphi помогите разобраться
Пользователь: denned (IP-адрес скрыт)
Дата: 28, June, 2010 09:15

Здравствуйте, решил попробовать свои силы в разработке клиентской части для Ирбиса на delphi7, сразу появились несколько вопросов на которых я не нашел ответы. Подключил irbis_client.dll, прочитал в документации функции этой библиотеки.
Не могу зарегестрироватся на сервере с помощью функции IC_reg
ВЗЯТО ИЗ ДОКУМЕНТАЦИИ

function IC_reg(aserver_host: Pchar;
aserver_port: Pchar;
arm:char;
user_name,password: Pchar;
var answer: Pchar; abufsize: integer):integer;

Исходные данные:
aserver_host – адрес сервера в числовом виде (например 192.168.5.140).
aserver_port – рабочий порт сервера (6666).
arm – тип клиента; принимает значения:
IRBIS_READER – АРМ Читатель;
IRBIS_CATALOG – АРМ Каталогизатор;
IRBIS_COMPLECT – АРМ Комплектатор;
IRBIS_BOOKLAND – АРМ Книговыдача;
IRBIS_ADMINISTRATOR – АРМ Администратор;
IRBIS_BOOKPROVD – АРМ Книгообеспеченность.
user_name – имя пользователя, зарегистрированного на сервере.
password – пароль пользователя.
answer – выходной буфер для возвращаемых данных.
abufsize - размер выходного буфера.

переменная arm имеет формат char, тут написано что она принимат значения IRBIS_READER,IRBIS_CATALOG. Как такое может быть??
Приведите пример регистрации на делфи.

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: denned (IP-адрес скрыт)
Дата: 28, June, 2010 09:56

Разобрался про переменную arm, оказвается каждый тип имеет собственный код, например, IRBIS_CATALOG = 'C'.
Осталось как нибудь заставить эту функцию работать, как обьявить answer и abufsize. При вызове IC_reg появляеться ошибка записи в буфер, в ячейку указанную abufsize.
как обьявить переменную answer как буфер размером abufsize???

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: denned (IP-адрес скрыт)
Дата: 28, June, 2010 11:09

нашел как обьявляеться буфер в Ирбисе

type TBuffer = packed record
size:integer;
capacity:integer;
data:PChar;
end;
type PBuffer = ^TBuffer;

Таким же образом обьявил у себя, все равно выскакивает ошибка при вызове функции. "Access violation at address 00333c27 in module irbis64_client.dll, read 0f address 4280b400" ....

вот пример моего кода

var
request : integer; //код возвращаемый функцией
host, port, user, password : Pchar;
u_type : char;
answer : PBuffer;
begin
host := '127.0.0.1';
port := '6666';
u_type := 'C';
answer.size := 5000;
user := 'MASTER';
password := 'MASTERKEY';
request := IC_reg(host, port, u_type, user, password, answer.data, answer.size);
edit1.Text := IntToStr(request);

end;

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 28, June, 2010 11:47

Ну так раз у вас PBuffer - указатель, то сначала нужно выделить память под структуру и присвоить вашей переменной указатель на выделенную область памяти.
К тому же packed record вам тут совершенно не нужен. Попробуйте так
var
request : integer; //код возвращаемый функцией
host, port, user, password : Pchar;
u_type : char;
answer : PChar;
size: integer;
begin
host := '127.0.0.1';
port := '6666';
u_type := 'C';
size := 5000;
user := 'MASTER';
password := 'MASTERKEY';
request := IC_reg(host, port, u_type, user, password, answer, size);
edit1.Text := 'Получено '+IntToStr(request)+' байт. Ответ: '+answer;
end;

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 28, June, 2010 11:54

Если же вы все-таки хотите оставить вашу структуру, то сначала создайте ее

var
...
answer : PBuffer;
begin
GetMem(answer,sizeof(TBuffer));
...
// и не забываем освобождать память после того, как структура уже не нужна
FreeMem(answer);
end;

UPD. packed record для такой небольшой структуры как-то совсем не серьезно. Выравнивать нечего. К тому же переменных этого типа всего одна.



Редактировано 1 раз. Последний раз 28.06.2010 12:10 пользователем Панев Максим.

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: denned (IP-адрес скрыт)
Дата: 28, June, 2010 12:48

Панев Максим написал(а):
-------------------------------------------------------
> Ну так раз у вас PBuffer - указатель, то сначала
> нужно выделить память под структуру и присвоить
> вашей переменной указатель на выделенную область
> памяти.
> К тому же packed record вам тут совершенно не
> нужен. Попробуйте так
>
> var
> request : integer; //код возвращаемый функцией
> host, port, user, password : Pchar;
> u_type : char;
> answer : PChar;
> size: integer;
> begin
> host := '127.0.0.1';
> port := '6666';
> u_type := 'C';
> size := 5000;
> user := 'MASTER';
> password := 'MASTERKEY';
> request := IC_reg(host, port, u_type, user,
> password, answer, size);
> edit1.Text := 'Получено '+IntToStr(request)+' <-------------
> байт. Ответ: '+answer;
> end;
>


Функция возвращает 0 если регистрация прошла успешно, в а answer присвоиться информация о пользователе, тут это не важно. Как вы написали уже делал изначально, ошибка чтения из адреса памяти который равен размеру буфера, например abufsize = 5 то ошибка чтения будет по адресу 00000005.

Ошибка была на ранней стадии ))
Оказвается я подключал библиотеку не правильно
function IC_reg(...): integer; external 'irbis64_client.dll' name 'IC_reg';

Заработало когда поствил stdcall

function IC_reg(....): integer; stdcall; external 'irbis64_client.dll' name 'IC_reg';

Все ваши варианты работают, лучше конечно использовать answer: Pchar.
Теперь буду разбираться дальше, Большое спасибо за советы

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: denned (IP-адрес скрыт)
Дата: 30, June, 2010 09:36

Появилась еще одна проблема при выполнении функций (например IC_reg). Когда переменная buffer маленькое число, то выходит ошибка, что буфер слишком мал(-4), когда ставлю больше то вылетает ошибка чтения памяти(как в начальном посте). Числовые переменные возвращаемые функциями принимаются нормально, а вот с Pchar'ом проблемы. Пробовал как через GetMem так и просто обьявление переменной Pchar.

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: denned (IP-адрес скрыт)
Дата: 30, June, 2010 09:48

)) рано написал, проблема решилась, ошибка была когда переменную обьявлял через PBuffer. Выделил память переменной Pchar и все заработало.

var
answer: Pchar;
buffer: Integer;
begin
buffer := 5000;
GetMem(answer,buffer);
IC_read(DbName, 54,0, answer, buffer);
...
FreeMem(answer);
end;

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: denned (IP-адрес скрыт)
Дата: 06, July, 2010 09:13

Здравствуйте, сейчас проблема в следующем, перешел на CodeGear 2009(Delphi 2009) подключаю библиотеку, при выполнении функции регистрации, пишет что "сервер не отвечает" и функция регистрации выводит -1(общая ошибка), на Delphi 7 и соединятьеся нормально, в чем может быть причина

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: denned (IP-адрес скрыт)
Дата: 26, August, 2010 08:07

Здравствуйте,пишу программу для сектора регистрации, помогите разобраться. Я из программы соединяюсь с сервером и могу работать с читателями(добавление, удаление, редактирование). фотография читателя храниться в datai/rdr. как мне через программу загрузить туда фотографии, есть ли для этого функции из irbis64_client.dll?? Или надо открыть доступ к этой папке, туда скидывать фотку, а потом в поле 950 (фотография) просто писать имя файла. пишу на delphi 7

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 26, August, 2010 08:31

Именно так, как вы предположили.

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: Alio (IP-адрес скрыт)
Дата: 26, August, 2010 09:59

denned написал(а):
-------------------------------------------------------
> Здравствуйте,пишу программу для сектора
> регистрации, помогите разобраться. Я из программы
> соединяюсь с сервером и могу работать с
> читателями(добавление, удаление, редактирование).
> фотография читателя храниться в datai/rdr. как мне
> через программу загрузить туда фотографии, есть ли
> для этого функции из irbis64_client.dll??
Для этого служит функция
IC_getbinaryresourse


Или надо
> открыть доступ к этой папке, туда скидывать фотку,
> а потом в поле 950 (фотография) просто писать имя
> файла. пишу на delphi 7

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: denned (IP-адрес скрыт)
Дата: 26, August, 2010 11:33

IC_getbinaryresourse сливает файл с сервера, а нужно наоборот загрузить его туда. пока попробую через расшару. жду ваших вариантов решения этой задачи. спасибо

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: denned (IP-адрес скрыт)
Дата: 08, September, 2010 11:57

Здравствуйте. Помогите разобраться в функции поиска IC_search
ФИО храниться в словаре 'K', функция возвращает 0. в answer ничего нету
вот пример кода

IC_search('RDR','K=Иванов$',0,0,'',answer,buffer);

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: Alio (IP-адрес скрыт)
Дата: 09, September, 2010 09:21

Поисковое выражение надо заключит в двойные кавычки.
Во-вторых, в какой БД есть такой префикс для ФИО - К=?

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: denned (IP-адрес скрыт)
Дата: 09, September, 2010 11:41

RDR.fst

10 8 '/K=/',v10
11 8 '/K=/',v11
12 8 '/K=/',v12
...
30 0 "K="v30/"K="v10," "v11," "v12

10,11,12 поля ФИО, 'К' - словарь, я как понимаю должен искать в словаре К.

С ирбисом еще плохо ознакомлен, попытался сделать как в приложении 1.

как лучше сделать поиск, можно пример
сраврение должно идти по фио базы RDR

IC_search('RDR','???',0,0,'',answer,buffer);

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: iLq (IP-адрес скрыт)
Дата: 10, September, 2010 10:39

denned написал(а):
-------------------------------------------------------
> IC_getbinaryresourse сливает файл с сервера, а
> нужно наоборот загрузить его туда. пока попробую
> через расшару. жду ваших вариантов решения этой
> задачи. спасибо

Как вариант - заливать фотки через шару с именем - номер читательского билета. Тогда в записи читателя ничего дополнительно вводить не потребуется.

С уважением, Лазарев Илья (Научная Библиотека ВятГУ)

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: denned (IP-адрес скрыт)
Дата: 13, September, 2010 15:10

Фотки на сервер кидаю следующим образом.
1) Фотографируется читатель
2) Дальше фотография кодируется в 16 HEX
3) и отправляется в виде текста на сервер в 953 поле.

программа думает около 1-3 с и все готово.

конечно работает немного дольше, но не требует расшары папки в сеть

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: iLq (IP-адрес скрыт)
Дата: 13, September, 2010 17:00

denned написал(а):
-------------------------------------------------------
> 2) Дальше фотография кодируется в 16 HEX

Чем именно кодируется?

С уважением, Лазарев Илья (Научная Библиотека ВятГУ)

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: Gena (IP-адрес скрыт)
Дата: 13, September, 2010 17:20

фотография раскладывается по цветам точек в 16 HEX. Также, как это делается при загрузке в 953 поле средствами Ирбиса. Очень приятное решение :) я до такого не додумался...

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 13, September, 2010 17:27

Фотография не раскладывается по цветам точек. Там файл преобразуется с помощью BASE64 (скорее всего).

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: denned (IP-адрес скрыт)
Дата: 14, September, 2010 08:02

iLq написал(а):
-------------------------------------------------------
> denned написал(а):
> --------------------------------------------------
> -----
> > 2) Дальше фотография кодируется в 16 HEX
>
> Чем именно кодируется?

Бинарный файл, в нашем случае фотография, преобразуется(кодируется) в 16 систему.

Панев Максим написал(а):
-------------------------------------------------------
> Фотография не раскладывается по цветам точек. Там
> файл преобразуется с помощью BASE64 (скорее
> всего).

Побайтово читал бинарный файл и в string записывал результат преобразования + %. изобрел велосипед =) оказывается уже есть такая функция в delphi, BinToHex

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 14, September, 2010 08:16

Вообще хочется отметить относительно поля 953. Проводил тест: использовал для хранения в нем обложки книг. Размеры файла были 10-20кб. Правда по началу в это поле накидали данных по 2-3Мб. База стала страшно тупить. Поправил большие изображения на маленькие. Тормоза хоть и уменьшились, то все равно скорость не приемлемая. Проблема еще была в том, что при получении библиографических описаний в вебе приходилось эти файлы сначала сохранять. По этому время получения результатов поиска увеличивалось пропорционально их количеству.
Для фотографий читателя хранить изображения в записи допустимо лишь по нескольким причинам: размер фотки обычно не превышает 1-2кб и в один момент времени требуется фотка только одного читателя. Именно по этому не видно больших замедлений в работе.
К данному обсуждению это не имеет большого отношения. Просто делюсь опытом раз речь зашла про 953 поле.

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: iLq (IP-адрес скрыт)
Дата: 14, September, 2010 08:16

Чем именно кодируете? Специальную dll написали? Есть возможность поделиться разработкой?

С уважением, Лазарев Илья (Научная Библиотека ВятГУ)

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: denned (IP-адрес скрыт)
Дата: 14, September, 2010 12:31

Максим вы правы.
Я кидаю очень маленькие изображения, да и фотка сливается по клику на читателе, небольшая задержка не мешает =)
Начал читать про потоки, может получится сразу показать изображение без сохранения на жесткий.

Pascal

function ByteToHex(InByte:byte):shortstring;
const Digits:array[0..15] of char='0123456789ABCDEF';
begin
result:=digits[InByte shr 4]+digits[InByte and $0F];
end;

фотографирование читателя производится из самой программы, для этого подключен пакет DSPack. дальше мне приходится сохранить изображение в temp папку. и повторно открыть его для преобразования
var
PhotoHex:Pchar;
Photo: File;
b:byte;
begin
PhotoHex := '';
AssignFile(Photo, FilePath); //открываем бинарный файл
Reset(Photo,1);
while not Eof(Photo) do begin
BlockRead(Photo, b, SizeOf(b)); //считываем байт
PhotoHex := PhotoHex +'%'+ ByteToHex(b); //добавляем в строку
end;
CloseFile(Photo); //закрываем файл
end;

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: Lavrinovich (IP-адрес скрыт)
Дата: 09, March, 2011 22:54

...



Редактировано 2 раз. Последний раз 22.11.2011 07:08 пользователем Lavrinovich.

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: Lavrinovich (IP-адрес скрыт)
Дата: 20, September, 2011 22:00

...



Редактировано 1 раз. Последний раз 22.11.2011 07:09 пользователем Lavrinovich.

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: woodyfon (IP-адрес скрыт)
Дата: 10, October, 2013 09:40

Интересует возможность разработки совершенно нового модуля со своим алгоритмом ввода данных. Реализуемо ли это впринципе. Среда программирования - Delphi?

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: S-presso (IP-адрес скрыт)
Дата: 10, October, 2013 11:18

Цитата:
woodyfon
Интересует возможность разработки совершенно нового модуля со своим алгоритмом ввода данных. Реализуемо ли это впринципе. Среда программирования - Delphi?

Вы смотрели эту тему - [irbis.gpntb.ru]? Там можно скачать мою заготовку модуля, поддерживающего альтернативный способ ввода (посредством анализа текста) через плагины и некоторые операции с оглавлением. В остальном это - обычный просмотрщик рабочих листов записей ИРБИС64 с привычным интерфейсом и некоторыми зачаточными возможностями редактирования. Если Вас это интересует, могу поделиться исходниками. Правда, они для C++ Builder, а не Delphi (хотя разница между ними, вообще-то невелика), и есть ряд серьёзных неисправленных ошибок, но для начала вполне сойдёт.

Re: АБИС ИРБИС + Delphi помогите разобраться
Пользователь: woodyfon (IP-адрес скрыт)
Дата: 10, October, 2013 13:47

Получить исходники, было бы очень интересно. Разбирая работу функции function IC_reg (первой!) пришел к выводу, что написать свой модуль, который бы подключался к серверу - невозможно! Так ли это?
Есть одна задумка - хочется реализовать. Думаю, ускорит и упростит ввод библиографических данных.

Страницы: 12>>
Страница: 1 из 2


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