Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

carcleo

Nomeando edits via for

Mensagens Recomendadas

carcleo

Pessoal.

Bom dia!

Preciso de um help aqui:

Tenho 12 edits (e 2 buttons) no form nomeados assim:

edit0, edit1..............edit12.

Mas queria chamá-los pela ordem de criação e não pelo name

tipo assim:

for i := 1 to n do
  begin
    edits[i].Text := IntToStr(i+1) ;
    edits[i].Font.Color := clBlack ;
  end ;                               

O que há de errado nessa forma?

Esta dando erro:

principal.pas(51,11) Error: Identifier not found "edits"

Editado por nunopicado
Adicionadas tags GeShi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

O que acontece é que não tens nenhum controlo chamado edits, e portanto, erro.

Para fazeres como tens, seria necessário que todos os teus edits fizessem parte de um array, que depois chamarias com o . Não é o caso, logo, erro.

Tens duas hipoteses de chamar os controlos dentro do FOR.

1. Crias os edits dinamicamente em runtime, dentro de um array:

// Declaração
var
  Edits:Array [1..12] of TEdit;
.
.
.
// Criação
for i:=1 to 12 do
  begin
     Edits[i]:=TEdit.Create(Self);
     with Edits[i] do
        begin
           Parent:=form1;
           Name:='Edit'+IntToStr(i);
           Width:=100; // Exemplo
           Height:=20; // Exemplo
           Text:='';
        end;
  end;   

E neste caso já podias chama-los dessa forma. Note-se que para isto, tens de cria-los e dispô-los todos 'à unha', não pode ser por arrasto para a form.

2. Usar o método FindComponent da própria form:

var
  tmpEdit:TEdit;
.
.
.
begin
for i := 1 to n do
  begin
    tmpEdit:=(FindComponent('edit'+IntToStr(i)) AS TEdit);
    if Assigned(tmpEdit)
       then begin
               Text := IntToStr(i+1) ;
               Font.Color := clBlack ;
            end;
  end ;  
tmpEdit:=nil;  

Ou seja, não acedes directamente ao TEdit, antes procuras na form um component com esse nome, depois testa se encontrou com o Assigned, e se sim, usa-o.

Editado por nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
carcleo

Vou tentar adaptar aqui,

a unit toda é\;

unit principal;

{$mode objfpc}{$H+}

interface

uses
 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

 { TForm1 }

 TForm1 = class(TForm)
   Button13: TButton;
   Button14: TButton;
   Edit1: TEdit;
   Edit2: TEdit;
   Edit3: TEdit;
   Edit4: TEdit;
   Edit5: TEdit;
   Edit6: TEdit;
   Edit7: TEdit;
   Edit8: TEdit;
   Edit9: TEdit;
   Edit10: TEdit;
   Edit11: TEdit;
   Edit12: TEdit;
   procedure Button14Click(Sender: TObject);
 private
   { private declarations }
 public
   { public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.lfm}
procedure Crivo () ;
const
 Asize : integer = 12 ;
var
 n , i , j : integer ;
begin
n := Asize ;
for i := 1 to n do
  begin
    edits[i].Text := IntToStr(i+1) ;
    edits[i].Font.Color := clBlack ;
  end ;
  edits[0].Font.Color := clBlue ;
  for i := 2 to n do
  if edits[i-1].Font.Color = clBlack then
  begin
  j := i * i ;
  if ( j > n) then
   break ;
  while j <= n do
   begin
    edits[j-1].Font.Color := clBlue ;
    j := j + i ;
   end ;
 end ;
end ;

{ TForm1 }

procedure TForm1.Button14Click(Sender: TObject);
begin
 Crivo();
end;

end.

Agora deu o seguinte erro:

principal.pas(51,18) Error: Identifier not found "FindComponent"

Adaptei assim:


for i := 1 to n do
  begin
   FindComponent('edit'+IntToStr(i)) AS TEdit.Text  := IntToStr(i+1);
   FindComponent('edit'+IntToStr(i)) AS TEdit.Font.Color := clBlack;
  end ;                                                                  

Editado por nunopicado
Correcção linguagem GeShi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

Adaptei assim:


for i := 1 to n do
  begin
   FindComponent('edit'+IntToStr(i)) AS TEdit.Text  := IntToStr(i+1);
   FindComponent('edit'+IntToStr(i)) AS TEdit.Font.Color := clBlack;
  end ;                                                                  

Assim vai dar erro. Estás a tentar fazer um cast ao componente com a classe TCaption, e não com TEdit.

Tens de meter parentesis (entre o TEdit e o '.'

for i := 1 to n do
  begin
   (FindComponent('edit'+IntToStr(i)) AS TEdit).Text  := IntToStr(i+1);
   (FindComponent('edit'+IntToStr(i)) AS TEdit).Font.Color := clBlack;
  end ;     

Lembra-te no entanto que fazendo assim, sem usar o Assigned, se não controlas correctamente o índice do for, ele irá dar erro de acesso, pois não encontrará o comopnente.

Se te certificares que nunca chamas um que não exista, então tudo bem!

Editado por nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Kline777

Acho que te faltam uns parentesis...

(FindComponent('edit'+IntToStr(i)) AS TEdit).Font.Color := clBlack;

(Ainda nao tinha visto a resposta do nunopicado a dizer o mm :P é o que dá nao fazer refresh na pagina ^^)

Editado por nunopicado
Adicionada linguagem GeShi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
carcleo

É, continua dando o erro:

principal.pas(51,18) Error: Identifier not found "FindComponent"

Tentei assim também e não deu!

procedure Crivo();
const
 Asize: integer = 12;
var
 n, i, j: integer;
begin
 n := Asize;
 for i := 1 to n do
 begin
   (TEdit.FindComponent('edit'+IntToStr(i))).Text  := IntToStr(i+1);
   (TEdit.FindComponent('edit'+IntToStr(i))).Font.Color := clBlack;
 end;
 edits[0].Font.Color := clBlue;
 for i := 2 to n do
   if edits[i - 1].Font.Color = clBlack then
   begin
     j := i * i;
     if (j > n) then
       break;
     while j <= n do
     begin
       edits[j - 1].Font.Color := clBlue;
       j := j + i;
     end;
   end;
end;                                  

Editado por nunopicado
Correcção linguagem GeShi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

É, continua dando o erro:

Isso é porque esse código está dentro de um procedimento que não pertence à classe da tua form

procedure Crivo();

Ou o metes como método da form:

TForm1 = class(TForm)
       Button13: TButton;
       Button14: TButton;
       Edit1: TEdit;
       Edit2: TEdit;
       Edit3: TEdit;
       Edit4: TEdit;
       Edit5: TEdit;
       Edit6: TEdit;
       Edit7: TEdit;
       Edit8: TEdit;
       Edit9: TEdit;
       Edit10: TEdit;
       Edit11: TEdit;
       Edit12: TEdit;
       procedure Button14Click(Sender: TObject);
       procedure Crivo();  // Declaração aqui do procedimento
 private
       { private declarations }
 public
       { public declarations }
 end;
.
.
.
procedure TForm1.Crivo () ;  // Colocar o identificador da classe na implementação
const
 Asize : integer = 12 ;
var
 n , i , j : integer ;
begin
n := Asize ;
.
.
.

Ou chamas a form antes do FindComponent:

ex.:

for i := 1 to n do
  begin
   (Form1.FindComponent('edit'+IntToStr(i)) AS TEdit).Text  := IntToStr(i+1);
   (Form1.FindComponent('edit'+IntToStr(i)) AS TEdit).Font.Color := clBlack;
  end ;    

Sendo que a maneira mais correcta é a primeira...

Editado por nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
carcleo

funcionou:

unit principal;

{$mode objfpc}{$H+}

interface

uses
 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type
 MatrizInteira = array of integer;
 { TForm1 }

 TForm1 = class(TForm)
   Button13: TButton;
   Button14: TButton;
   Edit1: TEdit;
   Edit2: TEdit;
   Edit3: TEdit;
   Edit4: TEdit;
   Edit5: TEdit;
   Edit6: TEdit;
   Edit7: TEdit;
   Edit8: TEdit;
   Edit9: TEdit;
   Edit10: TEdit;
   Edit11: TEdit;
   Edit12: TEdit;
   procedure Button14Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   function primos(n: integer): MatrizInteira;
 private
   { private declarations }
 public
   { public declarations }
 end;

var
 Form1: TForm1;
 n: integer=12;

implementation

{$R *.lfm}

{ TForm1 }

function TForm1.primos(n: integer): MatrizInteira;
var
 conta_indice, contador, i, j: integer;
 array_primos: MatrizInteira;
begin
 conta_indice := 0;
 for i := 1 to n do
   begin
     contador := 0;
      for j := 1 to i do
       begin
         if (j <> i) and (j<>1) then //aqui, o j sempre será diferente de i e de 1
            if (i mod j = 0) then inc(contador);
       end;
      if contador = 0 then
       begin
        inc(conta_indice);
        setLength(array_primos, conta_indice);
        array_primos[conta_indice-1] := i;
       end;
   end;
 primos := array_primos;
end;

procedure TForm1.Button14Click(Sender: TObject);
var
 b: integer;
 array_primos: MatrizInteira;
begin
 array_primos:=primos(n);
 for b := low(array_primos) to high(array_primos) do
  begin
    (FindComponent('edit'+IntToStr(array_primos[b])) As TEdit).font.color :=clRed;
    (FindComponent('edit'+IntToStr(array_primos[b])) As TEdit).Text :=IntToStr(array_primos[b]);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
 a: integer;
begin
 for a := 1 to n do
    (FindComponent('edit'+IntToStr(a)) As TEdit).Text :=IntToStr(a);
end;

end.

Obrigado!

Editado por carcleo
Correcção linguagem GeShi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

Todos já passámos por isso! ;)


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.