Jump to content
Carlos Rocha

Nomeando edits via for

Recommended Posts

Carlos Rocha

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"

Edited by nunopicado
Adicionadas tags GeShi

Share this post


Link to post
Share on other 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.

Edited by 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.

Share this post


Link to post
Share on other sites
Carlos Rocha

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 ;                                                                  

Edited by nunopicado
Correcção linguagem GeShi

Share this post


Link to post
Share on other 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!

Edited by 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.

Share this post


Link to post
Share on other 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 ^^)

Edited by nunopicado
Adicionada linguagem GeShi

Share this post


Link to post
Share on other sites
Carlos Rocha

É, 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;                                  

Edited by nunopicado
Correcção linguagem GeShi

Share this post


Link to post
Share on other 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...

Edited by 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.

Share this post


Link to post
Share on other sites
Carlos Rocha

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!

Edited by carcleo
Correcção linguagem GeShi

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.