Ramdomize sem Repetir
21/03/2018
0
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
Posts
19/04/2018
Yuri Menechelli
19/04/2018
Natanael Ferreira
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], []);
19/04/2018
Yuri Menechelli
19/04/2018
Yuri Menechelli
19/04/2018
Yuri Menechelli
<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;
24/04/2018
Emerson Nascimento
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.
24/04/2018
Yuri Menechelli
24/04/2018
Yuri Menechelli
[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));
Clique aqui para fazer login e interagir na Comunidade :)