Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zahl sollte nich im Set1 und im Set2 sein ist aber in Set2 (https://www.delphipraxis.net/124194-zahl-sollte-nich-im-set1-und-im-set2-sein-ist-aber-set2.html)

ryLIX 16. Nov 2008 15:43


Zahl sollte nich im Set1 und im Set2 sein ist aber in Set2
 
Erstmal Hi :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 :wall:

Weiß wer von euch Hilfe?

DeddyH 16. Nov 2008 16:36

Re: Zahl sollte nich im Set1 und im Set2 sein ist aber in Se
 
Ich habe mir das nicht in allen Einzelheiten angesehen, aber lokale Variablen gelten nur innerhalb der Funktion, in der sie deklariert sind. Du könntest sie nun global definieren oder besser als private Felder von Form1. So bleiben sie für die Dauer des Programmablaufs gültig.

ryLIX 16. Nov 2008 17:10

Re: Zahl sollte nich im Set1 und im Set2 sein ist aber in Se
 
Hmm die Sets ändern sich aber nicht oder?
Weil ein Ergebnis bekomme ich ja. Also die Namen aus der ListBox werden im Memo angezeigt.
Aber ich werde die Variablen und die Sets dazu mal Global definieren.

//edit
Hab die Sets nun Glogal definiert geändert hat sich nichts.
Kann es sein dass das Set mit den letzten Zahlen immer leer ist? :gruebel:
Irgendwie beiß ich mir die Zähne daran aus :|


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:50 Uhr.

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