Analise sobre fig em botoes

Delphi

07/09/2007

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!


Tremonti

Tremonti

Curtidas 0

Respostas

Werlon Goulart

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


GOSTEI 0
Sistemald

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

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

Tremonti

07/09/2007

Galera, mas como eu carrego uma imagem para um botao sendo que esta imagem se encontra em um imagelist?

Obrigado


GOSTEI 0
Gandalf.nho

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

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


GOSTEI 0
Tremonti

Tremonti

07/09/2007

Da pra utilizar este codigo... porem nao fica transparente a figura no botao...

var s:TBitmap;
begin
   s := TBitmap.Create;
   ImageList1.GetBitmap(0,s);
   SpeedButton1.Glyph := s;
   FreeAndNil(s);
end; 



Alguem pode ajudar?


GOSTEI 0
Wdrocha

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..


GOSTEI 0
Tremonti

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


GOSTEI 0
Wdrocha

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.





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

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.


GOSTEI 0
Tremonti

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?


GOSTEI 0
Wdrocha

Wdrocha

07/09/2007

Sim....a dll sempre tem q acompanhar o executável....

:-)


GOSTEI 0
Tremonti

Tremonti

07/09/2007

Qual a [color=green:03e4e3da2c]use[/color:03e4e3da2c] que tenho que declarar para poder usar TPNGObject?

Obrigado


GOSTEI 0
Tremonti

Tremonti

07/09/2007

Qual a [color=green:18c8bcca10]use[/color:18c8bcca10] que tenho que declarar para poder usar TPNGObject?

Obrigado


GOSTEI 0
Wdrocha

Wdrocha

07/09/2007

Vc terá q instalar o componente PngButton...

é de um brasileiro e é ótimo...


é só procurar no google q vc encontra... :-)

flw..


GOSTEI 0
Tremonti

Tremonti

07/09/2007

Cara, pode me mandar por e-mail?

[b:38c3c67e26]fernando_tremonti@yahoo.com.br[/b:38c3c67e26]

Obrigado


GOSTEI 0
Tremonti

Tremonti

07/09/2007

Cara, instalei

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

Wdrocha

07/09/2007

Boa tarde...

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

Tremonti

07/09/2007

Cara,

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

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..

:-)


GOSTEI 0
Tremonti

Tremonti

07/09/2007

Agora esta desta forma...

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

Tremonti

07/09/2007

Agora esta desta forma...

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

Tremonti

07/09/2007

Postei mais de uma vez... mas foi sem querer... deu erro na pagina... e apertei novamente..

Sorry!!! :oops:


GOSTEI 0
Wdrocha

Wdrocha

07/09/2007

tem certeza q a imagem q vc tah carregando..é uma imagem jpg??


GOSTEI 0
Tremonti

Tremonti

07/09/2007

Puff... Não...

Mas agora ta funcionando...

O problema é a transparencia dele...

Como resolvo este problema?

Obrigado e Abraços


GOSTEI 0
Wdrocha

Wdrocha

07/09/2007

transparência ond..??

no botão, na imagem??


GOSTEI 0
Tremonti

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?


GOSTEI 0
Tremonti

Tremonti

07/09/2007

Sera que é porque é BMP?

Existe alguma forma de ser feito isso com BMP?


GOSTEI 0
Tremonti

Tremonti

07/09/2007

Cara...

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

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.


GOSTEI 0
Tremonti

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!


GOSTEI 0
POSTAR