Executado comandos contido em uma variavel

Delphi

21/05/2008

Galera, estou com um problemão...

Tenho uma tela com 1500 imagens nela, dispostas em 30 linhas com 50 colunas. De acordo com resultado de uma seleção no banco preciso trocar algumas propriedades das imagens.
Exemplo: O banco me retorno a seguinte: QtdCol = 2 QtdLin = 2 , nesse caso preciso trocar a propriedade visible false para true das 4 imagens. Minha duvida é, como fazer pra referenciar a imagens dinamicamente tipo Imagem(posicao viriavel).visible := true; ou gerar uma variavel com o comando e mandar executar posteriormente sem dar erro no compilador?


Geison Pereira

Geison Pereira

Curtidas 0

Respostas

Ffabiop

Ffabiop

21/05/2008

Para acessar os objetos dinamicamente você pode procurar eles da seguinte forma:
TImage(FindComponent(´imagem ´+ IntToStr(seu índice))).Visible := false;



GOSTEI 0
Geison Pereira

Geison Pereira

21/05/2008

Para acessar os objetos dinamicamente você pode procurar eles da seguinte forma:
TImage(FindComponent(´imagem ´+ IntToStr(seu índice))).Visible := false;



ficou assim:
TImage(FindComponent(´Im´+RetornaNomeLinha(PosLin)+IntToStr(PosCol)).Visible := false;
deu a seguinte messagem de erro:
[Error] Netuno_MenuPrincipal.pas(1079): Undeclared identifier: ´Visible´
[Error] Netuno_MenuPrincipal.pas(1079): Incompatible types: ´TImage´ and ´Boolean´


GOSTEI 0
Bico

Bico

21/05/2008

Colega, faltou fechar um dos parênteses

TImage(FindComponent(´Im´+RetornaNomeLinha(PosLin)+IntToStr(PosCol))).Visible := false; 


Atenciosamente,
Fernando.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

21/05/2008

tente assim (só funciona se os nomes das imagens estiverem padronizados de alguma forma previamente sabida):
procedure TForm1.Button1Click(Sender: TObject);
var
  QtdLin, QtdCol: integer;
  icomp: integer;
  limg, cimg: integer;
begin
  QtdLin := StrToIntDef(Edit1.Text,1); // linhas a ´apagar´
  QtdCol := StrToIntDef(Edit2.Text,1); // colunas a ´apagar´

  for icomp := 0 to ControlCount-1 do
    if Controls[icomp] is TImage then
    begin
      // no meu caso, testei com 5 linhas por 5 colunas
      // e os nomes das imagens eram padronizados assim:
      // imgLC, onde L=linha e C=Coluna, pois eu tenho
      // linhas e colunas na casa das unidades.
      limg := strtointdef(copy(Controls[icomp].Name,4,1),0);
      cimg := strtointdef(copy(Controls[icomp].Name,5,1),0);
 
      // no seu caso, a padronização deveria ser:
      // imgLLCC, onde LL=linha e CC=Coluna, pois você tem
      // linhas e colunas na casa das dezenas.
      // por exemplo:
      //   - img0120, que diz que é a vigésima imagem da linha 1
      //   - img0308, que diz que é a oitava imagem da linha 3
      //   - img2506, que diz que é a sexta imagem da linha 25
      // por conta disso, a leitura desses valores deveria ser:
      // limg := strtointdef(copy(Controls[icomp].Name,4,2),0);
      // cimg := strtointdef(copy(Controls[icomp].Name,6,2),0);
 
      Controls[icomp].Visible := (limg > QtdLin) or (cimg > QtdCol);
    end;
end;

essa rotina que eu apresentei terá performance superior ao uso da FindComponent, pois a FindComponent fará a varredura dos componentes - utilizando um for, da mesma maneira que eu fiz - até achar o componente que você deseja. E você precisará fazer isso para cada componente que você irá esconder/exibir.
da forma que eu apresentei acima, a varredura será feita apenas 1 vez.

espero que ajude a resolver o seu problema.


GOSTEI 0
POSTAR