Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2014.02.02;
Скачать: [xml.tar.bz2];

Вниз

Barcode Code128   Найти похожие ветки 

 
Dennis I. Komarov ©   (2013-08-07 13:57) [0]

Никто не поделится процедурой перекодировки строки для ttf?


 
брат Птибурдукова   (2013-08-07 14:27) [1]

В своё время за полчаса нарыл в инете. Рекомендую.


 
Dennis I. Komarov ©   (2013-08-07 14:45) [2]


> В своё время за полчаса нарыл в инете. Рекомендую.

Нарыл, сижу с васика перевожу. Вдруг у кого на полке лежит, а я тут ...


 
брат Птибурдукова   (2013-08-07 14:58) [3]

а, кстати да :-) тоже с васика переводил. но та работа и тот код far far away, так что увы :-)


 
Dennis I. Komarov ©   (2013-08-07 17:11) [4]

BCode(BInd) = CInt(Chr(Ch) & Chr(Ch2))

Как правильно CInt на Дельфи перевести?

Соединили два символа, а в результате Integer

Что-то такой код не дает полного представления о CInt
Код:
Dim aDbl As Double
Dim anInt As Integer
aDbl = 2345.5678
" The following line of code sets anInt to 2346.
anInt = CInt(aDbl)


 
robt5   (2013-08-07 17:27) [5]

самый просто вариант просто писать шрифтом для штрихкода


 
брат Птибурдукова   (2013-08-07 17:32) [6]


> BCode(BInd) = CInt(Chr(Ch) & Chr(Ch2))

BCode[BInd] := StrToInt(IntToStr(Ch) + IntToStr(Ch2)) — буквальный перевод. Естественно, на Делфе можно то же самое сделать с куда меньшими затратами тактов :-)


> самый просто вариант просто писать шрифтом для штрихкода
Для Code128 не так всё просто.


 
Dennis I. Komarov ©   (2013-08-07 21:59) [7]


> BCode[BInd] := StrToInt(IntToStr(Ch) + IntToStr(Ch2)) —
> буквальный перевод. Естественно, на Делфе можно то же самое
> сделать с куда меньшими затратами тактов :-)

Думаю, что там вообще есть алгоритм без участия строковых символов как таковых, но это уже другая серия
Сейчас без "прически" кода как-то не так работает. Может кто найдет ошибку?
http://rusfolder.com/37531626

генератор:
http://barcode.tec-it.com/


 
Dennis I. Komarov ©   (2013-08-07 22:00) [8]


> robt5   (07.08.13 17:27) [5]
> самый просто вариант просто писать шрифтом для штрихкода

А дальше чего с ним делать? :)


 
Алканавт расправил плечи   (2013-08-07 23:30) [9]


> Dennis I. Komarov ©   (07.08.13 21:59) [7]
Во-первых, кроме функции Code_128() тебе ничего не надо, остальное зря переводил.
Во-вторых, явных ошибок не вижу (неоптимально — да, но чего ещё ожидать от буквального перевода?).
В-третьих, что значит "как-то не так"? :-)
В-четвёртых, я бы посоветовал сначала поотлаживать чисто "режим Б", латинские буквы. Когда заведётся, тогда уже будет смысл режимы А и Ц добить. Без сканера штрих-кодов пытаться что-то отлаживать нет смысла, кроме сканера никто тебе не скажет, правильно ли закодировал.


 
DVM ©   (2013-08-07 23:35) [10]


>  Без сканера штрих-кодов пытаться что-то отлаживать нет
> смысла, кроме сканера никто тебе не скажет, правильно ли
> закодировал

программа для андроида или айфона скажет


 
Алканавт расправил плечи   (2013-08-07 23:37) [11]

Будто это не сканер будет… :-)


 
Dennis I. Komarov ©   (2013-08-08 00:07) [12]


> Во-первых, кроме функции Code_128() тебе ничего не надо,
>  остальное зря переводил.

Ну как же:
 Result := "";
 for I := 0 to BInd - 1 do
     Result := Result + Code_Char(Code_128_ID(BCode[I]));

А code39 я тоже перевел, т.к. они очень похожи. Да его хватит, вот только 128-ой получается компактней не смотряя на большие возможности из-за «двойной упаковки» данных, когда два числа записываются в один модуль штрих-кода.

> Во-вторых, явных ошибок не вижу (неоптимально — да, но чего
> ещё ожидать от буквального перевода?).

Сам вот не вижу :) хотя поручиться за оригинал тоже низя

> В-третьих, что значит "как-то не так"? :-)

Ну тут все просто: берем некую строку и подаем на вход функции и в он-лайн генератор, сравниваем результаты. Получается "как-то не так" как результат генератора

> В-четвёртых, я бы посоветовал сначала поотлаживать чисто
> "режим Б", латинские буквы. Когда заведётся, тогда уже будет
> смысл режимы А и Ц добить. Без сканера штрих-кодов пытаться
> что-то отлаживать нет смысла, кроме сканера никто тебе не
> скажет, правильно ли закодировал.

Вполне можно сравнить глазками, если "как-то не так" то это заметно :)


 
Алканавт расправил плечи   (2013-08-08 07:48) [13]


> Получается "как-то не так" как результат генератора
То есть онлайн-генератору ты веришь без проверки его результата? Я б не стал! :-)


> Ну как же:
Да, проглядел… И вот этот момент меня и смущает… Не помню я, чтоб в итоге все пляски приводили к комбинациям 1, 2, 3 и 4.


> Да его хватит, вот только 128-ой получается компактней не
> смотряя на большие возможности из-за «двойной упаковки»
> данных, когда два числа записываются в один модуль штрих-
> кода.
Да, когда сравнивал виды линейного штрих-кодирования, то Code128 и по компактности, и по возможностям был лучше других (оставим в стороне Codabar, у него иные приоритеты).

Попытаюсь днём связаться с экс-начальством и выцыганить эту функцию, но шансы на успех невелики.


 
Dennis I. Komarov ©   (2013-08-08 10:39) [14]


> То есть онлайн-генератору ты веришь без проверки его результата?
>  Я б не стал! :-)

Верю, ибо проверил и сканером и оригиналом и сканером по оригиналу :)
Не врет зараза...
Вот еще один: http://www.adams1.com/pub/russadam/stack.html

> Да, проглядел… И вот этот момент меня и смущает… Не помню
> я, чтоб в итоге все пляски приводили к комбинациям 1, 2,
>  3 и 4.
>

Если верить этой спецификации, то да
http://www.barcodeman.com/info/c128.php

P.S. Code39 вроде хорошо рисует...


 
брат Птибурдукова   (2013-08-08 10:49) [15]


> Если верить этой спецификации, то да
Значит я уже ваще всё позабывал. Попробуй свой код прогнать на примере, приводимом в твоей ссылке. Сравни побайтно, где глючит…


 
Доброжелатель   (2013-08-21 11:26) [16]

Переводи код всегда сам

из за брата и его глупого перевода сам попался на те же грабли потеряв 2 часа

> BCode(BInd) = CInt(Chr(Ch) & Chr(Ch2))

BCode[BInd] := StrToInt(IntToStr(Ch) + IntToStr(Ch2)) — буквальный перевод. Естественно, на Делфе можно то же самое сделать с куда меньшими затратами тактов :-)

это неправильный перевод
вот правильный
BCode[BInd]:=strtoint(CHR(Ch)+CHR(Ch2));

и полный перевод

function TForm1.Code_128_ID(ID:integer):String;
var S:String;
begin
   Case ID of
     0: s:= "212222";
     1: s:= "222122";
     2: s:= "222221";
     3: s:= "121223";
     4: s:= "121322";
     5: s:= "131222";
     6: s:= "122213";
     7: s:= "122312";
     8: s:= "132212";
     9: s:= "221213";
     10: s:= "221312";
     11: s:= "231212";
     12: s:= "112232";
     13: s:= "122132";
     14: s:= "122231";
     15: s:= "113222";
     16: s:= "123122";
     17: s:= "123221";
     18: s:= "223211";
     19: s:= "221132";
     20: s:= "221231";
     21: s:= "213212";
     22: s:= "223112";
     23: s:= "312131";
     24: s:= "311222";
     25: s:= "321122";
     26: s:= "321221";
     27: s:= "312212";
     28: s:= "322112";
     29: s:= "322211";
     30: s:= "212123";
     31: s:= "212321";
     32: s:= "232121";
     33: s:= "111323";
     34: s:= "131123";
     35: s:= "131321";
     36: s:= "112313";
     37: s:= "132113";
     38: s:= "132311";
     39: s:= "211313";
     40: s:= "231113";
     41: s:= "231311";
     42: s:= "112133";
     43: s:= "112331";
     44: s:= "132131";
     45: s:= "113123";
     46: s:= "113321";
     47: s:= "133121";
     48: s:= "313121";
     49: s:= "211331";
     50: s:= "231131";
     51: s:= "213113";
     52: s:= "213311";
     53: s:= "213131";
     54: s:= "311123";
     55: s:= "311321";
     56: s:= "331121";
     57: s:= "312113";
     58: s:= "312311";
     59: s:= "332111";
     60: s:= "314111";
     61: s:= "221411";
     62: s:= "431111";
     63: s:= "111224";
     64: s:= "111422";
     65: s:= "121124";
     66: s:= "121421";
     67: s:= "141122";
     68: s:= "141221";
     69: s:= "112214";
     70: s:= "112412";
     71: s:= "122114";
     72: s:= "122411";
     73: s:= "142112";
     74: s:= "142211";
     75: s:= "241211";
     76: s:= "221114";
     77: s:= "413111";
     78: s:= "241112";
     79: s:= "134111";
     80: s:= "111242";
     81: s:= "121142";
     82: s:= "121241";
     83: s:= "114212";
     84: s:= "124112";
     85: s:= "124211";
     86: s:= "411212";
     87: s:= "421112";
     88: s:= "421211";
     89: s:= "212141";
     90: s:= "214121";
     91: s:= "412121";
     92: s:= "111143";
     93: s:= "111341";
     94: s:= "131141";
     95: s:= "114113";
     96: s:= "114311";
     97: s:= "411113";
     98: s:= "411311";
     99: s:= "113141";
     100: s:= "114131";
     101: s:= "311141";
     102: s:= "411131";
     103: s:= "211412";
     104: s:= "211214";
     105: s:= "211232";
     106: s:= "2331112";
   end;
   Code_128_ID := S;
end;

//Штриховые символы шрифта iQs Code 128 по набору полос
function TForm1.Code_Char(A:String):String;
var
 temp,S:String;
 I:Integer;
begin
 if a="211412" then
   S:="A"
 else
 if a="211214" then
   S:="B"
 else
 if a="211232" then
   S:="C"
 else
 if a="2331112" then
   S:="@"
 else
 begin
   S:="";
   For i:=0 To trunc(Length(A)/2-1) do        //? возможно round
   begin
     temp:=copy(A, 2*I+1,2);
     if temp="11" then
       S:=S+"0"
     else
     if temp="21" then
       S:=S+"1"
     else
     if temp="31" then
       S:=S+"2"
     else
     if temp="41" then
       S:=S+"3"
     else
     if temp="12" then
       S:=S+"4"
     else
     if temp="22" then
       S:=S+"5"
     else
     if temp="32" then
       S:=S+"6"
     else
     if temp="42" then
       S:=S+"7"
     else
     if temp="13" then
       S:=S+"8"
     else
     if temp="23" then
       S:=S+"9"
     else
     if temp="33" then
       S:=S+":"
     else
     if temp="43" then
       S:=S+";"
     else
     if temp="14" then
       S:=S+"<"
     else
     if temp="24" then
       S:=S+"="
     else
     if temp="34" then
       S:=S+">"
     else
     if temp="44" then
       S:=S+"?";
   end
 end;
 Code_Char:=S;
end;

//Строка штрих-кода в кодировке Code 128
function TForm1.Code_128(A:String):String;
var
 BCode: array[0..1023] of Integer;
 BInd:Integer;
 CurMode:String;
 Ch:Integer;
 Ch2:Integer;
 I:Integer;
 LenA:Integer;
 CCode:Integer;
 S:String;
 temp:string;
begin
 //Собираем строку кодов
 BInd:=0;
 CurMode:="";
 I:=1;
 LenA:=Length(A);
 While I<=LenA do
 begin
   //Текущий символ в строке
   temp:=copy(A,I,1);
   Ch:= ord(temp[1]);
   I:=I+1;
   //Разбираем только символы от 0 до 127
   if Ch<= 127 then
   begin
     //Следующий символ
     if I <= LenA then
     begin
       temp:=copy(A,I,1);
       Ch2:= ord(temp[1]);
     end
     else
       Ch2:=0;
     //Пара цифр - режим С
     If (48 <= Ch) and (Ch <= 57) and (48 <= Ch2) and (Ch2 <= 57) then
     begin
       I:=I+1;
       if BInd=0 Then
       begin
         //Начало с режима С
         CurMode:="C";
         BCode[BInd]:=105;
         BInd:=BInd+1;
       end
       else
       if CurMode <> "C" then
       begin
         //Переключиться на режим С
         CurMode:="C";
         BCode[BInd]:=99;
         BInd:=BInd+1;
       end;
       //Добавить символ режима С
       BCode[BInd]:=strtoint(CHR(Ch)+CHR(Ch2));
       BInd:=BInd+1;
     end
     else
     begin
       if BInd=0 then
       begin
         if Ch<32 then
         begin
           //Начало с режима A
           CurMode:="A";
           BCode[BInd]:=103;
           BInd:=BInd+1;
         end
         else
         begin
           //Начало с режима B
           CurMode:="B";
           BCode[BInd]:=104;
           BInd:=BInd+1;
         end
       end;
       If (Ch < 32) and (CurMode <> "A") then
       begin
         //Переключение по надобности в режим A
         CurMode:="A";
         BCode[BInd]:=101;
         BInd:=BInd+1;
       end
       else
       If ((64 <= Ch) and (CurMode<>"B")) Or (CurMode="C") then
       begin
         //Переключение по надобности в режим B
         CurMode:="B";
         BCode[BInd]:=100;
         BInd:=BInd+1;
       end;
       if (Ch < 32) then
       begin
         //Служебные символы
         BCode[BInd]:=Ch+64;
         BInd:=BInd+1;
       end
       else
       begin
         //Все другие символы
         BCode[BInd]:=Ch-32;
         BInd:=BInd+1;
       end;
     end;
   end
 end;
 //Подсчитываем контрольную сумму
 CCode:=BCode[0] Mod 103;
 For i:=1 To BInd-1 do
   CCode:=(CCode + BCode[I] * I) Mod 103;
 BCode[BInd]:=CCode;
 BInd:=BInd+1;
 //Завершающий символ
 BCode[BInd]:=106;
 BInd:=BInd+1;
 //Собираем строку символов шрифта
 S:="";

 For i:= 0 To BInd - 1 do
   S:=S+Code_Char(Code_128_ID(BCode[I]));
 Code_128:=S;
end;


 
DVM ©   (2013-08-21 11:49) [17]


> Доброжелатель   (21.08.13 11:26) [16]

Замени эту линную колбасу с case на массив


 
Доброжелатель   (2013-08-22 09:03) [18]

Если работает - пусть работает. Кому нужно тот и поменяет.


 
Dennis I. Komarov ©   (2013-08-22 10:16) [19]


> это неправильный перевод
> вот правильный
> BCode[BInd]:=strtoint(CHR(Ch)+CHR(Ch2));

У меня в коде вроде так и есть...
       if CurMode <> "C" then begin
         //"&#207;&#229;&#240;&#229;&#234;&#235;&#254;&#247;&#232;&#242;&#252;&#241;&#255; &#237;&#224; &#240;&#229;&#230;&#232;&#236; &#209;
         CurMode := "C";
         BCode[BInd] := 99;
         Inc(BInd);
       end;
               //"&#196;&#238;&#225;&#224;&#226;&#232;&#242;&#252; &#241;&#232;&#236;&#226;&#238;&#235; &#240;&#229;&#230;&#232;&#236;&#224; &#209;
     BCode[BInd] := StrToInt(Chr(Ch) + Chr(Ch2));
     Inc(BInd);


 
Dennis I. Komarov ©   (2013-08-22 10:22) [20]

Меня вот эта часть смущает...

>   For i:=0 To trunc(Length(A)/2-1) do        //? возможно
> round
>    begin
>      temp:=copy(A, 2*I+1,2);
>      if temp="11" then

vs
   for I := 0 to Length(A) div 2 - 1 do
     case StrToInt(string(Copy(A, 2 * I + 1, 2))) of
       11: Result := Result + "0";


 
Доброжелатель   (2013-08-22 13:41) [21]

проверенно все работает - пометку забыл убрать после проверки



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2014.02.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.003 c
2-1364475755
ttt
2013-03-28 17:02
2014.02.02
Интерфейсы


15-1375869422
Dennis I. Komarov
2013-08-07 13:57
2014.02.02
Barcode Code128


15-1376633325
БарЛог
2013-08-16 10:08
2014.02.02
Советы по организации почтового ящика


15-1376365256
Ротанг
2013-08-13 07:40
2014.02.02
Как настроить почту в Windows 8


2-1364394906
8-bytes
2013-03-27 18:35
2014.02.02
приложение в трехзвенке





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский