Ir para conteúdo

POWERED BY:

Arquivado

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

jaycwb

Problema - Delphi OO

Recommended Posts

Olá amigos!

Estou desenvolvendo um jogo de perguntas e respostas, e aqui estou precisando de uma ajudinha...

Ele será Orientado a Objetos. Segue aqui a classe que eu estou tendo problemas...

 

Código:

type
  Tquestao = class
	pergunta : string;
	rA : string;
	rB : string;
	rC : string;
	rD : string;
	rE : string;
	rCerta : string;
	categoria : string;
	tempo : integer;
  end;

e Aqui vai o problema em si:

 

Código:

try
//Query - Português
dmod.qMateria.sql.clear;
dmod.qMateria.Active := false;
dmod.qMateria.SQL.Add('SELECT * FROM questao WHERE categoria = ' + '' + '''Portugues''');
dmod.qMateria.Active := true;
dmod.qMateria.ExecSQL;

// Criação do Array com perguntas;
SetLength(perguntas, dmod.qMateria.RecordCount);
dmod.qMateria.First;

questao := Tquestao.Create;
vFinal := dmod.qMateria.RecordCount - 1;
for x := 0 to vFinal do begin
   questao.pergunta := dmod.qMateria.FieldByName('pergunta').Value;
   questao.rA := dmod.qMateria.FieldByName('rA').Value;
   questao.rB := dmod.qMateria.FieldByName('rB').Value;
   questao.rC := dmod.qMateria.FieldByName('rC').Value;
   questao.rD := dmod.qMateria.FieldByName('rD').Value;
   questao.rE := dmod.qMateria.FieldByName('rE').Value;
   questao.rCerta := dmod.qMateria.FieldByName('rCerta').Value;
   questao.tempo := strtoint(dmod.qMateria.FieldByName('tempo').value);
   questao.categoria := dmod.qMateria.FieldByName('categoria').value;
   perguntas[x] := questao;
   //showmessage(inttostr(x) + '  =  ' + perguntas[x].pergunta ); // Esse showmessa é só pra testar se os valores estão indo certinho pro array...
   dmod.qMateria.Next;
end;

//Agora quando eu tento fazer um teste aqui como por exemplo:
showmessage(perguntas[0].pergunta);
//Ele me mostra o ultimo valor do OBJETO questao, q eu estava utilizando pra adicionar depois... não sei vocês entenderam, qualquer coisa, posso mandar uns print's...

Alguém pode me dar uma luz?

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia a todos.

 

O nosso amigo S4ndr0_soad está correto quanto a questão do array, entretanto existe outros detalhes a ser considerados.

 

1º) Voce definiu o tipo TQuestao como Class, quando na verdade deveria ter definido como Record.

 

Qual a diferença ?

 

A Classe define um tipo Objeto que possui atributos, atributos esses que vão definir os estado do Objeto, tais como as propriedades Color, Fonte, Borda, isto para um Objeto visual, e define propriedades diversas em Objetos não visuais.

 

A Classe também possui os seus métodos que são procedimentos (Procedure) e funções (Functions) que vão determinar o comportamento do Objeto, ações e eventos que o Objeto realizará.

 

Como voce não quer definir nada disso, ou seja, voce só quer armazenar dados como se fosse uma tabela temporária, então o melhor Tipo de dado, apesar de Obsoleto, porém ainda muito utilizado no Delphi é o Record

 

Como definir um Record ? Do mesmo jeito que se define um Classe, assim:

 

type
  Tquestao = Record
	pergunta : string;
	rA : string;
	rB : string;
	rC : string;
	rD : string;
	rE : string;
	rCerta : string;
	categoria : string;
	tempo : integer;
  end;

2º) Quanto a questão do Array, como disse o nosso amigo S4ndr0_soad, ele está correto quando disse que voce tem que definir uma variável array para TQuestao, do jeito que o mesmo disse o array é dinâmico.

 

Diferenças entre Array Estático e Array Dinâmico.

 

Um Array Estático é aquele que voce previamente delimita os seus índices, ou seja, o seu tamanho, assim:

 

var
	 questao: Array[1..250] of TQuestao
  begin
		for x := 1 to 250 do begin
		   ........
		   questao[x].rA := dmod.qMateria.FieldByName('rA').Value;
		   questao[x].rB := dmod.qMateria.FieldByName('rB').Value;
		   questao[x].rC := dmod.qMateria.FieldByName('rC').Value;
		   questao[x].rD := dmod.qMateria.FieldByName('rD').Value;
		   questao[x].rE := dmod.qMateria.FieldByName('rE').Value;
		   ......
		   dmod.qMateria.Next;
		end;
  end;

No código acima, voce delimitou em 250, o número de registros em sua tabela de perguntas.

 

Como voce não sabe a quantidade de registros que vai possuir a sua tabela do componente qMateria, então o array, como disse o nosso amigo S4ndr0_soad, tem que ser mesmo dinâmico e ter seus índices definidos pela função SetLenght, assim:

 

var
	 questao: Array of TQuestao
	 indice: Integer
  begin
		dmod.qMateria.Last;
		Indice := dmod.qMateria.RecordCount;
		dmod.qMateria.First;
		SetLength(questao, Indice); 
		for x := 1 to Indice do begin
		   ........
		   questao[x].rA := dmod.qMateria.FieldByName('rA').Value;
		   questao[x].rB := dmod.qMateria.FieldByName('rB').Value;
		   questao[x].rC := dmod.qMateria.FieldByName('rC').Value;
		   questao[x].rD := dmod.qMateria.FieldByName('rD').Value;
		   questao[x].rE := dmod.qMateria.FieldByName('rE').Value;
		   ......
		   dmod.qMateria.Next;
		end;
  end;

A função SetLength pode ser invocada a qualquer hora para redefinir o índice do array, mesmo se o array contiver registros armazenados, pois ela não apaga os registros.

 

Repare que eu chamei o método Last da query qMateria, isto pois, para que o método RecordCount retornasse a quantidade de registros correto, pois quando a qMateria é inicialmente aberta, não sei porque cargas d'aqua, ela só retorna a quantidade de um registro, tendo a necessidade de visitar o último registros, para que ela retorne a quantidade de registro correto.

 

Um abraço.

 

Jorge da Silva Abreu

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.