Ramdomize sem Repetir

21/03/2018

0

Boa Tarde pessoal, estou com um probleminha aqui, não sei se podem me ajudar.
Tipo eu criei um jogo de perguntas e respostas com imagens a partir de um BD Firebird, mas em um momento que sorteio uma pergunta,
ele sorteia normalmente, mas esta repetindo tudo. ja procurei diversas formas e achei uma mas ele da um erro de: [dcc32 Error] uFrmPrincipal.pas(172): E2010 Incompatible types: 'Variant' and 'array[0..9] of Integer'. Por favor me ajudem ai galera e obrigado por tudo deste maravilhoso fórum da DevMedia.

segue o código:

Procedure TfrmPrincipal.SortearPergunta;
Const
N = 10;
Var
I, T, P : Integer;
numPergunta : Array[0..N - 1] of Integer;
vFoto : TStream;
vImg : TJPEGImage;
begin
Hora := StrToTime('00:00:00');
ProgressBar1.Position := 0;
Timer.Enabled := True;
rdgPerguntas.Enabled := True;
Contagem := 1;
Randomize;
for I := 0 to N - 1 do
numPergunta[I] := I+1;
for I := N - 1 downto 0 do
begin
P := Random(I+1);
T := numPergunta[I];
numPergunta[I] := numPergunta[P];
numPergunta[P] := T;
end;

for I := Low(numPergunta) to High(numPergunta) do
Memo1.Lines.Add(IntToStr(numPergunta[I]));
Memo1.Lines.Add('*******');

with dmDados do
begin
cdsPerguntas.Locate ('PER_COD',numPergunta,[]);

rdgPerguntas.Caption := cdsPerguntasPER_QUEST.Value;
rdgPerguntas.Items.Add(cdsPerguntasPER_RESP0.Value);
rdgPerguntas.Items.Add(cdsPerguntasPER_RESP1.Value);
rdgPerguntas.Items.Add(cdsPerguntasPER_RESP2.Value);
rdgPerguntas.Items.Add(cdsPerguntasPER_RESP3.Value);

vFoto := cdsPerguntas.CreateBlobStream(cdsPerguntas.FieldByName('PER_RESPIMG'), bmRead);
vImg := TJPEGImage.Create;
vImg.LoadFromStream(vFoto);
imgLoad.Picture.Assign(vImg);
end;
end;
Yuri Menechelli

Yuri Menechelli

Responder

Posts

18/04/2018

Yuri Menechelli

Ola pessoal alguem pra me ajudar
Responder

19/04/2018

Natanael Ferreira

Em qual linha ocorre do seu código ocorre o erro?
Responder

19/04/2018

Yuri Menechelli

Ola Natanael Ferreira obrigado por responder, então este erro ocorre na linha "cdsPerguntas.Locate (''PER_COD'',numPergunta,[]);".
Responder

19/04/2018

Natanael Ferreira

Testando seu código, notei que o erro ocorre nesta linha:

cdsPerguntas.Locate ('PER_COD',numPergunta,[]);

O erro ocorre porque no segundo parâmetro do Locate você está alimentando com o Array completo e o Locate espera apenas um item do Array.

Exemplo, informando o primeiro item do Array:

cdsPerguntas.Locate ('PER_COD', numPergunta[0], []);
Responder

19/04/2018

Yuri Menechelli

Nossa, muito obrigado Natanael ajudou mesmo, mas ainda continua repetindo irei verificar direitinho.
Responder

19/04/2018

Yuri Menechelli

Ainda não consegui ele esta me retornando até access violation, não sei mais o que faço.
Responder

19/04/2018

Natanael Ferreira

Posta como está o seu código para analisarmos.
Responder

19/04/2018

Yuri Menechelli

segue o código:<br />
<br />
Procedure TfrmPrincipal.SortearPergunta;<br />
Const<br />
N = 10;<br />
Var<br />
I, T, P : Integer;<br />
numPergunta : Array[0..N - 1] of Integer;<br />
vFoto : TStream;<br />
vImg : TJPEGImage;<br />
begin<br />
Hora := StrToTime(''00:00:00'');<br />
ProgressBar1.Position := 0;<br />
Timer.Enabled := True;<br />
rdgPerguntas.Enabled := True;<br />
Contagem := 1;<br />
Randomize;<br />
for I := 0 to N - 1 do<br />
numPergunta[I] := I+1;<br />
for I := N - 1 downto 0 do<br />
begin<br />
P := Random(I+1);<br />
T := numPergunta[I];<br />
numPergunta[I] := numPergunta[P];<br />
numPergunta[P] := T;<br />
end;<br />
<br />
for I := Low(numPergunta) to High(numPergunta) do<br />
Memo1.Lines.Add(IntToStr(numPergunta[I]));<br />
Memo1.Lines.Add(''*******'');<br />
<br />
with dmDados do<br />
begin<br />
cdsPerguntas.Locate (''PER_COD'',numPergunta,[]);<br />
<br />
rdgPerguntas.Caption := cdsPerguntasPER_QUEST.Value;<br />
rdgPerguntas.Items.Add(cdsPerguntasPER_RESP0.Value);<br />
rdgPerguntas.Items.Add(cdsPerguntasPER_RESP1.Value);<br />
rdgPerguntas.Items.Add(cdsPerguntasPER_RESP2.Value);<br />
rdgPerguntas.Items.Add(cdsPerguntasPER_RESP3.Value);<br />
<br />
vFoto := cdsPerguntas.CreateBlobStream(cdsPerguntas.FieldByName(''PER_RESPIMG''), bmRead);<br />
vImg := TJPEGImage.Create;<br />
vImg.LoadFromStream(vFoto);<br />
imgLoad.Picture.Assign(vImg);<br />
end;<br />
end;
Responder

23/04/2018

Yuri Menechelli

Alguém pra me ajudar por favor?
Responder

24/04/2018

Emerson Nascimento

Um dos problemas é o sorteio. Veja no exemplo a idéia de como deve ser feito (estou sem Delphi, fiz direto no bloco de notas, então provavlemente ocorrerá algum erro de sintaxe). Note que a função Sorteada() pode ser substituída por alguma função nativa do Delphi.

Procedure TfrmPrincipal.SortearPergunta;
Const
	N = 10;
Var
	I, T, P: Integer;
	numPergunta: Array[0..N - 1] of Integer;
	vFoto: TStream;
	vImg: TJPEGImage;

	function Sorteada( NumPerg: integer ): boolean;
	var
		lSorteada: boolean;
		iItem: integer;
	begin
		lSorteada := false;
		for iItem := Low(numPergunta) to High(numPergunta)
			lSorteada := (not (numPergunta[iItem] is null) and (numPergunta[iItem] = NumPerg));
			if lSorteada then
				exit;
		next iItem

		Result := lSorteada;
	end

begin
	Hora := StrToTime('00:00:00');
	ProgressBar1.Position := 0;
	Timer.Enabled := True;
	rdgPerguntas.Enabled := True;

	for I := 0 to N - 1 do
	begin
		repeat
			Randomize;
			P := Random(N+1);
			if P = 0 then P := 1;
		until not Sorteada( P )

		numPergunta[I] := P;
	end;

	for I := Low(numPergunta) to High(numPergunta) do
	begin
		Memo1.Lines.Add(IntToStr(numPergunta[I]));
		Memo1.Lines.Add('*******');

		with dmDados do
			if cdsPerguntas.Locate('PER_COD',numPergunta[i],[]) then
			begin
				rdgPerguntas.Caption := cdsPerguntasPER_QUEST.AsString;
				rdgPerguntas.Items.Add(cdsPerguntasPER_RESP0.AsString);
				rdgPerguntas.Items.Add(cdsPerguntasPER_RESP1.AsString);
				rdgPerguntas.Items.Add(cdsPerguntasPER_RESP2.AsString);
				rdgPerguntas.Items.Add(cdsPerguntasPER_RESP3.AsString);

				vFoto := cdsPerguntas.CreateBlobStream(cdsPerguntas.FieldByName('PER_RESPIMG'), bmRead);
				vImg := TJPEGImage.Create;

				vImg.LoadFromStream(vFoto);
				imgLoad.Picture.Assign(vImg);

				FreeAndNil(vImg);
				FreeAndNil(vFoto);
			end;
	end;
end;


O outro problema está na exibição. Você tem somente um radioGroup, logo será exibida sempre a última pergunta sorteada.
Responder

24/04/2018

Yuri Menechelli

Eu vou verificar com este código que vc deu o exemplo e retorno, muito obrigado pela ajuda.
Responder

24/04/2018

Yuri Menechelli

é meu amigo acertei algumas coisas que vc passou mas ainda esta dando erro.

[dcc32 Error] uFrmPrincipal.pas(250): E2015 Operator not applicable to this operand type

nesta linha ó:
lSorteada := (not (numPergunta[iItem] is null) and (numPergunta[iItem] = NumPerg));
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar