Componentes em tempo de execução.

Delphi

19/11/2010



Frederico Brigatte***

Frederico Brigatte***

Curtidas 0

Respostas

Frederico Brigatte***

Frederico Brigatte***

19/11/2010



[/qGostaria de saber se existe alguma maneira de automatizar a criação de componentes em tempo de execução.

Por exemplo. Fiz um código que cria 30 botões em tempo de execução utilizando For.

Utilizo esse código para definir a posição do botão:

Quando for menor que 10:

Left := 10;
Top := 30 + x * 30;

Quando for maior que 20:

Left := 100;
Top := 1 + (x - 9) * 30;

Quando for maior que 30:

Left := 190;
Top := 1 + (x - 19) * 30;

Foto em anexo.

Gostaria de automatizar o left e o  top.uote]
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

19/11/2010



[/qGostaria de saber se existe alguma maneira de automatizar a criação de componentes em tempo de execução.

Por exemplo. Fiz um código que cria 30 botões em tempo de execução utilizando For.

Utilizo esse código para definir a posição do botão:

Quando for menor que 10:

Left := 10;
Top := 30 + x * 30;

Quando for maior que 20:

Left := 100;
Top := 1 + (x - 9) * 30;

Quando for maior que 30:

Left := 190;
Top := 1 + (x - 19) * 30;

Foto em anexo.

Gostaria de automatizar o left e o  top.uote]


frederico.brigatte@itelefonica.com.br
GOSTEI 0
Wilson Junior

Wilson Junior

19/11/2010

Teste assim
Const
  LEFT_INICIO = 10;
  TOP_INICIO  = 1;
  LARGURA = 90;
  ALTURA  = 30;
  BOTAO_POR_COULUNA = 10;
var
  x: integer;
  Botao: TButton;
begin
  for x := 0 to 29 do
  begin
    Botao := TButton.Create( Self );
    Botao.Parent := Self;
    Botao.Caption := 'Botão ' + IntToStr( x + 1 );

    Botao.Left := LEFT_INICIO + ( (x div BOTAO_POR_COULUNA) * LARGURA );
    Botao.Top  := TOP_INICIO + ( (x mod BOTAO_POR_COULUNA) * ALTURA );
  end;
end;


Espero ter colaborado.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

19/11/2010

Teste assim
Const
  LEFT_INICIO = 10;
  TOP_INICIO  = 1;
  LARGURA = 90;
  ALTURA  = 30;
  BOTAO_POR_COULUNA = 10;
var
  x: integer;
  Botao: TButton;
begin
  for x := 0 to 29 do
  begin
    Botao := TButton.Create( Self );
    Botao.Parent := Self;
    Botao.Caption := 'Botão ' + IntToStr( x + 1 );

    Botao.Left := LEFT_INICIO + ( (x div BOTAO_POR_COULUNA) * LARGURA );
    Botao.Top  := TOP_INICIO + ( (x mod BOTAO_POR_COULUNA) * ALTURA );
  end;
end;


Espero ter colaborado.


Estou testando aqui. Esse Const coloco depois do Implementation?

O código que uso é esse:

procedure TForm1.Button1Click(Sender: TObject);
var
 x, x1, x2 : integer;
begin
for x := 1 to 30 do begin   // Cria botões de 1 a 10
 ArrayEdit[x] := TButton.Create(Self);
 ArrayEdit[x].Parent := Self;
 ArrayEdit[x].Caption := 'Mesa ' + IntToStr(x);
 ArrayEdit[x].OnMouseMove :=    ControlMouseMove;
 ArrayEdit[x].OnMouseDown :=    ControlMouseDown;
 ArrayEdit[x].OnMouseUp   :=    ControlMouseUp;

 if x <= 10 then
 Begin
  ArrayEdit[x].Left := 10;
  ArrayEdit[x].Top := 30 + x * 30;
 end;

 if x > 10 then
 Begin
  ArrayEdit[x].Left := 100;
  ArrayEdit[x].Top := 1 + (x - 9) * 30;
 end;

 if x > 20 then
 Begin
  ArrayEdit[x].Left := 190;
  ArrayEdit[x].Top := 1 + (x - 19) * 30;
 end;


end;

GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

19/11/2010

Teste assim
Const
  LEFT_INICIO = 10;
  TOP_INICIO  = 1;
  LARGURA = 90;
  ALTURA  = 30;
  BOTAO_POR_COULUNA = 10;
var
  x: integer;
  Botao: TButton;
begin
  for x := 0 to 29 do
  begin
    Botao := TButton.Create( Self );
    Botao.Parent := Self;
    Botao.Caption := 'Botão ' + IntToStr( x + 1 );

    Botao.Left := LEFT_INICIO + ( (x div BOTAO_POR_COULUNA) * LARGURA );
    Botao.Top  := TOP_INICIO + ( (x mod BOTAO_POR_COULUNA) * ALTURA );
  end;
end;


Espero ter colaborado.


Estou testando aqui. Esse Const coloco depois do Implementation?



Mais uma dúvida, caso queira colocar uma imagem no botão, é possível? Poderia comentarexplicar como foi feito e caso queira preencher o form todo sem ter a barra de rolagem, tbém é possível?

GOSTEI 0
Wilson Junior

Wilson Junior

19/11/2010

Deve ser utilizado o TBitBtn para ter imagem.
Teste assim:
procedure TForm1.Button1Click(Sender: TObject);
Const
  LEFT_INICIO = 10;
  TOP_INICIO  = 1;
  LARGURA = 90;
  ALTURA  = 30;
  BOTAO_POR_COULUNA = 10;
var
  x: integer;
  Botao: TButton;
begin
  for x := 0 to 29 do
  begin
    ArrayEdit[x] := TBitBtn.Create( Self );
    ArrayEdit[x].Parent := Self;
    ArrayEdit[x].Caption := 'Mesa ' + IntToStr( x );
    ArrayEdit[x].OnMouseMove := ControlMouseMove;
    ArrayEdit[x].OnMouseDown := ControlMouseDown;
    ArrayEdit[x].OnMouseUp   := ControlMouseUp;
    ArrayEdit[x].Left := LEFT_INICIO + ( (x div BOTAO_POR_COULUNA) * LARGURA );
    ArrayEdit[x].Top  := TOP_INICIO + ( (x mod BOTAO_POR_COULUNA) * ALTURA );

    ArrayEdit[x].Glyph.LoadFromFile( 'C:\MinhaImagem' + IntToStr(x) + '.bmp' );
  end;
end;


Espero ter colaborado.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

19/11/2010

Deve ser utilizado o TBitBtn para ter imagem.
Teste assim:
procedure TForm1.Button1Click(Sender: TObject);
Const
  LEFT_INICIO = 10;
  TOP_INICIO  = 1;
  LARGURA = 90;
  ALTURA  = 30;
  BOTAO_POR_COULUNA = 10;
var
  x: integer;
  Botao: TButton;
begin
  for x := 0 to 29 do
  begin
    ArrayEdit[x] := TBitBtn.Create( Self );
    ArrayEdit[x].Parent := Self;
    ArrayEdit[x].Caption := 'Mesa ' + IntToStr( x );
    ArrayEdit[x].OnMouseMove := ControlMouseMove;
    ArrayEdit[x].OnMouseDown := ControlMouseDown;
    ArrayEdit[x].OnMouseUp   := ControlMouseUp;
    ArrayEdit[x].Left := LEFT_INICIO + ( (x div BOTAO_POR_COULUNA) * LARGURA );
    ArrayEdit[x].Top  := TOP_INICIO + ( (x mod BOTAO_POR_COULUNA) * ALTURA );

    ArrayEdit[x].Glyph.LoadFromFile( 'C:\MinhaImagem' + IntToStr(x) + '.bmp' );
  end;
end;


Espero ter colaborado.


Ok, e se quiser o form todo com botão sem que apareça as barras de rolagens?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

19/11/2010

Deve ser utilizado o TBitBtn para ter imagem.
Teste assim:
procedure TForm1.Button1Click(Sender: TObject);
Const
  LEFT_INICIO = 10;
  TOP_INICIO  = 1;
  LARGURA = 90;
  ALTURA  = 30;
  BOTAO_POR_COULUNA = 10;
var
  x: integer;
  Botao: TButton;
begin
  for x := 0 to 29 do
  begin
    ArrayEdit[x] := TBitBtn.Create( Self );
    ArrayEdit[x].Parent := Self;
    ArrayEdit[x].Caption := 'Mesa ' + IntToStr( x );
    ArrayEdit[x].OnMouseMove := ControlMouseMove;
    ArrayEdit[x].OnMouseDown := ControlMouseDown;
    ArrayEdit[x].OnMouseUp   := ControlMouseUp;
    ArrayEdit[x].Left := LEFT_INICIO + ( (x div BOTAO_POR_COULUNA) * LARGURA );
    ArrayEdit[x].Top  := TOP_INICIO + ( (x mod BOTAO_POR_COULUNA) * ALTURA );

    ArrayEdit[x].Glyph.LoadFromFile( 'C:\MinhaImagem' + IntToStr(x) + '.bmp' );
  end;
end;


Espero ter colaborado.


Ok, e se quiser o form todo com botão sem que apareça as barras de rolagens?


E se quiser o form todo e sem que apareça as barras re rolagem horizontal e vertical. Que redimensione o form automático.

Está quase lá.
GOSTEI 0
Wilson Junior

Wilson Junior

19/11/2010

Tente assim
procedure TForm1.Button1Click(Sender: TObject);
Const
  LEFT_INICIO = 10;
  TOP_INICIO  = 1;
  LARGURA = 90;
  ALTURA  = 30;
  BOTAO_POR_COULUNA = 10;
var
  x: integer;
  Botao: TButton;
begin
  for x := 0 to 29 do
  begin
    ArrayEdit[x] := TBitBtn.Create( Self );
    ArrayEdit[x].Parent := Self;
    ArrayEdit[x].Caption := 'Mesa ' + IntToStr( x );
    ArrayEdit[x].OnMouseMove := ControlMouseMove;
    ArrayEdit[x].OnMouseDown := ControlMouseDown;
    ArrayEdit[x].OnMouseUp   := ControlMouseUp;
    ArrayEdit[x].Left := LEFT_INICIO + ( (x div BOTAO_POR_COULUNA) * LARGURA );
    ArrayEdit[x].Top  := TOP_INICIO + ( (x mod BOTAO_POR_COULUNA) * ALTURA );

    ArrayEdit[x].Glyph.LoadFromFile( 'C:\MinhaImagem' + IntToStr(x) + '.bmp' );
  end;

  x := Length(ArrayEdit) - 1;
  Self.Width := LEFT_INICIO + ArrayEdit[x].Left + LARGURA );
  if  x > BOTAO_POR_COULUNA then
      x := BOTAO_POR_COULUNA
  ;
  Self.Height := TOP_INICIO + ArrayEdit[x].Top  + ALTURA;
end;


Espero ter colaborado.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

19/11/2010

Tente assim
procedure TForm1.Button1Click(Sender: TObject);
Const
  LEFT_INICIO = 10;
  TOP_INICIO  = 1;
  LARGURA = 90;
  ALTURA  = 30;
  BOTAO_POR_COULUNA = 10;
var
  x: integer;
  Botao: TButton;
begin
  for x := 0 to 29 do
  begin
    ArrayEdit[x] := TBitBtn.Create( Self );
    ArrayEdit[x].Parent := Self;
    ArrayEdit[x].Caption := 'Mesa ' + IntToStr( x );
    ArrayEdit[x].OnMouseMove := ControlMouseMove;
    ArrayEdit[x].OnMouseDown := ControlMouseDown;
    ArrayEdit[x].OnMouseUp   := ControlMouseUp;
    ArrayEdit[x].Left := LEFT_INICIO + ( (x div BOTAO_POR_COULUNA) * LARGURA );
    ArrayEdit[x].Top  := TOP_INICIO + ( (x mod BOTAO_POR_COULUNA) * ALTURA );

    ArrayEdit[x].Glyph.LoadFromFile( 'C:\MinhaImagem' + IntToStr(x) + '.bmp' );
  end;

  x := Length(ArrayEdit) - 1;
  Self.Width := LEFT_INICIO + ArrayEdit[x].Left + LARGURA );
  if  x > BOTAO_POR_COULUNA then
      x := BOTAO_POR_COULUNA
  ;
  Self.Height := TOP_INICIO + ArrayEdit[x].Top  + ALTURA;
end;


Espero ter colaborado.


Para esse exemplo como ficaria:

Const
  LEFT_INICIO = 10;
  TOP_INICIO  = 1;
  LARGURA = 90;
  ALTURA  = 30;
  BOTAO_POR_COULUNA = 10;
var
  x: integer;
  Botao: TButton;
begin
  for x := 0 to 29 do
  begin
    Botao := TButton.Create( Self );
    Botao.Parent := Self;
    Botao.Caption := 'Botão ' + IntToStr( x + 1 );

    Botao.Left := LEFT_INICIO + ( (x div BOTAO_POR_COULUNA) * LARGURA );
    Botao.Top  := TOP_INICIO + ( (x mod BOTAO_POR_COULUNA) * ALTURA );
  end;
end;


GOSTEI 0
Wilson Junior

Wilson Junior

19/11/2010

Tente assim
Const
  LEFT_INICIO = 10;
  TOP_INICIO  = 1;
  LARGURA = 90;
  ALTURA  = 30;
  BOTAO_POR_COULUNA = 10;
var
  x, Ate: integer;
  Botao: TButton;
begin
  Ate := 29;
  for x := 0 to Ate do
  begin
    Botao := TButton.Create( Self );
    Botao.Parent := Self;
    Botao.Caption := 'Botão ' + IntToStr( x + 1 );

    Botao.Left := LEFT_INICIO + ( (x div BOTAO_POR_COULUNA) * LARGURA );
    Botao.Top  := TOP_INICIO + ( (x mod BOTAO_POR_COULUNA) * ALTURA );
  end;


  Self.Width := LEFT_INICIO + Botao.Left + LARGURA;
  if  Ate > BOTAO_POR_COULUNA then
      Ate := BOTAO_POR_COULUNA
  ;
  Self.Height := TOP_INICIO + ( (Ate mod BOTAO_POR_COULUNA) * ALTURA ) + ALTURA;
end;


Espero ter colaborado.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

19/11/2010

Tente assim
Const
  LEFT_INICIO = 10;
  TOP_INICIO  = 1;
  LARGURA = 90;
  ALTURA  = 30;
  BOTAO_POR_COULUNA = 10;
var
  x, Ate: integer;
  Botao: TButton;
begin
  Ate := 29;
  for x := 0 to Ate do
  begin
    Botao := TButton.Create( Self );
    Botao.Parent := Self;
    Botao.Caption := 'Botão ' + IntToStr( x + 1 );

    Botao.Left := LEFT_INICIO + ( (x div BOTAO_POR_COULUNA) * LARGURA );
    Botao.Top  := TOP_INICIO + ( (x mod BOTAO_POR_COULUNA) * ALTURA );
  end;


  Self.Width := LEFT_INICIO + Botao.Left + LARGURA;
  if  Ate > BOTAO_POR_COULUNA then
      Ate := BOTAO_POR_COULUNA
  ;
  Self.Height := TOP_INICIO + ( (Ate mod BOTAO_POR_COULUNA) * ALTURA ) + ALTURA;
end;


Espero ter colaborado.


Deu erro, ficou assim ao executar:


GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

19/11/2010

Tente assim
Const
  LEFT_INICIO = 10;
  TOP_INICIO  = 1;
  LARGURA = 90;
  ALTURA  = 30;
  BOTAO_POR_COULUNA = 10;
var
  x, Ate: integer;
  Botao: TButton;
begin
  Ate := 29;
  for x := 0 to Ate do
  begin
    Botao := TButton.Create( Self );
    Botao.Parent := Self;
    Botao.Caption := 'Botão ' + IntToStr( x + 1 );

    Botao.Left := LEFT_INICIO + ( (x div BOTAO_POR_COULUNA) * LARGURA );
    Botao.Top  := TOP_INICIO + ( (x mod BOTAO_POR_COULUNA) * ALTURA );
  end;


  Self.Width := LEFT_INICIO + Botao.Left + LARGURA;
  if  Ate > BOTAO_POR_COULUNA then
      Ate := BOTAO_POR_COULUNA
  ;
  Self.Height := TOP_INICIO + ( (Ate mod BOTAO_POR_COULUNA) * ALTURA ) + ALTURA;
end;


Espero ter colaborado.


Deu erro, ficou assim ao executar:




Nenhuma resposta?
GOSTEI 0
Marcos Iwazaki

Marcos Iwazaki

19/11/2010

Amigo... o unico problema ae é o seu calculo p achar a altura do form...
se vc testar vai ver q o form fica com pouca altura...
GOSTEI 0
Wilson Junior

Wilson Junior

19/11/2010

Eu não cheguei a testar, mas altere a linha
Self.Height := TOP_INICIO + ( (Ate mod BOTAO_POR_COULUNA) * ALTURA ) + ALTURA + 40;


Espero ter colaborado.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

19/11/2010

Eu não cheguei a testar, mas altere a linha
Self.Height := TOP_INICIO + ( (Ate mod BOTAO_POR_COULUNA) * ALTURA ) + ALTURA + 40;


Espero ter colaborado.


Agora ficou assim, troquei a linha, conforme pedido.


GOSTEI 0
Wilson Junior

Wilson Junior

19/11/2010

Agora eu testei
Const
  LEFT_INICIO = 10;
  TOP_INICIO  = 15;
  LARGURA = 90;
  ALTURA  = 30;
  BOTAO_POR_COULUNA = 10;
var
  x, Ate: integer;
  Botao: TButton;
begin
  Ate := 29;
  for x := 0 to Ate do
  begin
    Botao := TButton.Create( Self );
    Botao.Parent := Self;
    Botao.Caption := 'Botão ' + IntToStr( x + 1 );

    Botao.Left := LEFT_INICIO + ( (x div BOTAO_POR_COULUNA) * LARGURA );
    Botao.Top  := TOP_INICIO + ( (x mod BOTAO_POR_COULUNA) * ALTURA );
  end;



  Self.Width := LEFT_INICIO + Botao.Left + LARGURA;
  if  Ate > BOTAO_POR_COULUNA then
      Ate := BOTAO_POR_COULUNA
  ;
  Self.Height := TOP_INICIO + ( Ate * ALTURA ) + ALTURA + TOP_INICIO;
end;


Espero ter colaborado.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

19/11/2010

Agora eu testei
Const
  LEFT_INICIO = 10;
  TOP_INICIO  = 15;
  LARGURA = 90;
  ALTURA  = 30;
  BOTAO_POR_COULUNA = 10;
var
  x, Ate: integer;
  Botao: TButton;
begin
  Ate := 29;
  for x := 0 to Ate do
  begin
    Botao := TButton.Create( Self );
    Botao.Parent := Self;
    Botao.Caption := 'Botão ' + IntToStr( x + 1 );

    Botao.Left := LEFT_INICIO + ( (x div BOTAO_POR_COULUNA) * LARGURA );
    Botao.Top  := TOP_INICIO + ( (x mod BOTAO_POR_COULUNA) * ALTURA );
  end;



  Self.Width := LEFT_INICIO + Botao.Left + LARGURA;
  if  Ate > BOTAO_POR_COULUNA then
      Ate := BOTAO_POR_COULUNA
  ;
  Self.Height := TOP_INICIO + ( Ate * ALTURA ) + ALTURA + TOP_INICIO;
end;


Espero ter colaborado.


Quero que as barras não apareçam, que fique sem elas, entendeu? Mas está quase lá.


GOSTEI 0
Marcos Iwazaki

Marcos Iwazaki

19/11/2010

É so adicionar mais width e heigth 
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

19/11/2010

É so adicionar mais width e heigth 


Coloquei assim:

  form1.HorzScrollBar.Visible := False;
GOSTEI 0
Wilson Junior

Wilson Junior

19/11/2010

Bom, testei o código e funcionou perfeitamente.
Verifique se você alterou as propriedades do Form. Pois somente criei um formulário e não alterei nenhuma propriedade do mesmo.

Espero ter colaborado.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

19/11/2010

Bom, testei o código e funcionou perfeitamente.
Verifique se você alterou as propriedades do Form. Pois somente criei um formulário e não alterei nenhuma propriedade do mesmo.

Espero ter colaborado.


Também não alterei nada.
GOSTEI 0
Wilson Junior

Wilson Junior

19/11/2010

Coloquei o tamanho do formulário com 150x150 e no eveto OnShow coloquei o código.
Apareceu este formulário:




Espero ter colaborado.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

19/11/2010

Coloquei o tamanho do formulário com 150x150 e no eveto OnShow coloquei o código.
Apareceu este formulário:




Espero ter colaborado.


É, fazendo igual ao seu, realmente funcionou. Só que da um warning:

[Warning] UFuncionando.pas(51): Variable 'Botao' might not have been initialized. O que pode ser isso? Aproveitando, posso tirar mais uma última dúvida?
GOSTEI 0
Pietro Braga

Pietro Braga

19/11/2010

Quer dizer que foi criada uma variavel chamada botao no código e nunca foi usada, não é problema. Já usou delphi antes?
GOSTEI 0
Wilson Junior

Wilson Junior

19/11/2010

A questão é que se você não criar nenhum botão, ou seja, não entrar dentro do FOR, ocorrerá um erro, pois a variável botão nunca foi inicializada. O compilador lhe da um WARNING lhe alertando que pode ocorrer um erro no seu sistema, mas como disse, isto somente ocorrerá se você não criar nenhum botão.
Para ocorrer o erro, coloque a variável "Ate" com o valor de -1 e execute o programa, lhe dará um "Access violation" como erro.

Espero ter colaborado.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

19/11/2010

A questão é que se você não criar nenhum botão, ou seja, não entrar dentro do FOR, ocorrerá um erro, pois a variável botão nunca foi inicializada. O compilador lhe da um WARNING lhe alertando que pode ocorrer um erro no seu sistema, mas como disse, isto somente ocorrerá se você não criar nenhum botão.
Para ocorrer o erro, coloque a variável "Ate" com o valor de -1 e execute o programa, lhe dará um "Access violation" como erro.

Espero ter colaborado.


Ok. A outra dúvida é como fazer um sistema que ao colocar em outra máquina, ajustar os forms com os componentes para o monitor da máquina onde estou colocando o sistema. No meu computador fica certo, quando vou colocar em outro, fica todo desconfigurado. Poderia me ajudar com esse outro problema?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

19/11/2010

Quer dizer que foi criada uma variavel chamada botao no código e nunca foi usada, não é problema. Já usou delphi antes?


Sim, só queria uma explicação sobre isso.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

19/11/2010

A questão é que se você não criar nenhum botão, ou seja, não entrar dentro do FOR, ocorrerá um erro, pois a variável botão nunca foi inicializada. O compilador lhe da um WARNING lhe alertando que pode ocorrer um erro no seu sistema, mas como disse, isto somente ocorrerá se você não criar nenhum botão.
Para ocorrer o erro, coloque a variável "Ate" com o valor de -1 e execute o programa, lhe dará um "Access violation" como erro.

Espero ter colaborado.


Ok. A outra dúvida é como fazer um sistema que ao colocar em outra máquina, ajustar os forms com os componentes para o monitor da máquina onde estou colocando o sistema. No meu computador fica certo, quando vou colocar em outro, fica todo desconfigurado. Poderia me ajudar com esse outro problema?


Redimensionar um form e os objetos tipo edit, buttons, etc manter suas posições e tamanhos, ou seja, redimensionando junto.

É possível? Exemplo se possível aqui, preciso muito.
GOSTEI 0
Wilson Junior

Wilson Junior

19/11/2010

GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

19/11/2010



Teria um exemplo simples para dispor? Agradeceria muito.
GOSTEI 0
POSTAR