![]() |
Zufällige Eingabe erstellen
hi
ich will eine zufällig erstellten Text ausgeben. Ich habe 4 Char Arrays (1..26: Großbuchstaben, 1..26 Kleinbuchstaben, 1..26 Sonderzeichen, 1..10 Zahlen). Ich habe es mit einer For-Schleife versucht, hat aber nicht gut funktioniert. Er hat immer nur einen Buchstaben ausgegeben. Mein Hauptproblem ist, dass ich 4 Checkboxen habe und er vor dem Erstellen schauen soll, ob sie aktiviert sind oder nicht. Ich weiß, der Code ist nicht besonders einfallsreich, ich habe es so versucht wie ich gedacht habe, dass es funktionieren sollte, das tut es aber nicht. hier der Code big, small, extra(sonderzeichen) und number sind die Checkboxen.
Delphi-Quellcode:
Wäre für Hilfe dankbar
procedure TForm1.codegenClick(Sender: TObject);
var bgross: Array[1..26] of Char; bklein: Array[1..26] of Char; sonder: Array[1..26] of Char; zahlen: Array[1..10] of Char; anzahl: Integer; i, b: Integer; select: Integer; defini: Integer; unterd: Integer; zdef : Integer; zunter: Integer; begin bgross[1]:= 'A'; bgross[2]:= 'B'; bgross[3]:= 'C'; bgross[4]:= 'D'; bgross[5]:= 'E'; bgross[6]:= 'F'; bgross[7]:= 'G'; bgross[8]:= 'H'; bgross[9]:= 'I'; bgross[10]:= 'J'; bgross[11]:= 'K'; bgross[12]:= 'L'; bgross[13]:= 'M'; bgross[14]:= 'N'; bgross[15]:= 'O'; bgross[16]:= 'P'; bgross[17]:= 'Q'; bgross[18]:= 'R'; bgross[19]:= 'S'; bgross[20]:= 'T'; bgross[21]:= 'U'; bgross[22]:= 'V'; bgross[23]:= 'W'; bgross[24]:= 'X'; bgross[25]:= 'Y'; bgross[26]:= 'Z'; bklein[1]:= 'a'; bklein[2]:= 'b'; bklein[3]:= 'c'; bklein[4]:= 'd'; bklein[5]:= 'e'; bklein[6]:= 'f'; bklein[7]:= 'g'; bklein[8]:= 'h'; bklein[9]:= 'i'; bklein[10]:= 'j'; bklein[11]:= 'k'; bklein[12]:= 'l'; bklein[13]:= 'm'; bklein[14]:= 'n'; bklein[15]:= 'o'; bklein[16]:= 'p'; bklein[17]:= 'q'; bklein[18]:= 'r'; bklein[19]:= 's'; bklein[20]:= 't'; bklein[21]:= 'u'; bklein[22]:= 'v'; bklein[23]:= 'w'; bklein[24]:= 'x'; bklein[25]:= 'y'; bklein[26]:= 'z'; sonder[1]:= '^'; sonder[2]:= '!'; sonder[3]:= '"'; sonder[4]:= '%'; sonder[5]:= '&'; sonder[6]:= '/'; sonder[7]:= '{'; sonder[8]:= '('; sonder[9]:= '['; sonder[10]:= ')'; sonder[11]:= ']'; sonder[12]:= '='; sonder[13]:= '}'; sonder[14]:= '?'; sonder[15]:= '+'; sonder[16]:= '*'; sonder[17]:= '#'; sonder[18]:= ' '; //Leertaste sonder[19]:= '-'; sonder[20]:= '_'; sonder[21]:= '.'; sonder[22]:= ':'; sonder[23]:= ','; sonder[24]:= ';'; sonder[25]:= '<'; sonder[26]:= '>'; zahlen[1]:= '1'; zahlen[2]:= '2'; zahlen[3]:= '3'; zahlen[4]:= '4'; zahlen[5]:= '5'; zahlen[6]:= '6'; zahlen[7]:= '7'; zahlen[8]:= '8'; zahlen[9]:= '9'; zahlen[10]:= '0'; if (big.Checked = false) and (small.Checked = false) and (extra.Checked = false) and (number.Checked = false) then begin ShowMessage('Please select the wanted properties!'); exit end; anzahl:= 0; defini:= 26; zdef := 10; If big.Checked then inc(anzahl); If small.Checked then inc(anzahl); If extra.Checked then inc(anzahl); If number.Checked then inc(anzahl); randomize; for i:= 1 to StrToInt(repeat1.Text) do //anzahl select:= random(anzahl); unterd:= random(defini); zunter:= random(zdef); if select = 1 then begin if big.Checked then begin edit1.Text:= edit1.Text + bgross[unterd]; end else if small.Checked then begin edit1.Text:= edit1.Text + bklein[unterd]; end else if extra.Checked then begin edit1.Text:= edit1.Text + sonder[unterd]; end else if number.Checked then begin edit1.Text:= edit1.Text + zahlen[zunter]; end; end; if select = 2 then begin if small.Checked then begin edit1.Text:= edit1.Text + bklein[unterd]; end else if extra.Checked then begin edit1.Text:= edit1.Text + sonder[unterd]; end else if number.Checked then begin edit1.Text:= edit1.Text + zahlen[zunter]; end; end; if select = 3 then begin if extra.Checked then begin edit1.Text:= edit1.Text + sonder[unterd]; end else if number.Checked then begin edit1.Text:= edit1.Text + zahlen[zunter]; end; end; if select = 4 then begin if number.Checked then begin edit1.Text:= edit1.Text + zahlen[zunter]; end; end; end; |
Re: Zufällige Eingabe erstellen
Was mir als erstes auffällt, ist:
- in der for-schleife fehlt das begin/end (so wird nur x-mal select aber kein Text gesetzt!) - anzahl kann einen Wert von 1..4 annehmen - select := random(anzahl) hat somit einen Wert von 0..(anzahl-1) - du fragst allerdings select auf 1..4 ab - select = 4 wird nie vorkommen - select = 0 ignorierst du Da du ja selbst zugestehst, daß der Code "sub-optimal" ist, hier eine Anregung: statt 4 separater Arrays würde ich einen einzelnen String nehmen und die selektierten CharSets einfach als Strings anfügen:
Delphi-Quellcode:
SourceChars := '';
if big.Checked then SourceChars := SourceChars + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; if small.Checked then SourceChars := SourceChars + 'abcdefghijklmnopqrstuvwxyz'; ... if SourceChars = '' then begin ShowMessage('Please select the wanted properties!'); exit; end; randomize; resultString := ''; anzahl := StrToInt(repeat1.Text); for i := 1 to anzahl do begin // !!! select := random(length(SourceChars)) + 1; resultString := resultString + SourceChars[select]; // besser als ständig in das Edit-Feld zu schreiben end; edit1.Text := resultString; |
Re: Zufällige Eingabe erstellen
danke, so funktioniert es.
Es benötigt aber etwas lange um die funktion zu wiederholen. wenn ich auf den Button klicke, muss ich eine Sekunde warten, bis ich erneut einen Code generieren kann. |
Re: Zufällige Eingabe erstellen
Zitat:
|
Re: Zufällige Eingabe erstellen
es kann auch sein, dass es an Lazarus liegt
Delphi-Quellcode:
var
SourceChars: String; resultString: String; anzahl: Integer; select: Integer; i: Integer; test: Integer; begin try test:= StrToInt(repeat1.text); except exit; end; SourceChars := ''; if big.Checked then SourceChars := SourceChars + gross; if small.Checked then SourceChars := SourceChars + klein; If extra.Checked then SourceChars := SourceChars + sonder; If number.Checked then SourceChars := SourceChars + zahlen; if SourceChars = '' then begin ShowMessage('Please select the wanted properties!'); exit; end; randomize; resultString := ''; anzahl := StrToInt(repeat1.Text); for i := 1 to anzahl do begin // !!! select := random(length(SourceChars)) + 1; resultString := resultString + SourceChars[select]; // besser als ständig in das Edit-Feld zu schreiben end; edit1.Text := resultString; |
Re: Zufällige Eingabe erstellen
Hier unter Delphi 2009 kann ich gar nicht so schnell klicken, wie der Code ausgeführt wird. Wenn es wirklich an Lazarus liegt, dann hat Lazarus wirklich ein echtes Problem...
|
Re: Zufällige Eingabe erstellen
Es genügt, die Länge von SourceChars einmal vor der Schleife zu berechnen.
Delphi-Quellcode:
length(SourceChars)
|
Re: Zufällige Eingabe erstellen
Zitat:
|
Re: Zufällige Eingabe erstellen
Eigentlich sollte der Code nicht zu lange brauchen. Ich hab ihn trotzdem mal etwas angepasst:
Delphi-Quellcode:
var
SourceChars: String; resultString: String; count: Integer; // select: Integer; // wird die variable irgendwo genutzt? lenSourceChars: integer; i: Integer; begin if not TryStrToInt(count, repeat1.text) then // wenn es die funktion in lazarus nicht gibt, nimm nen try-except-block exit; SourceChars := ''; if big.Checked then SourceChars := SourceChars + gross; if small.Checked then SourceChars := SourceChars + klein; If extra.Checked then SourceChars := SourceChars + sonder; If number.Checked then SourceChars := SourceChars + zahlen; if SourceChars = '' then begin ShowMessage('Please select the wanted properties!'); exit; end; lenSourceChars := length(SourceChars); // randomize; // Bitte nur einmal beim Programmstart aufrufen SetLength(resultString,count); for i := 1 to anzahl do resultString[i] := SourceChars[random(lenSourceChars) + 1]; edit1.Text := resultString; |
Re: Zufällige Eingabe erstellen
@namenloozer: das funktioniert nicht wirklich. Ich habe randomize jetzt ins OnCreate gestellt und jetzt funktioniert es einwandfrei.
danke |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz