Форум: "Прочее";
Текущий архив: 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
//"Ïåðåêëþ÷èòüñÿ íà ðåæèì Ñ
CurMode := "C";
BCode[BInd] := 99;
Inc(BInd);
end;
//"Äîáàâèòü ñèìâîë ðåæèìà Ñ
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
vsfor 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