Ramdomize sem Repetir

SQL

Delphi

Firebird

21/03/2018

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

Curtidas 0

Respostas

Yuri Menechelli

Yuri Menechelli

21/03/2018

Ola pessoal alguem pra me ajudar
GOSTEI 0
Natanael Ferreira

Natanael Ferreira

21/03/2018

Em qual linha ocorre do seu código ocorre o erro?
GOSTEI 0
Yuri Menechelli

Yuri Menechelli

21/03/2018

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

Natanael Ferreira

21/03/2018

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], []);
GOSTEI 0
Yuri Menechelli

Yuri Menechelli

21/03/2018

Nossa, muito obrigado Natanael ajudou mesmo, mas ainda continua repetindo irei verificar direitinho.
GOSTEI 0
Yuri Menechelli

Yuri Menechelli

21/03/2018

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

Natanael Ferreira

21/03/2018

Posta como está o seu código para analisarmos.
GOSTEI 0
Yuri Menechelli

Yuri Menechelli

21/03/2018

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;
GOSTEI 0
Yuri Menechelli

Yuri Menechelli

21/03/2018

Alguém pra me ajudar por favor?
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

21/03/2018

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.
GOSTEI 0
Yuri Menechelli

Yuri Menechelli

21/03/2018

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

Yuri Menechelli

21/03/2018

é 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));
GOSTEI 0
POSTAR