jaycwb 0 Denunciar post Postado Outubro 5, 2008 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
S4ndr0_soad 0 Denunciar post Postado Outubro 6, 2008 voce declarou o objeto apenas como 'questao: Tquestao'?? se sim tente colocar 'questao: array of Tquestao'... Compartilhar este post Link para o post Compartilhar em outros sites
Discorpio 1 Denunciar post Postado Outubro 6, 2008 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
S4ndr0_soad 0 Denunciar post Postado Outubro 6, 2008 eu tambem não sabia sobre definir como Record... kk valeu pelos esclarecimentos Discorpio... muito bom mesmo Compartilhar este post Link para o post Compartilhar em outros sites