Erstmal Hi
Ich bin dabei mir ein kleines Programm zu schreiben welches aus einer ListBox mit Namen zufällig 2, 4 oder 6 Namen auswählt.
Wenn die Funktion das 2. mal aufgerufen wird sollten die letzten Namen nich wieder auftauchen.
Der Code sieht nun so aus:
Delphi-Quellcode:
procedure TForm1.cmdGetPlayersClick(Sender: TObject);
type
TPlayersResult = set of 1..255; //Set für den neuen Durchgang
TPlayersLastResult = set of 1..255; //Set für den vorherigen Druchgang
//Zufallszahlen generation Count= druchläufe der Schleife; MaxValue= MaxVal für Rnd; TPlayersResult= Set mit den Zahlen
function Players(ACount : Byte; AMaxValue : Byte) : TPlayersResult;
var
i: Byte;
number: Byte;
LastResult : TPlayersLastResult; //Init der Variablen
begin
if ACount > AMaxValue then //Ist die Anzahl der durchläufe größer als der Maximale Wert für Rnd?
raise EInvalidOp.Create('Man kann nicht mehr Namen aus der Liste ziehen, als vorhanden!');
Result := []; //Set leeren
for i := 1 to ACount do // Starten der Schleife
begin
repeat
number := Random(aMaxValue); //Generieren der Zahlen
until not(number in Result) AND not(number in LastResult); //Vergleich der Zahlen ob schon im Set; 2. Vergleich geht nicht?O.o
Include(Result, number); //Zahl einfügen in das Set
end;
end;
var
max : Integer;
PlayersResult: TPlayersResult;
PlayersLastResult : TPlayersLastResult;
i: Byte; //Init der Variablen
begin
max := ListBox1.Items.Count; //max = MaxValue der Zufallfunktion
if valAnzahl2.Checked = true then begin //Funktionsaufruf für die zufalls wahl von 2Spielern
PlayersResult := Players(2, max); //Funktion Players(Spieler, MaxAnzahlSpieler)
Memo1.Lines.Clear; //Memo für die Ergebnisanzeige leeren
for i := 0 to max do //Schleife zum Übertragen der Namen
begin
if i in PlayersResult then //Auslesen des Strings
Memo1.Lines.Add(ListBox1.Items.Strings[i]); //Namen von der ListBox ins Memo
PlayersLastResult := []; //Set mit dem letzten ergebnis leeren
PlayersLastResult := PlayersResult; //Aktuelles Ergebnis wird zu letztem Ergebnis
end;
end
else if valAnzahl4.Checked = true then begin //Das ganze für 4 Spieler
PlayersResult := Players(4, max);
Memo1.Lines.Clear;
for i := 0 to max do
begin
if i in PlayersResult then
Memo1.Lines.Add(ListBox1.Items.Strings[i]);
PlayersLastResult := [];
PlayersLastResult := PlayersResult;
end;
end
else if valAnzahl6.Checked = true then begin //Das ganze für 6 Spieler
PlayersResult := Players(6, max);
Memo1.Lines.Clear;
for i := 0 to max do
begin
if i in PlayersResult then
Memo1.Lines.Add(ListBox1.Items.Strings[i]);
PlayersLastResult := [];
PlayersLastResult := PlayersResult;
end;
end
end;
Aber leider tauchen die Namen vom letzten mal nach dem neuen Klick wieder auf.

Irgendwie erkenn ich den Fehler nicht
Weiß wer von euch Hilfe?