Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

marciocorbolan

Problema com TEdit

Recommended Posts

Boa noite,

 

 

Me chamem de preguiçoso, mas eu não tenho paciência de fazer 40 linha de recepção de valor! heheheheheh

Bem, o caso é que eu tenho 3 matrizes de 4,5 e 40 TEdit, logo tenho que adicionar 20 TEdit para matriz A, 20 TEdit para matriz B e por fim somar seus campos e montar a matriz C.

 

Logo de cara eu ja fiz careta imaginando o tanto de variavel para receber, então pensei pq não fazer como faço em PHP, crio um For e resolvo tudo! Até ai tudo bem, depois que fiz tudo descobri que esta dando um erro e não sei como resolver.

 

 

var
  Arquivo: TextFile;
  A,B,C: Array[1..4, 1..5] of Real;
  INPUT1, INPUT2: String;
  I,J,T1,T2: Integer;
begin
  for I := 1 to 4 do
	for J := 1 to 5 do
	  begin
		T1 := I;
		T2 := 20 + I;
		if (J > 1) then
		  begin
			T1 := T1 + 4;
			INPUT1 := 'Edit' + IntToStr(T1) + '.Text';
			A[I,J] := StrToFloat(INPUT1);  [b]// O ERRO ACONTECE AQUI[/b]

			T2 := T2 + 4;
			INPUT2 := 'Edit' + IntToStr(T2) + '.Text';
			A[I,J] := StrToFloat(INPUT2);
		  end
		else
		  begin
			INPUT1 := 'Edit' + IntToStr(I) + '.Text';
			A[I,J] := StrToFloat(INPUT1);

			INPUT2 := 'Edit' + IntToStr(20 + I) + '.Text';
			B[I,J] := StrToFloat(INPUT2);
		  end;
		C[I,J] := A[I,J] + B[I,J];
	  end;

 

Abaixo está o que o depurador diz ser o erro, mas como podem ver, o nome ficou correto e eu mandei converter de String para Float !

 

 

First chance exception at $7C812AEB. Exception class EConvertError with message ''Edit1.Text' is not a valid floating point value'. Process Project1.exe (2892)

 

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu resolvi fazendo duas matrizes dinamicas, porem gostaria de saber o motivo do erro anterior!

Bem, eu estou com uma certa duvida ainda! Eu gostaria de saber como confirmar que algo foi escrito no arquivo!

Tipo.. no PHP quando eu queria saber se a função MAIL enviou o email eu fazia assim "R = mail(.....)" logo tinha uma resposta TRUE ou FALSE. Eu tentei fazer isso com o WRITELN, mas não funcionou, até deixei identado para melhor vocês intenderem! Então será que alguem pode me ajudar com isso?

 

var
  Form1: TForm1;
  A,B: Array[1..4, 1..5] of TEdit;
  Arquivo: TextFile;

implementation

{$R *.dfm}

procedure TForm1.AcessaArquivo(Sender: TObject);
begin
  AssignFile(Arquivo,'C:\EXE4CAP8.XXX');
  if FileExists('C:\EXE4CAP8.XXX') then
	Reset(Arquivo)
  else
	Rewrite(Arquivo);
end;

procedure TForm1.CriarMatrizes(Sender: TObject);
var
  R: String;
  L,C: Integer;
  I, J, X: Byte;
begin
  X := 1;
  L := 17;
  for I := 1 to 4 do
	begin
	  C := 11;
	  for J := 1 to 5 do
		begin
		  Str(X, R);

		  A[I,J] := TEdit.Create(GroupBox1);
		  A[I,J].Parent := GroupBox1;
		  A[I,J].Left := C;
		  A[I,J].Top := L;
		  A[I,J].Width := 100;
		  A[I,J].Height := 21;
		  A[I,J].Name := 'CampoA' + R;
		  A[I,J].Text := '';

		  B[I,J] := TEdit.Create(GroupBox2);
		  B[I,J].Parent := GroupBox2;
		  B[I,J].Left := C;
		  B[I,J].Top := L;
		  B[I,J].Width := 100;
		  B[I,J].Height := 21;
		  B[I,J].Name := 'CampoB' + R;
		  B[I,J].Text := '';

		  C := C + 106;
		  X := X + 1;
		end;
	  L := L + 27;
	end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var
  C: Array[1..4, 1..5] of Real;
  I, J: Integer;
  S: Boolean;
begin
  for I := 1 to 4 do
	for J := 1 to 5 do
	  begin
		C[I,J] := StrToFloat(A[I,J].Text) + StrToFloat(B[I,J].Text);
	  end;



  Append(Arquivo);
  for I := 1 to 4 do
	for J := 1 to 5 do
	  begin
		{S := }Writeln(Arquivo, C[I,J]);
	  end;

  {if (S = True) then
	ShowMessage('Gravação efetuada com sucesso')
  else
	ShowMessage('Erro ao tentar efetuar gravação');}

  CloseFile(Arquivo);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro, vamos a algumas considerações....

 

Não entendi o porque de não usar um TStringGrid para montar seus arrays e digitar neles os valores.... seria muito mais simples de visualizar e controlar que fazer um laço de repetição criando N edits....

 

Segundo... quanto ao erro no primeiro post, é simples... olhe com atenção seu código:

 

INPUT1 := 'Edit' + IntToStr(T1) + '.Text';
			A[I,J] := StrToFloat(INPUT1);  [b]// O ERRO ACONTECE AQUI[/b]

Você tem uma variável string INPUT1 e joga para ela a string Edit + o valor convertido de T1 em String + a string .Text ... então, o que você está tentando converter não é um TEdit, mas uma string Edit1.text, o que não é a mesma coisa... dai o erro de conversão.

 

De boa, sugiro que olhe um pouco o funcionamento do TStringGrid... você vai ver que isso pode te facilitar a vida um monte.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Powww eu cheguei a ver ler rapidinho sobre TStringList e se for parecido ajuda mesmo! O problema é que eu to fazendo o exercicio e nele pede parece que pede para somente usar os recursos apreendido no capitulo... mas valeu pela ajuda!!!!!!!!

 

Ah! Sobre a viagem de criar N edits... é que eu não manjo mto, to aprendendo com um livro que eu comprei ai faço essas bizonhice achando que é o jeito melhor heheheheh

 

vlwwww

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite TIAO

 

O nosso amigo Chrnos matou a xarada, ou seja, voce não pode invocar uma propriedade de componente apenas referenciando-o pelo seu nome em String. Antes porém voce tem que indentificar o Objeto (Componente) que no caso é o TEdit, utilizar o método FindComponent fornecendo como parâmetro o nome do componente, e ai sim invocar a sua propriedade Text, isto é depois de fazer o casting (conversão). Meio complicado ? Então vamos ao exemplo:

 

var Comp: TComponent;
begin
   Comp := FindComponent('Edit' + IntToStr(T1));
   if Comp is TEdit then INPUT1 := TEdit(Comp).Text;
end;

O método FindComponent aqui invocado está declarado na Classe TComponent. Como a Classe TComponent é um dos Antecestrais de TForm em sua herança, TForm também herda esse método que é usado para encontrar componentes contidos em sua interface gráfica, fornecendo o nome dos componentes como parâmetro. Esse método retorna um Objeto do tipo TComponent, daí a necessidade de se fazer o casting (Conversão) para TEdit (TEdit(Comp)), para que pudessemos usar a sua propriedade Text.

 

Agora porque eu tive que fazer o teste "if Comp is TEdit then" ?

 

Simples, se o método FindComponent não encontrar o componente referenciado no parâmetro, Comp no caso vai retornar um valor "NIL" e esse teste "is TEdit", além de verificar se pertence a classe TEdit, verifica também se o objeto está instanciado, pois se não estiver ao tentar fazer casting de tipo TEdit(Comp) com Comp = NIL, gera erro.

 

Um abraço.

Jorge da Silva Abreu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah!!!!!!!!!!!!! Agora sim, agora entedi!!!!

Então no Delphi eu não posso simplesmente "falar o nome", tenho que mostrar quem é!

Hummmm.... que complicação auhahuahuauhau, mas agora sim manjei o porque do erro, nunca iria descobrir isso sozinho!

 

Bem... agora sobre a conversão/confirmação eu entendi tambem, ele precisa procurar o componente qual eu estou me referindo, verificar se existe e se esta em uso, somente depois disso que ele agregará valor a variavel, caso contrario vai passar direto para evitar de dar erro! ( Acho que é isso hehehehe )

 

Sobre esse tl de nil, to vendo um monte no livro novo que eu peguei aqui, ele é algo como null? Pode me esplicar melhor a sua definição?

 

 

abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite TIAO.

 

Respondendo a sua pergunta, a resposta é Sim.

 

Na linguagem Delphi, ou melhor, na linguagem Object Pascal que o Delphi usa, o valor "NULL" para Objetos é representado pela sintaxe "NIL", detalhe, somente para Objetos, isto porque o Delphi utiliza uma técnica diferente para armazenamento de Objetos em memória. Quando você declara uma variável do tipo de um Objeto, como por Exemplo: "var MeuEdit: TEdit, esta variável é o que chamamos "Instância do Objeto". Muitas pessoas pensam que o Objeto em si é armazenado no espaço reservado para essa variável, quando na verdade, o que é armazenado, no caso acima, em MeuEdit é apenas uma referência do endereço de memória onde o Objeto foi verdadeiramente armazenado, ou seja, em outro endereço de memória, isto porque, como Objetos é uma Instância de uma Classe, a Classe nada mais é do que um esquema do objeto que define várias variáveis e métodos (Procedures e Functions), e isto requer um espaço de memória bem maior do que o reservado para uma simples variável. É o que costumamos também definir a variável (Instância) como se fosse um ponteiro do objeto.

 

Quanto essa sua colocação.

 

Ah!!!!!!!!!!!!! Agora sim, agora entedi!!!!

Então no Delphi eu não posso simplesmente "falar o nome", tenho que mostrar quem é.

Creio eu que não me expressei direito. Você pode sim, após instanciar o objeto, fazer referência ao seu nome e invocar todas as suas propriedades, porém não com o seu nome entre aspas ("Edit1".Text), e sim sem aspas (Edit1.Text), porque se não, o Delphi vai interpretar o nome entre Aspas como valor String a ser atribuído a uma variável, e não como Objeto.

 

Um abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.