Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Frage nicht erneut wählen! (https://www.delphipraxis.net/24597-frage-nicht-erneut-waehlen.html)

aerotech 23. Jun 2004 13:57


Frage nicht erneut wählen!
 
Hi, bei meinem Programm ist im Moment eingestellt, das es automatisch eine züfällige Frage aussucht, ist es denn möglich einen vermerk zu machen, sodas nicht 2x die gleiche ausgewählt wird!?

Delphi-Quellcode:
if tquizfragen.FieldByName('L1').AsInteger = 1 then begin
  tquizfragen.first;
  tquizfragen.moveby(random(tquizfragen.RecordCount));

     end else
     Form4.Show;

S2B 23. Jun 2004 13:59

Re: Frage nicht erneut wählen!
 
Ich kenn mich zwar nicht mit Datenbanken aus, aber du könntest die geladenen Fragen in eine StringList schreiben und dann überprüfen, ob der Eintrag schon existiert oder nicht... 8)

aerotech 23. Jun 2004 14:10

Re: Frage nicht erneut wählen!
 
Zitat:

Zitat von S2B
Ich kenn mich zwar nicht mit Datenbanken aus, aber du könntest die geladenen Fragen in eine StringList schreiben und dann überprüfen, ob der Eintrag schon existiert oder nicht... 8)

Gibt es noch ne' ähhhhh einfache Möglichkeit? Und wie amch ich das?

Nicodius 23. Jun 2004 14:16

Re: Frage nicht erneut wählen!
 
du könntest das ganze in ein array schreiben und dann abprüfen ;)

S2B 23. Jun 2004 14:16

Re: Frage nicht erneut wählen!
 
Angenommen, du hast die Frage in einer Variablen s:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var SL: TStringList;
begin
  SL:=TStringList.Create;
  if SL.IndexOf(s)=-1 then
  begin
    SL.Add(s);
    //Code für die Ausgabe der Frage
  end
    else
  begin
    //Frage wurde schon mal verwendet
  end;
end;
So müsste es gehen! :wink:

Nicodius 23. Jun 2004 14:17

Re: Frage nicht erneut wählen!
 
und bei dem array müsstest dus mit einer schleife durchgehen sollte ja kein problem sein ;)

shmia 23. Jun 2004 14:24

Re: Frage nicht erneut wählen!
 
Angenommen, du hast 100 Fragen (0-99).
Dann füllst du zuerst ein dynamisches Array mit diesen Zahlen und tauscht zufällig immer 2 Einträge aus.

Delphi-Quellcode:
var
   QIndex:array of Integer; // globales Array
   AktuelleFrage:integer;

procedure SetupQIndex;
var
   i, randomIndex,tmp : integer;
begin
   SetLength(QIndex, 100); // 100 Elemente


   for i:=0 to 99 do
      QIndex[i] := i; // Vorbelegung

   // durcheinander bringen
   // zufällig zwei Einträge vertauschen
   for i:=0 to 99 do
   begin
      tmp := QIndex[i];
      randomIndex := Random(100);
      QIndex[i] := QIndex[randomIndex];
      QIndex[randomindex] := tmp;
   end;
   AktuelleFrage := 99;
end;

// hole die Nummer der Frage
function GetNextQIndex:integer;
begin
   if AktuelleFrage < 0 then raise Exception.Create('keine Fragen mehr');
   result := QIndex[AktuelleFrage];
   Dec(AktuelleFrage);
end;

Nicodius 23. Jun 2004 14:27

Re: Frage nicht erneut wählen!
 
shmia: aber das zufällige kann theoretisch auch werte verlieren oder?

grayfox 23. Jun 2004 14:55

Re: Frage nicht erneut wählen!
 
hallo aerotech!

wieso so kompliziert? hänge in deiner tabelle ein zusätzliches feld mit der bezeichnung 'abgefragt' an. beim programmstart stellt du bei allen eingträgen 'abgefragt' auf false und sobald die frage gestellt wurde auf 'true'

du kannst das ganze verfahren noch weiter verfeinern und ein feld 'richtig_beantwortet' anlegen.
so lange dort nicht 'true' steht, darf die frage ausgewählt werden.

mfg, stefan

shmia 23. Jun 2004 14:58

Re: Frage nicht erneut wählen!
 
Zitat:

Zitat von Nicodius
shmia: aber das zufällige kann theoretisch auch werte verlieren oder?

Eigentlich nicht. Ein Array wird mit den Zahlen 0..99 befüllt:
[0, 1, 2, 3, ..., 99]
Dann wird jedes Element mit einem zufälligen Element vertauscht:
[78, 1, 2, 3, ..., 99] // 1. Durchgang
[78, 63, 3, ..., 99] // 2. Durchgang
[78, 63, 99, ..., 3] // 3. Durchgang (3<->99)
Ein Element könnte auch mit sich selber vertauscht werden, aber das macht nix.
Nach 100 Vertauschungen ist garantiert Unordnung, obwohl wahrscheinlich schon nach
50 Vertauschungen genügend Unordnung vorhanden ist.
Würde man nun das Array wieder sortieren hätte man wieder die Elemente 0..99.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz