Вывод EAN13 штрихкодов с помощью TTF шрифтов

Обсуждение извечных проблем кларионовских (и не только) отчетов
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Admin
Администратор
Сообщения: 3225
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Вывод EAN13 штрихкодов с помощью TTF шрифтов

Сообщение Admin » 24 Август 2015, 2:07

2015-08-24 09-03-57 Use EAN13 Font.png

Код: Выделить всё

                 PROGRAM
                 MAP
                   MODULE('Windows API')
                     AddFontResource(*CSTRING FontName),RAW,LONG,PASCAL,NAME('AddFontResourceA')
                   END
                   EAN13(STRING Barcode), STRING
                 END

LOC:FontFileName CSTRING(20)
LOC:Barcode1     CSTRING(20)
LOC:Barcode2     CSTRING(20)
LOC:Barcode3     CSTRING(20)

Window WINDOW('Use EAN13 Font'),AT(,,161,140),FONT('MS Sans Serif',8,,FONT:regular),CENTER,GRAY,DOUBLE
       STRING(@s20),AT(18,9),USE(LOC:Barcode1)
       STRING(@s20),AT(18,48),USE(LOC:Barcode2)
       STRING(@s20),AT(18,97),USE(LOC:Barcode3)
     END

  CODE
  LOC:FontFileName = 'EANG000.TTF'
  IF NOT AddFontResource(LOC:FontFileName)
    MESSAGE('Error on load: ' & LOC:FontFileName,'Warning',ICON:Hand)
  END
  OPEN(Window)
  ?LOC:Barcode1{PROP:Font} = 'EanGnivc'
  ?LOC:Barcode1{PROP:FontSize} = 20
  ?LOC:Barcode2{PROP:Font} = 'EanGnivc'
  ?LOC:Barcode2{PROP:FontSize} = 30
  ?LOC:Barcode3{PROP:Font} = 'EanGnivc'
  ?LOC:Barcode3{PROP:FontSize} = 40
  LOC:Barcode1 = EAN13(2340600973341)
  LOC:Barcode2 = EAN13(6945198851772)
  LOC:Barcode3 = EAN13(2901214010046)
  ACCEPT
  END
  CLOSE(Window)

EAN13       FUNCTION(STRING Barcode)!, STRING
a           LONG(48)
b           LONG(65)
c           LONG(97)
d           LONG(35)
i           LONG
Cod         LONG,DIM(13,2)
f           LONG,DIM(6,10)
strEAN13    STRING(20)
  CODE
  IF LEN(CLIP(BarCode)) <> 13
    MESSAGE('Штрих код за пределами отведенного диапазона')
    RETURN ''
  END
  f[1,0] = a; f[1,1] = a; f[1,2] = a; f[1,3] = a; f[1,4] = a
  f[1,5] = a; f[1,6] = a; f[1,7] = a; f[1,8] = a; f[1,9] = a
  f[2,0] = a; f[2,1] = a; f[2,2] = a; f[2,3] = a; f[2,4] = b
  f[2,5] = b; f[2,6] = b; f[2,7] = b; f[2,8] = b; f[2,9] = b
  f[3,0] = a; f[3,1] = b; f[3,2] = b; f[3,3] = b; f[3,4] = a
  f[3,5] = b; f[3,6] = b; f[3,7] = a; f[3,8] = a; f[3,9] = b
  f[4,0] = a; f[4,1] = a; f[4,2] = b; f[4,3] = b; f[4,4] = a
  f[4,5] = a; f[4,6] = b; f[4,7] = b; f[4,8] = b; f[4,9] = a
  f[5,0] = a; f[5,1] = b; f[5,2] = a; f[5,3] = b; f[5,4] = b
  f[5,5] = a; f[5,6] = a; f[5,7] = a; f[5,8] = b; f[5,9] = b
  f[6,0] = a; f[6,1] = b; f[6,2] = b; f[6,3] = a; f[6,4] = b
  f[6,5] = b; f[6,6] = a; f[6,7] = b; f[6,8] = a; f[6,9] = a
  LOOP i = 1 TO 13
    Cod[i, 1] = SUB(BarCode, i, 1)
  END
  LOOP i = 2 TO 7
    Cod[i, 2] = f[i - 1, Cod[1, 1]]
  END
  strEAN13 = CHR(Cod[1, 1] + 35)
  strEAN13 = CLIP(strEAN13) & CHR(33)
  LOOP i = 2 TO 7
    strEAN13 = CLIP(strEAN13) & CHR(Cod[i, 1] + Cod[i, 2])
  END
  strEAN13 = CLIP(strEAN13) & CHR(45)
  LOOP i = 8 TO 13
    strEAN13 = CLIP(strEAN13) & CHR(Cod[i, 1] + c)
  END
  strEAN13 = CLIP(strEAN13) & CHR(33)
  RETURN strEAN13
Вложения
EAN13p36TT.zip
(4.42 КБ) 619 скачиваний
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 2890
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Вывод EAN13 штрихкодов с помощью TTF шрифтов

Сообщение Игорь Столяров » 24 Август 2015, 12:13

Здорово ! Если позволите пару замечаний к этой технологии и конкретной реализации ...

1. AddFontResource() к сожалению требует административных прав юзера в Windows.
2. Лучше сразу предусмотреть кодировку и EAN14 (товары в упаковке)
3. Нужно проверять правильность кода - шрифтом будут печататься любые цифры, а сканер считывать такую зебру не будет.

А в остальном, дела идут как никогда ! :)
Работа в команде очень важна. Она позволяет свалить вину на другого.

Аватара пользователя
Admin
Администратор
Сообщения: 3225
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Вывод EAN13 штрихкодов с помощью TTF шрифтов

Сообщение Admin » 24 Август 2015, 12:18

Это просто пример/кусок от класса.
1. Первый раз слышу. Под простыми юзерами работает.
2. Нам хватает EAN13, упаковка не нужна.
3. В нашем классе проверка есть. :)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 2890
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Вывод EAN13 штрихкодов с помощью TTF шрифтов

Сообщение Игорь Столяров » 24 Август 2015, 12:22

Admin писал(а): 1. Первый раз слышу. Под простыми юзерами работает!
Обычный юзер в Windows не может изменять настройки шрифтов, ни через панель управления, ни через WinAPI ...
Особенно это чувствуется при работе в терминальном режиме.
Admin писал(а): Нам хватает EAN13, упаковка не нужна.
Все так говорят ... :) Но стандарт штрихового кодирования называется EAN13/14 и поэтому,
как пел В. Высоцкий: "Я не люблю когда наполовину ..." :)
Работа в команде очень важна. Она позволяет свалить вину на другого.

Аватара пользователя
Admin
Администратор
Сообщения: 3225
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Вывод EAN13 штрихкодов с помощью TTF шрифтов

Сообщение Admin » 24 Август 2015, 12:56

Игорь Столяров писал(а):Обычный юзер в Windows не может изменять настройки шрифтов, ни через панель управления, ни через WinAPI ...
Особенно это чувствуется при работе в терминальном режиме.
У нас везде терминальные сервера и станции.
Прога стоит у юзеров и работает.
Могу конечно и проверить но насколько я знаю права у нас по самые яйникуда отрезаны.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
Admin
Администратор
Сообщения: 3225
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Вывод EAN13 штрихкодов с помощью TTF шрифтов

Сообщение Admin » 24 Август 2015, 12:58

Игорь Столяров писал(а):ни через панель управления, ни через WinAPI
Шрифт в пределах сессии грузится.
Не нашел нигде инфы про права админа.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

kreator
Ветеран
Сообщения: 2500
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Вывод EAN13 штрихкодов с помощью TTF шрифтов

Сообщение kreator » 24 Август 2015, 13:07

Admin писал(а):Шрифт в пределах сессии грузится.
Не нашел нигде инфы про права админа.
Подтверждаю. У меня тоже юзеры на терминальном, проблем с загрузкой шрифтов нет.
С уважением, Kreator.

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 2890
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Вывод EAN13 штрихкодов с помощью TTF шрифтов

Сообщение Игорь Столяров » 24 Август 2015, 14:22

kreator писал(а): Подтверждаю. У меня тоже юзеры на терминальном, проблем с загрузкой шрифтов нет.
Здесь вопрос в том, какие права даны пользователю в терминале, он может быть и админом ...
Возможно у нас, что-то накручено с правами - буду проверять.
Работа в команде очень важна. Она позволяет свалить вину на другого.

kreator
Ветеран
Сообщения: 2500
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Вывод EAN13 штрихкодов с помощью TTF шрифтов

Сообщение kreator » 24 Август 2015, 14:31

Игорь Столяров писал(а):Здесь вопрос в том, какие права даны пользователю в терминале, он может быть и админом ...
Не-не, у нас всё жёстко, никаких админов. И, кстати, если посмотреть описание на msdn, то там про права админа ничего нет.
С уважением, Kreator.

Аватара пользователя
Admin
Администратор
Сообщения: 3225
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Вывод EAN13 штрихкодов с помощью TTF шрифтов

Сообщение Admin » 24 Август 2015, 14:33

Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Ал
Ветеран
Сообщения: 661
Зарегистрирован: 08 Июль 2005, 5:48
Откуда: Зеленоград/Московская обл./Россия

Вывод EAN13 штрихкодов с помощью TTF шрифтов

Сообщение Ал » 26 Август 2015, 9:40

Код: Выделить всё

CheckEAN13           FUNCTION (Src)                        ! Declare Procedure (string),string
i                    BYTE                                  !
cs                   LONG                                  !
digit                BYTE                                  !
RetCS                STRING(1)                             !

  CODE                                                     ! Begin processed code
 cs = 0                     ! очистили
 loop i = 1 to 12           ! разбираем посимвольной вх. строку
  digit = Src[i]            ! взяли i-й символ и преобразовали в число
  if i % 2 = 0              ! каждую цифру штрих-кода на ее весовой коэффициент и сложить вместе полученные результаты
    cs = cs + digit * 3     !  для стоящих в четном разряде вес = 3
  else
    cs = cs + digit         !  для остальных вес = 1
  .
 .
 cs = cs % 10               ! считаем контрольный разряд
 if cs > 0                  ! определяем какое число должно быть добавлено, чтобы сделать сумму в cs кратной 10
   cs = 10 - cs
 .
 RetCS = cs                 ! преобразовали в строчные
 return(RetCS)              ! возвращаем контрольный разряд в виде символа
как выше в примере:

Код: Выделить всё

...
 strEAN13 = ''                      ! очистили
 BarCode = clip(Left(BarCode))      ! подровняли влево входную строку на всякий случай
 If Len(clip(BarCode)) <> 13 Then   ! длиина не 13 символов
!     Message('Штрих код за пределами отведенного диапазона.', 'Модуль работы со штрих-кодами',ICON:Exclamation)
 ElsIf BarCode[13] <> CheckEAN13(BarCode) !sub(clip(BarCode),-1,1) <> CheckEAN13(BarCode)  ! проверка контрольного разряда
!        Message('Ошибка контрольной суммы.','Модуль работы со штрих-кодами',ICON:Exclamation)
 Else   ! все хорошо с входной строкой
   f[1, 0] = a;   f[1, 1] = a;   f[1, 2] = a;   f[1, 3] = a;   f[1, 4] = a   ! присваиваем значения смещений в таблице A замены символов
...
ps ещё можно взять вариант алгоритма из 1С, а не этот (французский, если не ошибаюсь)) :D

gopstop2007
Ветеран
Сообщения: 907
Зарегистрирован: 25 Март 2009, 21:55

Вывод EAN13 штрихкодов с помощью TTF шрифтов

Сообщение gopstop2007 » 26 Август 2015, 21:06

скомпилировал пример, предварительно установив шрифт,перезагрузил. Результата в виде штрих кода не увидел одни буковки?! Windows 7 x64 C10
С уважением РА

Ал
Ветеран
Сообщения: 661
Зарегистрирован: 08 Июль 2005, 5:48
Откуда: Зеленоград/Московская обл./Россия

Вывод EAN13 штрихкодов с помощью TTF шрифтов

Сообщение Ал » 26 Август 2015, 22:57

gopstop2007 писал(а):скомпилировал пример, предварительно установив шрифт,перезагрузил. Результата в виде штрих кода не увидел одни буковки?! Windows 7 x64 C10
бывает..
1. шрифт все ж не установлен (например в репорте задать явно и проверить

Код: Выделить всё

Report REPORT,AT(3,3,104,19),PAPER(PAPER:LETTER),PRE(RPT),FONT('Arial',10,,FONT:regular,CHARSET:ANSI), |
         MM
Detail DETAIL,AT(,,50,19),USE(?Detail)
         STRING(@s16),AT(2,2,42,17),USE(loc:BarCode),CENTER,FONT('EanGnivc',28,,,CHARSET:ANSI),#ORIG(loc:BarCode)
       END
detail1 DETAIL,AT(,,50,19),USE(?detail1)
         STRING('-----'),AT(4,3,40,6),USE(?String2),TRN,#ORIG(?String2)
       END
     END
)
2. ошибка в программе - бывало: погибающему коллеге давалось несколько вариантов, но при вставке в свою прогу он так "оптимизировал" код, что только буковки видел...

Аватара пользователя
Admin
Администратор
Сообщения: 3225
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Вывод EAN13 штрихкодов с помощью TTF шрифтов

Сообщение Admin » 27 Август 2015, 2:29

gopstop2007 писал(а):скомпилировал пример, предварительно установив шрифт,перезагрузил. Результата в виде штрих кода не увидел одни буковки?! Windows 7 x64 C10
Лень разбираться что там SV сломали с при работе с пропами, или починили.
Заменить

Код: Выделить всё

  ?LOC:Barcode1{PROP:Font} = 'EanGnivc'
  ?LOC:Barcode1{PROP:FontSize} = 20
  ?LOC:Barcode2{PROP:Font} = 'EanGnivc'
  ?LOC:Barcode2{PROP:FontSize} = 30
  ?LOC:Barcode3{PROP:Font} = 'EanGnivc'
  ?LOC:Barcode3{PROP:FontSize} = 40
на

Код: Выделить всё

  SETFONT(?LOC:Barcode1,'EanGnivc',20,-1,-1,CHARSET:ANSI)
  SETFONT(?LOC:Barcode2,'EanGnivc',30,-1,-1,CHARSET:ANSI)
  SETFONT(?LOC:Barcode3,'EanGnivc',40,-1,-1,CHARSET:ANSI)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

gopstop2007
Ветеран
Сообщения: 907
Зарегистрирован: 25 Март 2009, 21:55

Вывод EAN13 штрихкодов с помощью TTF шрифтов

Сообщение gopstop2007 » 27 Август 2015, 13:23

Спасибо, заработало. Даже не знал об этой проблеме :idied: ю Кстати,не работало с C8 по С10
Последний раз редактировалось gopstop2007 27 Август 2015, 14:48, всего редактировалось 1 раз.
С уважением РА

Ответить