Código
Percebi que existem 2 tipos de código de barras um que chamo de "conta" que são aqueles códigos de barras com 4 blocos de 12 caracteres cada, nesse caso o dígito verificador fica sempre como o ultimo dígito de cada bloco, é através desse dígito que validamos o código completo.
Vamos lá:
Antes de mais nada inclua um <MaskEdit> coloque a seguinte mascara= '999999999999 999999999999 999999999999 999999999999;1;_', Inclua um botão para utilizarmos como disparador da validação, claro que a validação pode ser utilizada em qualquer outro evento que desejar....
Declare a seguinte Função:
public
function CalcDigM10(Campo: String): String;
Corpo da Função:
function TForm1.CalcDigM10(Campo: String): String;
var
nl,
nMult,
nSoma,
nMin,
nMax,
nResto,
nDig,
nParc : integer ;
begin
nMin := 1;
nMax := 2;
nMult := nMax;
nSoma := 0;
nl := length(Campo);
while nl > 0 do
begin
nParc := StrToInt( copy(Campo,nl,1) ) * nMult;
if nParc > 9 then nParc := nParc - 9 ;
nSoma := nSoma + nParc ;
nMult := nMult -1;
nl := nl -1 ;
if nMult < nMin then nMult := nMax;
end;
nResto := nSoma mod 10 ;
nDig := 10 - nResto;
if nDig > 9 then nDig := 0;
Result := IntToStr(nDig) ;
end;
Depois é só incluir no onclick do botão o seguinte código:
procedure TForm1.Button1Click(Sender: TObject);
var bloco1,digi1_func,
bloco2,digi2_func,
bloco3,digi3_func,
bloco4,digi4_func,
NumBarra :String;
begin
//Captura os 4 blocos de 12 posições do campo MaskEdit!
bloco1 := copy(MaskEdit.Text,1,12);
bloco2 := copy(MaskEdit.Text,15,12);
bloco3 := copy(MaskEdit.Text,29,12);
bloco4 := copy(MaskEdit.Text,43,12);
//Código de barras completo!
NumBarra := bloco1+bloco2+bloco3+bloco4;
digi1_func := copy(MaskEdit.Text,1,11);
digi1_func := digi1_func + CalcDigM10(digi1_func);
digi2_func := copy(MaskEdit.Text,15,11);
digi2_func := digi2_func + CalcDigM10(digi2_func);
digi3_func := copy(MaskEdit.Text,29,11);
digi3_func := digi3_func + CalcDigM10(digi3_func);
digi4_func := copy(MaskEdit.Text,43,11);
digi4_func := digi4_func + CalcDigM10(digi4_func);
if (digi1_func <> bloco1) or (digi2_func <> bloco2) or (digi3_func <> bloco3) or (digi4_func <> bloco4) then
begin
ShowMessage('Código de barras inválido');
MaskEdit.Clear;
Abort;
end;
end;
E pronto, basta usar a inteligência para melhorar da formas que lhe convém....
na proxima mostro como validar o outro tipo de código de barras (Título) que é : '9999999999 99999999999 99999999999 9 99999999999999;1;_'
Ass: Ednaldo Avelino
Analista de Sistemas
Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009