Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.02.02;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.007 c
15-1376560043
Дмитрий СС
2013-08-15 13:47
2014.02.02
Как получить "Описание устройства, переданное шиной"?


2-1364475755
ttt
2013-03-28 17:02
2014.02.02
Интерфейсы


2-1364484308
ch_dark
2013-03-28 19:25
2014.02.02
помогите не могу разобраться с меню


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


11-1249177598
Ruzzz
2009-08-02 05:46
2014.02.02
D2009, Unicode и Ansi-строки одновременно, перегрузка функций