Como colocar um ImageList em um SpeedButton

Delphi

11/06/2010

Pessoal estou criando um formulario para os usuarios montar seus proprios ShortCut e ai estou querendo ja deixar umas imagens carregados em um ImageList para que o usuario escolha, mas no SpeedButton nao tem como colocar um ImageList....

ou alguem tem um outra ideia para me ajudar ???
Robson Morais

Robson Morais

Curtidas 0

Respostas

Marco Salles

Marco Salles

11/06/2010

sei não...   Usar  um ActionList , definir neles as imagems ( Açoes comas respectivas Imagems)   Varrer Tipo dando um Next , Last , First , etc... essas açoes , associando respectivamente essas açoes no SpeedButton , não daria Certo ???   Pensei rápido , pode ser que tenha coisa melhor ( provável )   Mas não  funcionaria ?????
GOSTEI 0
Robson Morais

Robson Morais

11/06/2010

é as vezes nao ficaria legal mesmo,

entao mas alguem teria alguma ideia de como eu poderia fazer isso, pois eu estava pensando aqui em salvar images no banco de dados e ai o usuario buscar essa imagem la...
mas será que ficaria legal ????
GOSTEI 0
Marco Salles

Marco Salles

11/06/2010

beleza amigo , uma outra sugestão , mais Orientada a Objeto é usar uma classe para Fazer Isto   Aquela mesma Historia , defina uma Unit ( Não esquente pela quantidade de Uses do Seu Projeto , melhor isto do que codigos espalhados no Seu Form )   E escreva o Método abaixo    
unit uNomeDaSuaUnit;
interface
uses
Controls,Buttons;

Type
 TAcao= class
  private
    class function GetFIndice: Integer;
    class procedure SetFIndice(const Value: Integer);
    class procedure Execute(cSbn:TSpeedButton; cImageList:TImageList);
    property Indice:Integer read GetFIndice Write SetFIndice;

  public
   class procedure First(cSbn:TSpeedButton;cImageList:TImageList);
   class procedure Prior(cSbn:TSpeedButton; cImageList:TImageList);
   class procedure Next(cSbn:TSpeedButton; cImageList:TImageList);
   class procedure Last(cSbn:TSpeedButton;cImageList:TImageList);
 end;
 
implementation
{$WRITEABLECONST ON}
const
 FImageList:TImageList = nil;
 FSbn:TSpeedButton = nil;
 FIndice:integer = -1;
{$WRITEABLECONST OFF}

{ TAcao }
class procedure TAcao.Execute(cSbn:TSpeedButton; cImageList:TImageList);
begin
   cSbn.Glyph:=nil;
  // FImageList:= cImageList;
   cImageList.GetBitmap(FIndice,cSbn.Glyph);
end;

class procedure TAcao.First(cSbn:TSpeedButton; cImageList:TImageList);
begin
 FIndice:=0;
 Execute(cSbn,cImageList);
end;
 
class procedure TAcao.Last(cSbn:TSpeedButton; cImageList:TImageList);
begin
  FIndice:=cImageList.Count-1;
  Execute(cSbn,cImageList);
end;
class procedure TAcao.Next(cSbn:TSpeedButton; cImageList:TImageList);
begin
   if FIndice < cImageList.Count-1 then
        FIndice:=FIndice+1;
  Execute(cSbn,cImageList);
end;
class procedure TAcao.Prior(cSbn:TSpeedButton; cImageList:TImageList);
begin
  if FIndice > 0 then
        FIndice:=FIndice - 1;
   Execute(cSbn,cImageList);
end;
 

{****************************************************************************}

class function TAcao.GetFIndice: Integer;
begin
result:=FIndice;
end;
{*********************************************************************************** }

class procedure TAcao.SetFIndice(const Value: Integer);
begin
 FIndice:=Value;
end;

end.

  No formulári oque vc via usar essa Uses defina pode ser na Implementation ( Porque iremos trabaçhar com Métodos de Classe e Propriedades de Classe ) Não sera necessário Instanciar   Coloque o Seu SpeedButton e Seu ImageList ( Adione ao mesmo Varios Bitmaps acho que no formato 16X16)   Coloque quatro Botões para Teste com os Seguistes Captios  
procedure TForm3.btnPrimeiroClick(Sender: TObject);
begin
TAcao.First(SpeedButton1,ImageList1);
end;
procedure TForm3.btnAnteriorClick(Sender: TObject);
begin
TAcao.Prior(SpeedButton1,ImageList1);
end;
procedure TForm3.btnProximoClick(Sender: TObject);
begin
TAcao.Next(SpeedButton1,ImageList1);
end;
procedure TForm3.btnUltimoClick(Sender: TObject);
begin
TAcao.Last(SpeedButton1,ImageList1);
end;
  com isto vc consegue alterar os Glyph do seus SpeedButons em RumTime
GOSTEI 0
Marco Salles

Marco Salles

11/06/2010

beleza amigo , uma outra sugestão , mais Orientada a Objeto é usar uma classe para Fazer Isto   Aquela mesma Historia , defina uma Unit ( Não esquente pela quantidade de Uses do Seu Projeto , melhor isto do que codigos espalhados no Seu Form )   E escreva o Método abaixo    
unit uNomeDaSuaUnit;
interface
uses
Controls,Buttons;

Type
 TAcao= class
  private
    class function GetFIndice: Integer;
    class procedure SetFIndice(const Value: Integer);
    class procedure Execute(cSbn:TSpeedButton; cImageList:TImageList);
    property Indice:Integer read GetFIndice Write SetFIndice;

  public
   class procedure First(cSbn:TSpeedButton;cImageList:TImageList);
   class procedure Prior(cSbn:TSpeedButton; cImageList:TImageList);
   class procedure Next(cSbn:TSpeedButton; cImageList:TImageList);
   class procedure Last(cSbn:TSpeedButton;cImageList:TImageList);
 end;
 
implementation
{$WRITEABLECONST ON}
const
  FIndice:integer = -1;
{$WRITEABLECONST OFF}

{ TAcao }
class procedure TAcao.Execute(cSbn:TSpeedButton; cImageList:TImageList);
begin
   cSbn.Glyph:=nil;
  // FImageList:= cImageList;
   cImageList.GetBitmap(FIndice,cSbn.Glyph);
end;

class procedure TAcao.First(cSbn:TSpeedButton; cImageList:TImageList);
begin
 FIndice:=0;
 Execute(cSbn,cImageList);
end;
 
class procedure TAcao.Last(cSbn:TSpeedButton; cImageList:TImageList);
begin
  FIndice:=cImageList.Count-1;
  Execute(cSbn,cImageList);
end;
class procedure TAcao.Next(cSbn:TSpeedButton; cImageList:TImageList);
begin
   if FIndice < cImageList.Count-1 then
        FIndice:=FIndice+1;
  Execute(cSbn,cImageList);
end;
class procedure TAcao.Prior(cSbn:TSpeedButton; cImageList:TImageList);
begin
  if FIndice > 0 then
        FIndice:=FIndice - 1;
   Execute(cSbn,cImageList);
end;
 

{****************************************************************************}

class function TAcao.GetFIndice: Integer;
begin
result:=FIndice;
end;
{*********************************************************************************** }

class procedure TAcao.SetFIndice(const Value: Integer);
begin
 FIndice:=Value;
end;

end.

  No formulári oque vc via usar essa Uses defina pode ser na Implementation ( Porque iremos trabaçhar com Métodos de Classe e Propriedades de Classe ) Não sera necessário Instanciar   Coloque o Seu SpeedButton e Seu ImageList ( Adione ao mesmo Varios Bitmaps acho que no formato 16X16)   Coloque quatro Botões para Teste com os Seguistes Captios  
procedure TForm3.btnPrimeiroClick(Sender: TObject);
begin
TAcao.First(SpeedButton1,ImageList1);
end;
procedure TForm3.btnAnteriorClick(Sender: TObject);
begin
TAcao.Prior(SpeedButton1,ImageList1);
end;
procedure TForm3.btnProximoClick(Sender: TObject);
begin
TAcao.Next(SpeedButton1,ImageList1);
end;
procedure TForm3.btnUltimoClick(Sender: TObject);
begin
TAcao.Last(SpeedButton1,ImageList1);
end;
  com isto vc consegue alterar os Glyph do seus SpeedButons em RumTime
GOSTEI 0
Robson Morais

Robson Morais

11/06/2010

consegui resolver nessa maneira


SpeedButton1.Glyph.Assign(nil);
ImageList1.GetBitmap(0, SpeedButton1.Glyph);



mas a q voce passou vou testar também!
GOSTEI 0
Marco Salles

Marco Salles

11/06/2010

consegui resolver nessa maneira

SpeedButton1.Glyph.Assign(nil);
ImageList1.GetBitmap(0, SpeedButton1.Glyph);



mas a q voce passou vou testar também!
  perceba que esta Instrução faz parte do método execute

class procedure TAcao.Execute(cSbn:TSpeedButton; cImageList:TImageList);
begin
   cSbn.Glyph:=nil;
  // FImageList:= cImageList;
   cImageList.GetBitmap(FIndice,cSbn.Glyph);
end;
  So que implementado o método Last, Next , First , Prior ... Mas o Coração do método é exatamente esta Instrução
GOSTEI 0
POSTAR