Analise sobre fig em botoes
Galera,
gostaria que voces me ajudassem com uma questao...
A questao eh a seguinte: em minha aplicacao tenho muitas figuras. Sendo elas distribuidas pelos botoes. Porem, os botoes de confirmar, cancelar e sair são sempre as mesmas figuras. Isso faz com que o projeto fique maior, correto?! A invés de já deixar no botao ( a figura ) em tempo de projeto, qual a maneira mais rapida e que nao torne o sistema tao grande?!
Obrigado a todos!
gostaria que voces me ajudassem com uma questao...
A questao eh a seguinte: em minha aplicacao tenho muitas figuras. Sendo elas distribuidas pelos botoes. Porem, os botoes de confirmar, cancelar e sair são sempre as mesmas figuras. Isso faz com que o projeto fique maior, correto?! A invés de já deixar no botao ( a figura ) em tempo de projeto, qual a maneira mais rapida e que nao torne o sistema tao grande?!
Obrigado a todos!
Tremonti
Curtidas 0
Respostas
Werlon Goulart
07/09/2007
Existe um utilitário q compacta Exes e Dll.... chama-se AsPack.
Ele consegue essa proeza compactando o cabeçalho do Exe, que é onde ficam as imagens e outros recursos que serão usados, conforme for necessitando ele vai descompactando de modo totalmente transparente.
Inclusive ele ´criptografa´ o Exe/Dll gerando um código indecifrável, o que contribui para a proteção do seu sistema.
Existem outros - inclusive gratuitos, mas não sei dizer o nome.
Aspack funciona em qquer Win....
Só q é pago.
Assim vc não terá mais q se preocupar com exes muito grandes.
Grande Abraço
Werlon Goulart
Ele consegue essa proeza compactando o cabeçalho do Exe, que é onde ficam as imagens e outros recursos que serão usados, conforme for necessitando ele vai descompactando de modo totalmente transparente.
Inclusive ele ´criptografa´ o Exe/Dll gerando um código indecifrável, o que contribui para a proteção do seu sistema.
Existem outros - inclusive gratuitos, mas não sei dizer o nome.
Aspack funciona em qquer Win....
Só q é pago.
Assim vc não terá mais q se preocupar com exes muito grandes.
Grande Abraço
Werlon Goulart
GOSTEI 0
Sistemald
07/09/2007
Cara eu uso um image list com as figuras que se repetem. acredito que seja uma das melhores soluções.
GOSTEI 0
Gandalf.nho
07/09/2007
Eu também uso um ImageList. Coloco-o num DataModule, referencio-o nos outros forms e pronto, as imagens estão à disposição.
GOSTEI 0
Tremonti
07/09/2007
Galera, mas como eu carrego uma imagem para um botao sendo que esta imagem se encontra em um imagelist?
Obrigado
Obrigado
GOSTEI 0
Gandalf.nho
07/09/2007
Os componentes que possuem acesso ao ImageList possuem uma propriedade que permite indicar qual ImageList deseja usar. Depois disso, é só usar a propriedade ImageIndex para indicar qual imagem da lista deseja usar.
GOSTEI 0
Tremonti
07/09/2007
gandalf.nho,
Gostaria de fazer uma funcao onde retornar a figura que esta na imagelist atraves de seu indice.
Por exemplo, tenho tres imagens no imagelist... gostaria de preencher o botao com a nro 2... como faço?
Obrigado
Gostaria de fazer uma funcao onde retornar a figura que esta na imagelist atraves de seu indice.
Por exemplo, tenho tres imagens no imagelist... gostaria de preencher o botao com a nro 2... como faço?
Obrigado
GOSTEI 0
Tremonti
07/09/2007
Da pra utilizar este codigo... porem nao fica transparente a figura no botao...
Alguem pode ajudar?
var s:TBitmap; begin s := TBitmap.Create; ImageList1.GetBitmap(0,s); SpeedButton1.Glyph := s; FreeAndNil(s); end;
Alguem pode ajudar?
GOSTEI 0
Wdrocha
07/09/2007
Tenho um aplicação com mts imagens, inúmeras nem são quantas são ao certo...
sei q são mts megas d imagens.....o q eu fiz...foi colocar tudo em uma dll e carrego as imagens em tempo de execução e só carrego qdo é necessário...dessa forma meu programa não ficou lento ou pesado na hora da inicialização, pois carrego apenas as imagens necessárias e depois usá-las as mesmas são liberadas, conforme a necessidade.
Acredito q mesmo colocando em um ImageList não resolverá seu problema, pois elas serão carregas na hora da inicialização do seu programa...
eu acho melhor usa dll, q vc pod carregar as imagens através do método LoadFromResourceStream e pelo nome da imagem ao invés de ficar passando o índice dela....isso pod deixar a manutenção complicada...
é só uma idéia... :-)
flw..
sei q são mts megas d imagens.....o q eu fiz...foi colocar tudo em uma dll e carrego as imagens em tempo de execução e só carrego qdo é necessário...dessa forma meu programa não ficou lento ou pesado na hora da inicialização, pois carrego apenas as imagens necessárias e depois usá-las as mesmas são liberadas, conforme a necessidade.
Acredito q mesmo colocando em um ImageList não resolverá seu problema, pois elas serão carregas na hora da inicialização do seu programa...
eu acho melhor usa dll, q vc pod carregar as imagens através do método LoadFromResourceStream e pelo nome da imagem ao invés de ficar passando o índice dela....isso pod deixar a manutenção complicada...
é só uma idéia... :-)
flw..
GOSTEI 0
Tremonti
07/09/2007
Legal... Mas nunca utilizei dll... pode me ajudar?
E no caso de usar imagelist, como faço pra deixar transparente?
Abracos
E no caso de usar imagelist, como faço pra deixar transparente?
Abracos
GOSTEI 0
Wdrocha
07/09/2007
Bom dia, vc pod criar um arquivo de Recursos para isso....pod ser um arquivo texto qualquer q será salvo com a extensão [b:f3b5ef662f].rc[/b:f3b5ef662f]
por exemplo, dentro do arquivo, vc colocará algo como,
[b:f3b5ef662f]
imgTeste RCDATA ´teste.jpg´
imgOther RCDATA ´other.png´[/b:f3b5ef662f]
[b:f3b5ef662f]Não esqueça de colocar este arquivo em uma pasta juntamente com as imgens.[/b:f3b5ef662f]
Agora vc terá q compilar este arquivo para q ele gere um [b:f3b5ef662f].res[/b:f3b5ef662f] e como isso será feito???
Pelo modo prompt, informe o seguinte comando, supondo q seu delphi esteja instalado em [b:f3b5ef662f]Arquivos de programas[/b:f3b5ef662f] ou [b:f3b5ef662f]Program Files[/b:f3b5ef662f] como é o meu caso q estou utilizando o Vista.
[b:f3b5ef662f]cd Program Files\Borland\Delphi7\Bin[/b:f3b5ef662f]
agora vc informará o seguinte comando :
[b:f3b5ef662f]brcc32.exe -v pathDaPasta\NomeDoArquivo.rc[/b:f3b5ef662f]
o compilador chamado brcc32.exe irá verificar se todas as imagens informadas estão dentro da pasta para que se possa gerar o arquivo de recursos q será usado pela DLL. Se ocorreu tudo perfeitamente, siga os próximos passos.
Delphi vá em ,File ---> New --->Other --->DLL Wizard.
No novo projeto q foi aberto,
abaixo da cláusula
Uses SysUtils, Classess;
{$R *.res}
[b:f3b5ef662f]{$R NomeDoArquivo.Res}[/b:f3b5ef662f]//Este arquivo foi gerado pelo compilador brcc32.exe, tem a extensão .Res e tem o mesmo nome do seu arquivo com extensão [.rc].
Basta compilar e sua DLL será gerada. :-)
agora, como incorporar isso ao seu projeto??? Como carregas essas imagens??? É o q veremos nos passos seguintes :
No seu projeto, o aconselho a criar uma constante, pois como o nome da DLL será referenciado inúmeras vezes, e este nome pod mudar, seria mt trabalhoso mudar todos os nomes, não é??
o nome q eu dei para este exemplo foi:
[b:f3b5ef662f]Const DLLIMAGENS = ´Nome.dll´;[/b:f3b5ef662f]
Obs : De preferência deixe esta DLL dentro da pasta do seu projeto.
agora, para finalizar, vamos carregar as imagens.
Com isso vc poderá criar DLL e usar nos seus projetos. :-)
espero ter ajudado...
flw
por exemplo, dentro do arquivo, vc colocará algo como,
[b:f3b5ef662f]
imgTeste RCDATA ´teste.jpg´
imgOther RCDATA ´other.png´[/b:f3b5ef662f]
[b:f3b5ef662f]Não esqueça de colocar este arquivo em uma pasta juntamente com as imgens.[/b:f3b5ef662f]
Agora vc terá q compilar este arquivo para q ele gere um [b:f3b5ef662f].res[/b:f3b5ef662f] e como isso será feito???
Pelo modo prompt, informe o seguinte comando, supondo q seu delphi esteja instalado em [b:f3b5ef662f]Arquivos de programas[/b:f3b5ef662f] ou [b:f3b5ef662f]Program Files[/b:f3b5ef662f] como é o meu caso q estou utilizando o Vista.
[b:f3b5ef662f]cd Program Files\Borland\Delphi7\Bin[/b:f3b5ef662f]
agora vc informará o seguinte comando :
[b:f3b5ef662f]brcc32.exe -v pathDaPasta\NomeDoArquivo.rc[/b:f3b5ef662f]
o compilador chamado brcc32.exe irá verificar se todas as imagens informadas estão dentro da pasta para que se possa gerar o arquivo de recursos q será usado pela DLL. Se ocorreu tudo perfeitamente, siga os próximos passos.
Delphi vá em ,File ---> New --->Other --->DLL Wizard.
No novo projeto q foi aberto,
abaixo da cláusula
Uses SysUtils, Classess;
{$R *.res}
[b:f3b5ef662f]{$R NomeDoArquivo.Res}[/b:f3b5ef662f]//Este arquivo foi gerado pelo compilador brcc32.exe, tem a extensão .Res e tem o mesmo nome do seu arquivo com extensão [.rc].
Basta compilar e sua DLL será gerada. :-)
agora, como incorporar isso ao seu projeto??? Como carregas essas imagens??? É o q veremos nos passos seguintes :
No seu projeto, o aconselho a criar uma constante, pois como o nome da DLL será referenciado inúmeras vezes, e este nome pod mudar, seria mt trabalhoso mudar todos os nomes, não é??
o nome q eu dei para este exemplo foi:
[b:f3b5ef662f]Const DLLIMAGENS = ´Nome.dll´;[/b:f3b5ef662f]
Obs : De preferência deixe esta DLL dentro da pasta do seu projeto.
agora, para finalizar, vamos carregar as imagens.
Procedure TfrmTeste.Teste(); Var DLL : THandle;//Conterá o endereço da DLL que estará em memória. PNG : TPNGObject; JPG : TJPEGImage; ResourceStream : TResourceStream; Begin JPG := TJPEGImage.Create(); PNG := TPNGObject.create(); DLL := LoadLibrary(PChar(DLLIMAGENS));//Carrega a DLL PNG.LoadFromResourceName(DLL, ´imgOther´);//Carrega a imagem com o nome imgOther. img1.picture.assign(PNG); ResourceStream := TResourceStream.Create(DLL, ´imgteste´, RT_RCDATA);//está é a imagem jpg. img2.Picture.Assign(JPG); FreeAndNil(ResourceStream);//Libera o objeto da memória. FreeAndNil(JPG);//Libera a variável JPG. FreeAndNil(PNG); FreeLibrary(DLL); MTexto.SetFocus; End; //******************************************************************************
Com isso vc poderá criar DLL e usar nos seus projetos. :-)
espero ter ajudado...
flw
GOSTEI 0
Lehapan
07/09/2007
Caro Tremonti,
Você pode utilizar o componente TImageList, para colocar as imagens, e o componente TActionList, incluindo TActions dentro do TActionList e após vincular a TAction ao seu botão (simplesmente ´botao.Action := NomeAction´), assim ele irá carregar automaticamente a imgem da Action para o botão.
PS: de uma olhada melhor em TActionList e TAction, pois são ferramentas EXCELENTES.
Espero ter ajudado.
Você pode utilizar o componente TImageList, para colocar as imagens, e o componente TActionList, incluindo TActions dentro do TActionList e após vincular a TAction ao seu botão (simplesmente ´botao.Action := NomeAction´), assim ele irá carregar automaticamente a imgem da Action para o botão.
PS: de uma olhada melhor em TActionList e TAction, pois são ferramentas EXCELENTES.
Espero ter ajudado.
GOSTEI 0
Tremonti
07/09/2007
[b:ebca54e140]lehapan,[/b:ebca54e140]
eu uso actionlista para varios componentes de meu projeto. Porem, as acoes nao sao as mesmas... sao diferentes... a unica coisa igual seria a figura mesmo.
Com o Action nao é possivel fazer isso...
Mesmo assim, obrigado!!!
[b:ebca54e140]WDRocha[/b:ebca54e140],
Vou dar uma estudada na sua solucao e te comunico.. Obrigado...
*tenho que mandar sempre a dll junto com o exe, correto?
eu uso actionlista para varios componentes de meu projeto. Porem, as acoes nao sao as mesmas... sao diferentes... a unica coisa igual seria a figura mesmo.
Com o Action nao é possivel fazer isso...
Mesmo assim, obrigado!!!
[b:ebca54e140]WDRocha[/b:ebca54e140],
Vou dar uma estudada na sua solucao e te comunico.. Obrigado...
*tenho que mandar sempre a dll junto com o exe, correto?
GOSTEI 0
Wdrocha
07/09/2007
Sim....a dll sempre tem q acompanhar o executável....
:-)
:-)
GOSTEI 0
Tremonti
07/09/2007
Qual a [color=green:03e4e3da2c]use[/color:03e4e3da2c] que tenho que declarar para poder usar TPNGObject?
Obrigado
Obrigado
GOSTEI 0
Tremonti
07/09/2007
Qual a [color=green:18c8bcca10]use[/color:18c8bcca10] que tenho que declarar para poder usar TPNGObject?
Obrigado
Obrigado
GOSTEI 0
Wdrocha
07/09/2007
Vc terá q instalar o componente PngButton...
é de um brasileiro e é ótimo...
é só procurar no google q vc encontra... :-)
flw..
é de um brasileiro e é ótimo...
é só procurar no google q vc encontra... :-)
flw..
GOSTEI 0
Tremonti
07/09/2007
Cara, pode me mandar por e-mail?
[b:38c3c67e26]fernando_tremonti@yahoo.com.br[/b:38c3c67e26]
Obrigado
[b:38c3c67e26]fernando_tremonti@yahoo.com.br[/b:38c3c67e26]
Obrigado
GOSTEI 0
Tremonti
07/09/2007
Cara, instalei
Mas nao to conseguindo usar codigo que me mandou...
Estou fazendo assim
Mas nao to conseguindo usar codigo que me mandou...
Estou fazendo assim
var DLL : THandle;//Conterá o endereço da DLL que estará em memória. PNG : TPNGButton; JPG : TJPEGImage; ResourceStream : TResourceStream; begin JPG := TJPEGImage.Create(); PNG := TPNGButton.Create(NIL); DLL := LoadLibrary(PChar(´dll.dll´));//Carrega a DLL PNG.ImageNormal.LoadFromResourceName( DLL, ´imgCancelar´ ); ResourceStream := TResourceStream.Create(DLL, ´CANCELAR.jpg´, RT_RCDATA);//está é a imagem jpg. Bota1.Glyph.Assign( JPG ); FreeAndNil(ResourceStream);//Libera o objeto da memória. FreeAndNil(JPG);//Libera a variável JPG. FreeAndNil(PNG); FreeLibrary(DLL);
GOSTEI 0
Wdrocha
07/09/2007
Boa tarde...
o erro está aq....
Não é [b:b0ea53e431]CANCELAR.jpg[/b:b0ea53e431], basta [b:b0ea53e431]CANCELAR[/b:b0ea53e431].
Se este for o nome que vc atribuiu..
por exemplo...
CANCELAR RCDATA cancel.jpg
vc irá chamar apenas pelo nome atribuído a imagem, no caso, CANCELAR.
Entendeu??
qualquer coisa...diz aew...
o erro está aq....
ResourceStream := TResourceStream.Create(DLL, ´CANCELAR.jpg´, RT_RCDATA);//está é a imagem jpg.
Não é [b:b0ea53e431]CANCELAR.jpg[/b:b0ea53e431], basta [b:b0ea53e431]CANCELAR[/b:b0ea53e431].
Se este for o nome que vc atribuiu..
por exemplo...
CANCELAR RCDATA cancel.jpg
vc irá chamar apenas pelo nome atribuído a imagem, no caso, CANCELAR.
Entendeu??
qualquer coisa...diz aew...
GOSTEI 0
Tremonti
07/09/2007
Cara,
Não deu certo...
Estou utilizando desta maneira...
Abracos
Não deu certo...
Estou utilizando desta maneira...
var DLL : THandle;//Conterá o endereço da DLL que estará em memória. PNG : TPNGButton; JPG : TJPEGImage; ResourceStream : TResourceStream; begin JPG := TJPEGImage.Create(); PNG := TPNGButton.Create(NIL); DLL := LoadLibrary(PChar(´dll.dll´));//Carrega a DLL PNG.ImageNormal.LoadFromResourceName( DLL, ´imgCancelar´ ); ResourceStream := TResourceStream.Create(DLL, ´imgCancelar´, RT_RCDATA);//está é a imagem jpg. Bota1.Glyph.Assign( JPG ); FreeAndNil(ResourceStream);//Libera o objeto da memória. FreeAndNil(JPG);//Libera a variável JPG. FreeAndNil(PNG); FreeLibrary(DLL);
Abracos
GOSTEI 0
Wdrocha
07/09/2007
antes de
Bota1.Glyph.Assign( JPG );
Deixe assim..
JPG.LoadFromStream(ResourceStream);//Joga na variável JPG a imagem recuperada da DLL.
Bota1.Glyph.Assign( JPG );
qualquer coisa..posta aew..
:-)
Bota1.Glyph.Assign( JPG );
Deixe assim..
JPG.LoadFromStream(ResourceStream);//Joga na variável JPG a imagem recuperada da DLL.
Bota1.Glyph.Assign( JPG );
qualquer coisa..posta aew..
:-)
GOSTEI 0
Tremonti
07/09/2007
Agora esta desta forma...
Mas continua me dando erro... Agora de JPeg
JPEG error #52
Abracos
[/img]
var DLL : THandle;//Conterá o endereço da DLL que estará em memória. PNG : TPNGButton; JPG : TJPEGImage; ResourceStream : TResourceStream; begin JPG := TJPEGImage.Create(); PNG := TPNGButton.Create(NIL); DLL := LoadLibrary(PChar(´dll.dll´));//Carrega a DLL ResourceStream := TResourceStream.Create(DLL, ´imgCancelar´, RT_RCDATA);//está é a imagem jpg. JPG.LoadFromStream(ResourceStream);//Joga na variável JPG a imagem recuperada da DLL. Bota1.Glyph.Assign( JPG ); FreeAndNil(ResourceStream);//Libera o objeto da memória. FreeAndNil(JPG);//Libera a variável JPG. FreeAndNil(PNG); FreeLibrary(DLL);
Mas continua me dando erro... Agora de JPeg
JPEG error #52
Abracos
[/img]
GOSTEI 0
Tremonti
07/09/2007
Agora esta desta forma...
Mas continua me dando erro... Agora de JPeg
JPEG error #52
Abracos
[/img]
var DLL : THandle;//Conterá o endereço da DLL que estará em memória. PNG : TPNGButton; JPG : TJPEGImage; ResourceStream : TResourceStream; begin JPG := TJPEGImage.Create(); PNG := TPNGButton.Create(NIL); DLL := LoadLibrary(PChar(´dll.dll´));//Carrega a DLL ResourceStream := TResourceStream.Create(DLL, ´imgCancelar´, RT_RCDATA);//está é a imagem jpg. JPG.LoadFromStream(ResourceStream);//Joga na variável JPG a imagem recuperada da DLL. Bota1.Glyph.Assign( JPG ); FreeAndNil(ResourceStream);//Libera o objeto da memória. FreeAndNil(JPG);//Libera a variável JPG. FreeAndNil(PNG); FreeLibrary(DLL);
Mas continua me dando erro... Agora de JPeg
JPEG error #52
Abracos
[/img]
GOSTEI 0
Tremonti
07/09/2007
Postei mais de uma vez... mas foi sem querer... deu erro na pagina... e apertei novamente..
Sorry!!! :oops:
Sorry!!! :oops:
GOSTEI 0
Wdrocha
07/09/2007
tem certeza q a imagem q vc tah carregando..é uma imagem jpg??
GOSTEI 0
Tremonti
07/09/2007
Puff... Não...
Mas agora ta funcionando...
O problema é a transparencia dele...
Como resolvo este problema?
Obrigado e Abraços
Mas agora ta funcionando...
O problema é a transparencia dele...
Como resolvo este problema?
Obrigado e Abraços
GOSTEI 0
Wdrocha
07/09/2007
transparência ond..??
no botão, na imagem??
no botão, na imagem??
GOSTEI 0
Tremonti
07/09/2007
na imagem...
por exemplo... quando eu capturo a imagem diretamente pelo Object Inspector... ele fica transparente o fundo...
Agora quando carrego assim, ele fica com a imagem total... fica feio...
Conseguiu entender?
por exemplo... quando eu capturo a imagem diretamente pelo Object Inspector... ele fica transparente o fundo...
Agora quando carrego assim, ele fica com a imagem total... fica feio...
Conseguiu entender?
GOSTEI 0
Tremonti
07/09/2007
Sera que é porque é BMP?
Existe alguma forma de ser feito isso com BMP?
Existe alguma forma de ser feito isso com BMP?
GOSTEI 0
Tremonti
07/09/2007
Cara...
Mudei pra este esquema...
Agora funciona...
Valewwwww!!!
:D
Mudei pra este esquema...
var DLL : THandle;//Conterá o endereço da DLL que estará em memória. BMP : TBitMap; ResourceStream : TResourceStream; begin BMP := TBitmap.Create(); DLL := LoadLibrary(PChar(´dll.dll´));//Carrega a DLL ResourceStream := TResourceStream.Create(DLL, ´imgCancelar´, RT_RCDATA);//está é a imagem jpg. BMP.LoadFromStream( ResourceStream ); Bota1.Glyph.Assign( BMP ); FreeAndNil(ResourceStream);//Libera o objeto da memória. FreeLibrary(DLL); FreeANDNIL( BMP ); end;
Agora funciona...
Valewwwww!!!
:D
GOSTEI 0
Wdrocha
07/09/2007
entendo...é pq sua imagem é bmp sim. Já q vc baixou o componente PNGButton..
vc pod utilizar este botão...vc pod utilizar imagens PNG com fundo transparente...e basta vc setar no botão sua propriedade ButtonStyle = pbsNoFrame, isso deixará o botão transparente e ele tomará a forma da sua imagem.
e paga carregar uma imagem da DLL para este botão, vc pod usar,
pngButton1.imageNormal.LoadFromResourceName ...
e vc tbm usar as propriedade imageDown(Imagem utlizada quando o usuáio clicar no botão), imageNormal(propriedade com a imagem padrão do botão) e ImageOver(imagem que será utilizada quando o usuário clicar no botão).
espero ter ajudado.
vc pod utilizar este botão...vc pod utilizar imagens PNG com fundo transparente...e basta vc setar no botão sua propriedade ButtonStyle = pbsNoFrame, isso deixará o botão transparente e ele tomará a forma da sua imagem.
e paga carregar uma imagem da DLL para este botão, vc pod usar,
pngButton1.imageNormal.LoadFromResourceName ...
e vc tbm usar as propriedade imageDown(Imagem utlizada quando o usuáio clicar no botão), imageNormal(propriedade com a imagem padrão do botão) e ImageOver(imagem que será utilizada quando o usuário clicar no botão).
espero ter ajudado.
GOSTEI 0
Tremonti
07/09/2007
Ajudou sim cara... E MUITO!!!
Mas eu não posso reformular todos os botões do meu projeto...
Vou utilizar os que já utilizo normalmente e vou só fazer a rotina de carregar a imagem pré-definida...
Novamente, obrigado!
Mas eu não posso reformular todos os botões do meu projeto...
Vou utilizar os que já utilizo normalmente e vou só fazer a rotina de carregar a imagem pré-definida...
Novamente, obrigado!
GOSTEI 0