Se for código de barra XXXXXX, então a imagem será YYY.jpg

Delphi

28/09/2007

Olá!

Como que eu poderia fazer isso? É para um PDV de um supermercado... uma tela de consulta de preços. Digito o código de barras, dou um ENTER, e aparece o PRODUTO, PREÇO e a IMAGEM... O produto e o preço, está funcionando. Agora, como que eu faço para aparecer a imagem?

Sendo que a imagem, não ficará salva no banco, mas sim, na pasta do *.EXE do sistema, na pasta IMGPRODUTOS...

Desde já agradeço.
Obrigado!


Lucas_spohr

Lucas_spohr

Curtidas 0

Respostas

Mayron Cachina

Mayron Cachina

28/09/2007

Olá! Como que eu poderia fazer isso? É para um PDV de um supermercado... uma tela de consulta de preços. Digito o código de barras, dou um ENTER, e aparece o PRODUTO, PREÇO e a IMAGEM... O produto e o preço, está funcionando. Agora, como que eu faço para aparecer a imagem? Sendo que a imagem, não ficará salva no banco, mas sim, na pasta do *.EXE do sistema, na pasta IMGPRODUTOS... Desde já agradeço. Obrigado!


como vc esta cadastrando essa imagem??? usando um caminho no banco???
ou com o mesmo ´numero´ do codigo de barras????

image1.picture.loadfromfile()

vc ta usando isso????


GOSTEI 0
Lucas_spohr

Lucas_spohr

28/09/2007

Opa!

É o seguinte... A imagem, não ficará gravada no banco, não.

O produto, o preço e o próprio código de barras, ficarão gravados no banco. A imagem, neste caso, ficará numa NovaPasta, no mesmo lugar onde está o executável do projeto. Dentro desta ´NovaPasta´, ficarão as imagens dos produtos. Cada imagem, terá como nome, os números de seu determinado código de barras.

Código de Barras: 001212121212
Produto: Pão Sanduíche
Preço: R$ 1,00
Imagem: \NovaPasta\001212121212.jpg

Espero ter sido claro...

Obrigado!


GOSTEI 0
Mayron Cachina

Mayron Cachina

28/09/2007

então ...
é justamente como eu te falei...

vc vai ter q ter um TImage e no evento q esta pegando informações do banco vc vai colocar esse codigo....

img := local do banco + numero do codigo de barras.jpg
Image1.Picture.LoadFromFile(img);


pelo menos foi isso q eu entendi q vc queria...


GOSTEI 0
Lucas_spohr

Lucas_spohr

28/09/2007

neste caso, seria criar uma variável com o nome de img?

por exempo, o executável da minha aplicação está no caminho:
C:\pasta\Pdv

e o banco:
C:\dadospdv\dados

já as imagens, ficariam ali, na pasta do executável da aplicação, com uma pasta com o nome de imagens:
C:\pasta\Pdv\imagens

Como que ficaria o código, juntando os caminhos do banco pra ficar com o número do código de barras num jpg?

Obrigado.


GOSTEI 0
Mayron Cachina

Mayron Cachina

28/09/2007

Blz, vamos lá....

1º esqueça o banco :D ele n servirá de nd pra a gente agora....


2º o método [b:c1a06bfc52]ExtractFilePath(Application.ExeName)[/b:c1a06bfc52] retorna uma String com o caminho do aplicativo... no seu exemplo o C:\pasta\Pdv, com isso vc pode levar seu aplicativo pra qualquer canto e ele vai reconhecer... se for em D:\ ou E:\, ele dará o caminho...

3º vamos a imagem...
O componente TImagem tem o método [b:c1a06bfc52]Picture.LoadFromFile(String)[/b:c1a06bfc52] aqui ele carrega uma imagem de um arquivo qualquer do tipo BMP... pra carregar um JPG vc tem q adicionar:
uses JPG;


pronto agora vamos a carregamento da imagem....
vc vai adicionar na procedure/funcao que vc ta fazendo a leitura no banco a seguinte linha:
var LocImg : String;
...
LocImg := ExtractFilePath(Application.ExeName)+´\imagens´; //variavel q vai guardar o caminho da sua aplicação.
Image1.Picture.LoadFromFile(LocImg + [b]COD_BARRA[/b] + ´.jpg´);
...

bem isso é um exemplo... onde tem [b:c1a06bfc52]COD_BARRA[/b:c1a06bfc52] vc vai colocar o numero/nome do arquivo que será lido pela imagem...

pronto, com isso acho que resolve... n esqueça de colocar o TImage no form :D


GOSTEI 0
Lucas_spohr

Lucas_spohr

28/09/2007

blz cara! quaaase deu certo!

só que... salvei uma imagem de um produto, com o nome 1212.jpg. Porém, na minha aplicação, ao fazer a busca da imagem, ela vai buscar pelo código de barra 0000000001212.jp´g

Pergunto:

Como que eu poderia fazer, para não buscar esses ´zeros´ no início do nome do *.jpg, buscando somente o 1212, forma com que eu salvei a imagem?

E o meu, muito obrigado!!!


GOSTEI 0
Mayron Cachina

Mayron Cachina

28/09/2007

0000000001212.jpg


o Padrão é esse mesmo???

vc pode usar o comando COPY()...
ele funciona assim....
Copy( String , INICIO , FIM )

com ele vc pode pegar so o 1212.jpg... para saber mais sobre ele olhe aqui http://www.delphibasics.co.uk/RTL.asp?Name=Copy

seguinte...n tenho como testar aqui mais usa esse codigo, se esse numero for padrão com os 00000 vai da certo...
Copy(COD_BARRA, 10,18)

bem acho que ai ta pegando so o 1212.jpg, se n tiver certo vc vai testando a sequencia de numeros... n deixe de ler essa página q eu passei ele explica o Copy,
Blz!?


GOSTEI 0
Adriano Santos

Adriano Santos

28/09/2007

var LocImg : String;
...
LocImg := ExtractFilePath(Application.ExeName)+´\imagens´; //variavel q vai guardar o caminho da sua aplicação.
Image1.Picture.LoadFromFile(LocImg + [b]COD_BARRA[/b] + ´.jpg´);
...
bem isso é um exemplo... onde tem [b:8cf1b1f6e1]COD_BARRA[/b:8cf1b1f6e1] vc vai colocar o numero/nome do arquivo que será lido pela imagem... pronto, com isso acho que resolve... n esqueça de colocar o TImage no form :D

Só um detalhe aqui, se me permitem, o ExtractFilePath(Application.ExeName) já retorna o diretório do executável com barra no final, ou seja, não é necessário concatenar com ´\imagens´. Talvez dê errinho ai, mas é moleza de resolver. :wink:

blz cara! quaaase deu certo! só que... salvei uma imagem de um produto, com o nome 1212.jpg. Porém, na minha aplicação, ao fazer a busca da imagem, ela vai buscar pelo código de barra 0000000001212.jp´g Pergunto: Como que eu poderia fazer, para não buscar esses ´zeros´ no início do nome do *.jpg, buscando somente o 1212, forma com que eu salvei a imagem? E o meu, muito obrigado!!!

Se for só números o nome da sua imagem dê uma formatada com a função StrToFloat(). Veja:

procedure TForm1.Button1Click(Sender: TObject);
var
  CodBarra : Integer;
  NomeFoto: string;
begin
  CodBarra := 0000123123;
  NomeFoto := FloatToStr(CodBarra);
  Edit1.Text := NomeFoto;
end;


Ou ainda criando uma função pra retirar os zeros e retornar já certinho o nome da imagem:

procedure TForm1.Button2Click(Sender: TObject);
var
  CodBarra : string;
  NomeFoto: string;
  function RetornaNomeFoto(ACodBarra: string): string;
  var
    I : Integer;
    S : string;
  begin
    for I := 1 to Length(ACodBarra) do
      if not (ACodBarra[I] = ´0´) then
        S := S + ACodBarra[I];
    Result := S;
  end;
begin
  CodBarra := ´0000123123´;
  NomeFoto := RetornaNomeFoto(CodBarra);
  Edit1.Text := NomeFoto;
end;



GOSTEI 0
Lucas_spohr

Lucas_spohr

28/09/2007

blz, Adriano!?

fiz um teste com a função que vc passou... Até que funcionou!

Mas como que eu poderia implementar este, em meu projeto? Desculpe, mas sou novato ainda na programação! ehehe complica mais, quando se é um projeto pronto, tendo que neste, fazer as alterações! hehe

LocImg := ExtractFilePath(Application.ExeName)+´\produtos\´;
Image2.Picture.LoadFromFile(LocImg + PDO.Produto.FIELDBYNAME(´BARRA´).AsString + ´.jpg´);

Desde já agradeço.
Obrigado!


GOSTEI 0
Lucas_spohr

Lucas_spohr

28/09/2007

digo.. implementar no projeto, no sentido de:

Após feita a função, daí no código acima, colocar a função junto do LocImg... etc, etc...

obrigado!


GOSTEI 0
Mayron Cachina

Mayron Cachina

28/09/2007

blz, Adriano!? fiz um teste com a função que vc passou... Até que funcionou! Mas como que eu poderia implementar este, em meu projeto? Desculpe, mas sou novato ainda na programação! ehehe complica mais, quando se é um projeto pronto, tendo que neste, fazer as alterações! hehe LocImg := ExtractFilePath(Application.ExeName)+´\produtos\´; Image2.Picture.LoadFromFile(LocImg + PDO.Produto.FIELDBYNAME(´BARRA´).AsString + ´.jpg´); Desde já agradeço. Obrigado!

Usa a função que o Adriano disse...
RetornaNomeFoto() e tira a barra do produtos como Adriano disse, deixando ele assim:
LocImg := ExtractFilePath(Application.ExeName)+´produtos\´;

vc pode usar a funcao assim:
LocImg := ExtractFilePath(Application.ExeName)+´produtos\´;
Image2.Picture.LoadFromFile(LocImg + RetornaNomeFoto(PDO.Produto.FIELDBYNAME(´BARRA´).AsString) + ´.jpg´);


para deixar o codigo menos confuso hehehehe:
LocImg := ExtractFilePath(Application.ExeName)+´produtos\´;
nomeFoto := RetornaNomeFoto(PDO.Produto.FIELDBYNAME(´BARRA´).AsString);
Image2.Picture.LoadFromFile(LocImg + nomeFoto + ´.jpg´);


eh isso Adriano? me corrija se tiver errado....
Tenta isso ae ...


GOSTEI 0
Lucas_spohr

Lucas_spohr

28/09/2007

Estou fazendo assim:

function RetornaNomeFoto(ACodBarra: string): string;
var
I : Integer;
S : string;
CodBarra : string;
NomeFoto: string;
begin
for I := 1 to Length(ACodBarra) do
if not (ACodBarra[I] = ´0´) then
S := S + ACodBarra[I];
Result := S;
CodBarra := PDO.Produto.fieldbyname(´BARRA´).AsString;
NomeFoto := RetornaNomeFoto(CodBarra);
end;

............

procedure...........
var .....
begin.....
RetornaNomeFoto(ACodBarra:string); // pra usar a Function
LocImg := ExtractFilePath(Application.ExeName)+´produtos\´;
nomeFoto := RetornaNomeFoto(PDO.Produto.FIELDBYNAME(´BARRA´).AsString);
Image2.Picture.LoadFromFile(LocImg + nomeFoto + ´.jpg´);
end;


Mas não compila!!

Eu digito o nome da função RetornaNomeFoto, daí depois do RetornaNomeFoto, dentro dos parenteses, aparece uma ´observação´ para escrever o ACodBarra:String, daí digito isso, e dá erro!!

O que estou fazendo de errado?

Obrigado!


GOSTEI 0
Mayron Cachina

Mayron Cachina

28/09/2007

function RetornaNomeFoto(ACodBarra: string): string;


n seria function TFORM1.RetornaNomeFoto......
TForm1 seria o nome de seu formulario...
vc ta declarando ele la na classe do form....

type
  Tform1 = class(TForm)
    ....
    function RetornaNomeFoto(ACodBarra: string): string; 
    ...



GOSTEI 0
Lucas_spohr

Lucas_spohr

28/09/2007

e agora, como que eu faço pra usar a function e passar os parâmetros??

parece tão simples isso! tenho que dar uma estudada nisso... (if, while, etc, etc). Aproveitando o tópico, gostaria de já ir perguntando algum material bom, que fale sobre isso...

Obrigado!


GOSTEI 0
Lucas_spohr

Lucas_spohr

28/09/2007

aee!!

Fiz da seguinte forma, com ajuda de um colega meu:

function RetornaNomeFoto(ACodBarra: string): string;
var
I : Integer;
S : string;
begin
for I := 1 to Length(ACodBarra) do
if not (ACodBarra[I] = ´0´) then
S := S + ACodBarra[I];
Result := S;
end;

// Para usar a function, etc, et...
RetornaNomeFoto(PDO.Produto.FieldByName(´BARRA´).AsString);
LocImg := ExtractFilePath(Application.ExeName)+´produtos\´;
Image2.Picture.LoadFromFile(LocImg + RetornaNomeFoto(PDO.Produto.FieldByName(´BARRA´).AsString) + ´.jpg´);


Só que agora, o que eu precisaria fazer, é o seguinte:

Exemplo:
Procuro pelo código de barras 109. Daí na imagem, a função está removendo o 0, ficando como 19.jpg. Como que eu poderia incrementar a minha function, fazendo com que elimine apenas os ´zeros´ iniciais, sem remover os ´zeros´ do ´meio´?

grato...


GOSTEI 0
Mayron Cachina

Mayron Cachina

28/09/2007

// Para usar a function, etc, et... [b:aa4d7b9a76] RetornaNomeFoto(PDO.Produto.FieldByName(´BARRA´).AsString);[/b:aa4d7b9a76] LocImg := ExtractFilePath(Application.ExeName)+´produtos\´; Image2.Picture.LoadFromFile(LocImg + RetornaNomeFoto(PDO.Produto.FieldByName(´BARRA´).AsString) + ´.jpg´);


o que está em negrito vc ta fazendo mais n ta guardando, então n ta adiantando de nada....

tenta usar a função COPY.. realmente essa função que o Adriano falou era pra tirar todos os 0 e isso n eh bom né :D
tenta usar o copy, como eu disse...
ai posta o resultado ai...


GOSTEI 0
Adriano Santos

Adriano Santos

28/09/2007

Pessoal,

É só dar uma adaptada. Ao invés de copiar cada caracter para uma variável basta apenas encontrar o primeiro caractere diferente de zero e mandar copiar dele +1 até o final da string:

function RetornaNomeFoto(ACodBarra: string): string;
var
  I : Integer;
  S : string;
begin
  for I := 1 to Length(ACodBarra) do
    if not (ACodBarra[I] = ´0´) then
    begin
      S := S + Copy(ACodBarra, I+1, Length(ACodBarra));
      Result := S;
      Break;
    end;
end; 

Estou sem Delphi aqui pra testar, mas é fácil de corrigir caso tenha erros. ;)


GOSTEI 0
Lucas_spohr

Lucas_spohr

28/09/2007

aeee!!

Consegui! Ficou assim:

function RetornaNomeFoto(ACodBarra: string): string;
var
I, Posicao : Integer;
begin
for I := 1 to Length(ACodBarra) do begin
if not (ACodBarra[I] = ´0´) then begin
Posicao := I;
Break;
end;
end;
Result := Copy(ACodBarra, Posicao, 13);
end;

LocImg := ExtractFilePath(Application.ExeName)+´produtos\´;
if (FileExists(LocImg + RetornaNomeFoto(PDO.Produto.FieldByName(´BARRA´).AsString) + ´.jpg´)) then
RetornaNomeFoto(PDO.Produto.FieldByName(´BARRA´).AsString);
Image2.Picture.LoadFromFile(LocImg + RetornaNomeFoto(PDO.Produto.FieldByName(´BARRA´).AsString) + ´.jpg´);
END
ELSE
BEGIN
SHOWMESSAGE(´CÓDIGO NÃO CADASTRADO DIGITE X´);
EDIT1.TEXT:=´´;
EDIT2.TEXT:=´´;
EDIT3.TEXT:=´´;
Image2.Destroy;


Só que, agora é o seguinte:
Quando digito o código de barras 1212, aparece o produto, preço e a imagem. Daí coloco um produto que não tenho cadastrado, aí limpa os edits e a imagem, normalmente. Mas daí depois disso, se eu for colocar novamente um produto com código de barras existente, dá erro, por causa da imagem! Access violation...

O que poderia ser? Há uma outra forma de limpar o TIMAGE, fora o Destroy? Pois acho que é aí o problema!

Obrigado!!!


GOSTEI 0
Mayron Cachina

Mayron Cachina

28/09/2007

image1.Picture := nil;


nunca use o destroy, ele vai detonar o seu componente... vc n vai poder mais usar ele :D


GOSTEI 0
Lucas_spohr

Lucas_spohr

28/09/2007

RESOLVIDO!

Obrigado a todos!

Qualquer coisa, posto aí...


GOSTEI 0
POSTAR