Percorrer controles em PageControls que estão dentro de PageControls.

Delphi

24/10/2016

Olá pessoal...

Possuo um PageControl com 10 TabSheets. Dentro de cada TabSheet possuo outro PageControl que possui de 1 a 3 TabSheets. Necessito fazer um loop percorrendo todos os Edits que estão em todos os PageControls internos (justamente nos quais estou com dúvidas).

Comecei a escrever o código mas estou "travado".

Se alguém puder dar uma luz, agradeço.

procedure TfrmPrincipal.TabSheetIterate;
var
  i, c: byte;
  
begin

      for i := 0 to pgcPages.PageCount - 1 do
          for c := 0 to pgcPages.Pages[i].ControlCount - 1 do
            begin
              if (pgcPages.Pages[i].Controls[c] is TPageControl) then
                begin

                  
                end;

            end;
        ;
end;
Adalberto Brasaca

Adalberto Brasaca

Curtidas 0

Melhor post

Npi Tecnologia

Npi Tecnologia

24/10/2016

Boa tarde Aldaberto!

Criei um formulário com um PageControl principal chamado PageControl1. Dentro dele criei dez abas. Dentro de cada aba criei mais um PageControl com três abas e dentro de cada aba criei três Edits. Criei um BitBtn e programei este botão assim:

procedure TForm1.PercorrePageControlClick(Sender: TObject);
var
  Contador1 : Integer;
  Contador2 : Integer;
  TabSheetExterno : Integer;
  TabSheetInterno : Integer;
  Edit : Integer;
begin
  for TabSheetExterno := 0 to Pred(PageControl1.PageCount) do
  begin
    PageControl1.Pages[TabSheetExterno].Caption := FormatFloat('000', TabSheetExterno + 1);

    for Contador1 := 0 to Pred(PageControl1.Pages[TabSheetExterno].ControlCount) do
    begin
      if (PageControl1.Pages[TabSheetExterno].Controls[Contador1] is TPageControl) then
      begin
        PageControl1.Pages[TabSheetExterno].Controls[Contador1].Hint := FormatFloat('000', TabSheetExterno + 1);

        for TabSheetInterno := 0 to Pred(TPageControl(PageControl1.Pages[TabSheetExterno].Controls[Contador1]).PageCount) do
        begin
          TPageControl(PageControl1.Pages[TabSheetExterno].Controls[Contador1]).Pages[TabSheetInterno].Caption
            := FormatFloat('000', TabSheetExterno + 1) + '-' + FormatFloat('000', TabSheetInterno + 1);

          Edit := 0;

          for Contador2 := 0 to Pred(TPageControl(PageControl1.Pages[TabSheetExterno].Controls[Contador1]).Pages[TabSheetInterno].ControlCount) do
          begin
            if (TPageControl(PageControl1.Pages[TabSheetExterno].Controls[Contador1]).Pages[TabSheetInterno].Controls[Contador2] is TEdit) then
            begin
              Inc(Edit);
              TEdit(TPageControl(PageControl1.Pages[TabSheetExterno].Controls[Contador1]).Pages[TabSheetInterno].Controls[Contador2]).Text :=
                FormatFloat('000', TabSheetExterno + 1) + '-' +
                FormatFloat('000', TabSheetInterno + 1) + '-' +
                FormatFloat('000', Edit);
            end;
          end;
        end;
      end;
    end;
  end;
end;


Este código percorre as abas do primeiro PageControl, dentro de cada aba ele percorre os seus componentes filhos, se ele achar um PageControl, vai percorrer as abas deste PageControl, dentro das abas ele vai percorrer os seus componentes procurando edits. Este meu código está alterando o caption das abas e o texto dos edit. Precisei utilizar um recurso chamado cast, para poder alterar as propriedades dos tabsheets e edits encontratos.

vê aí se te atende.
GOSTEI 5

Mais Respostas

Robson Morais

Robson Morais

24/10/2016

tente esse;

for i := pgcPages.ComponentCount -1 downto 0 do
begin
  if (pgcPages.Components[i] is TEdit) then
     (pgcPages.Components[i] as TEdit).text := ´´;
end;
GOSTEI 0
Adalberto Brasaca

Adalberto Brasaca

24/10/2016

Oi Robinho. Grato pelo retorno. Infelizmente esse código é somente para uma TabSheet. O que eu tenho é o seguinte:

Coloquei um PageControl no form. Criei 10 TabSheets. Em cada TabSheet em coloquei mais um PageControl que podem possuir de 1 a 3 TabSheets cada. Preciso percorrer todos os TqabSheets dos PageControls internos e verificar o que é TEdit (igual a terceira linha do seu código).

Abraço.
GOSTEI 0
Adalberto Brasaca

Adalberto Brasaca

24/10/2016

Acho que estou perto, mas ainda não está funcinando.

procedure TfrmPrincipal.TabSheetIterate;
var
  i, c, d: byte;
  pageControlInterno: TPageControl;
begin

      for i := 1 to pgcPages.PageCount - 1 do
            for c := 0 to pgcPages.Pages[i].ControlCount - 1 do
                  if (pgcPages.Pages[i].Controls[c] is TPageControl) then
                        begin
                              pageControlInterno := TPageControl(pgcPages.Pages[i].Controls[c]);
                              for d := 0 to pageControlInterno.PageCount - 1  do
                                    if (pageControlInterno.Pages[c].Controls[d] is TEdit) then
                                          ShowMessage('É Edit');
                                    
                       end;
         
end;
GOSTEI 0
Adalberto Brasaca

Adalberto Brasaca

24/10/2016

Oi Daniel. Boa tarde !

Era isso mesmo... SHOW DE BOLA !!! Muito, mas muito obrigado mesmo pelo retorno. Agora é somente adaptar ao que eu preciso.

Grande abraço.
GOSTEI 0
Npi Tecnologia

Npi Tecnologia

24/10/2016

Por nada Adalberto. Se der, vota (curte) na minha resposta. Obrigado!
GOSTEI 0
POSTAR