Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Zufällige Eingabe erstellen (https://www.delphipraxis.net/122627-zufaellige-eingabe-erstellen.html)

STS301 19. Okt 2008 16:40


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:
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;
Wäre für Hilfe dankbar

Uwe Raabe 19. Okt 2008 16:58

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;

STS301 19. Okt 2008 17:58

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.

Uwe Raabe 19. Okt 2008 18:40

Re: Zufällige Eingabe erstellen
 
Zitat:

Zitat von STS301
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.

Das kann eigentlich nicht sein. Kannst du mal die komplette Funktion als Source posten? Da geht bestimmt was anderes schief.

STS301 19. Okt 2008 18:45

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;

Uwe Raabe 19. Okt 2008 18:51

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...

toms 19. Okt 2008 18:55

Re: Zufällige Eingabe erstellen
 
Es genügt, die Länge von SourceChars einmal vor der Schleife zu berechnen.
Delphi-Quellcode:
length(SourceChars)

Uwe Raabe 19. Okt 2008 19:02

Re: Zufällige Eingabe erstellen
 
Zitat:

Zitat von toms
Es genügt, die Länge von SourceChars einmal vor der Schleife zu berechnen.
Delphi-Quellcode:
length(SourceChars)

Wenn es das ist, dann hat Lazarus aber den Zug vor geraumer Zeit bereits verpasst. Ich hätte jetzt eher auf das Randomize bzw. Random getippt. Wie gesagt, unter Delphi ist das blitzschnell.

Namenloser 19. Okt 2008 19:15

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;

STS301 20. Okt 2008 07:06

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 11:10 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