Autor Beitrag
Salieri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Fr 18.09.09 18:07 
Moin.

Ich habe in diesem Thread und unter dem Link, der da genannt wird nun schon lange gelesen und mir alles genau angeschaut, aber ich werd daraus nicht schlau...

Ich will im Grunde das Selbe wie der Threadersteller da, nur will ich das ganze etwas anders aufziehen; leider habe ich aber keinerlei Erfahrung mit dem Random Befehl und allgemein bin ich ziemlich neu bei Delphi, habe erst son paar Sachen gemacht. Ich bräuchte also ne allgemeine Erklärung zu allem was ihr mir vorschlagt, wäre sehr nett wenn sich dazu jmd die Zeit nehmen würde. :)

Also, das ganze sieht folgendermaßen aus:
Ich habe einen Button der das Passwort erstellen soll und in ein Editierfeld ausgibt. Das Passwort soll aus einer zufälligen Reihenfolge von Zahlen und Buchstaben (ohne O und o) bestehen. Die exakte Anzahl der verwendeten kleinen und großen Buchstaben, sowie die Anzahl der Ziffern soll über drei weitere Editierfelder mit UpDown-Schaltflächen vorgegeben werden. Wobei die UpDown Komponenten von den Buchstaben mindestens den Wert 0 und höchstens den Wer 25 haben, bei der Anzahl Ziffern ist es mindestens 3 und höchstens 25.
Die Ganzen Sachen hab ich schon alle, das mit den UpDown-Schaltflächen und dessen Edit-Felder habe ich auch schon fertig eingerichtet. Die Frage ist jetzt nur, wie der Befehl dafür funktioniert. Ich hab mir wie gesagt den Thread und die Quelltexte da recht lange angeschaut, aber ich werd nich schlau draus und hab dementsprechend noch keinen so tollen Ansatz, ich habe lediglich die Konstanten mehr oder weniger von dem anderen Thread kopiert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.BuCreateClick(Sender: TObject);
  const
    cLower   = 'abcdefghijklmnpqrstuvwxyz';
    cUpper   = 'ABCDEFGHIJKLMNPQRSTUVWXYZ';
    cNumbers = '0123456789';

begin

end;


Wie schon gesagt, ich bin mit der Materie noch nich so vertraut, wenn ihr mir nur nen Quelltext gebt hilft das wenig. Wäre schon gut, wenn ihr mir erklären könntet wie der Befehl genau geschrieben werden muss und wie das Programm weiß, welche Anzahl von was das Passwort enthalten soll. Bzw nen Link zu dem Thema tuts auch, ich bin beim Suchen im Netz leider nich so wirklich was gefunden, wo das erklärt wird, wie ich es haben möchte.

Ich bedanke mich schonmal für jede Hilfsbereitschaft.
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Fr 18.09.09 19:33 
Wenn du noch nicht so viel Ahnung hast würde ich es erstmal nicht so kompliziert machen, erweitern kannst du es später immernoch.

also schaut das ganze erstmal so aus das du eine Zufallszahl erzeugts.
Das geht mit Random. Random(100) erzeugt dir eine Zahl die zwischen 0 und 99 liegt. Bei Random(20) wäre es 0..19. Du kannst da aber angeben was du willst bzw. brauchst.
Als weiteres hast du ja eine Länge die dein Passwort haben soll.
Also initialisierst du als erstes deinen Zielstring.
Nun läufst du mit einer for Schleife von 1 bis zu deiner Länge.
In der Schleife erzeugst du eine zufällige Zahl im Bereich von 0..59, interpretierst diese Zahl als als eines der möglichen Zeichen und fügst es an den Zielstring an.
Du siehst das ich alle möglichen Zeichen als ein String auffasse, das ist für den Anfang das beste.
Aussehen könnte das ganze so:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
function GivePassword(APassLength: integer): string;
const
    cLower   = 'abcdefghijklmnpqrstuvwxyz';
    cUpper   = 'ABCDEFGHIJKLMNPQRSTUVWXYZ';
    cNumbers = '0123456789';
var
  l, CharIndex: integer;
  PasswordChar: char;
  PasswordChars: string;

begin
  PasswordChars := cLower+cUpper+cNumbers;
  result := ''// zielstring initialisieren
  for l := 1 to APassLength do // schleife
  begin
    // Length liefert die länge eines Strings zurück,
    // hier wird das die mögliche Anzahl der verschiedenen Positionen in PasswordChars
    CharIndex := Random(Length(PasswordChars)); // eine Position per Zufall bestimmen
    // in einem String steht das erste Zeichen immer an Index 1. daher die Position +1
    PasswordChar := PasswordChars[CharIndex+1]; // Zeichen aus der Gruppe der möglichen Zeichen "raussuchen"
    Result := Result + PasswordChar; // Zeichen an das Ende deines Zielstrings anhängen um so das Passwort aufzubauen.

    // die drei Zeilen kann man aber auch als eine schreiben, schön kompakt
    //Result := Result + PasswordChars[Random(Length(PasswordChars))+1]; // Zufallszahl ermitteln und als zeichen interpretieren
  end;
  // Result ist die Standartvariable einer Funktion, sie gibt das Ergebnis beim verlassen automatisch zurück.
end;

procedure TForm1.BuCreateClick(Sender: TObject);
var
  meinPasswort: string;
begin
  // beim arbeiten mit Random, Randomize nicht vergessen,
  // sonst nimmt der Zufallsgenerator immer wieder die gleiche Zahlenkette
  // am besten Randomize einmal beim starten des Programmes (im OnFormCreate) aufrufen, das reicht völlig aus
  meinPasswort := GivePassword(20); // ein Passwort das 20 zeichen lang ist
end;

Ungetesteter Quelltext, sollte aber funktionieren.


Warum willst du eigentlich das O/o nicht? Schaut wohl zu sehr wie 0 (Null) aus? Dann ist deine Schrift zum anzeigen des Passwortes einfach nicht gut, ansonsten macht es ja nichts.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Salieri Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Fr 18.09.09 20:51 
Also danke erstmal für diese Erklärung.

Randomize am Anfang ausführen, also so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
end;

Ja?

Aber ich sehe irgendwie noch nich so ganz, wie ich das ganze dann als Text in mein Editierfeld ausgebe.
Und was hat es eigentlich mit diesem function ... auf sich? Ich kenne das bisher noch gar nicht. Also, dass dann der Buttondruck darauf zugreifft sehe ich, aber warum kommt das alles nicht mit in procedure TForm1.BuCreateClick mit rein? Und vorallem: Muss ich function ... dann auch bei Type mit angeben, wie auch procedure?
Ja, entschuldigung, ich bin halt noch relativ neu, hab mich damit wohl auch etwas übernommen, aber ich will das jetzt verstehen und ich lerne für gewöhnlich schnell. ^^

Ansonsten... Also einiges von dem Quelltext versteh ich noch nich so ganz. Zum Beispiel:
Zitat:
ausblenden Delphi-Quelltext
1:
  for l := 1 to APassLength do // schleife					

Warum da 1 := 1?
Ach ja, und was ist Char? Integer und String kenn ich ja, char leider noch nicht.

Auf jeden Fall schonmal ein großes Danke für die ganzen Erklärungen. :)

Zitat:
Warum willst du eigentlich das O/o nicht? Schaut wohl zu sehr wie 0 (Null) aus? Dann ist deine Schrift zum anzeigen des Passwortes einfach nicht gut, ansonsten macht es ja nichts.

Nene, darum geht es nicht, Ich habe auch einen Button zum kopieren des Passwortes eingerichtet, das Lesen vom Bildschirm ist nicht das Problem. Aber wenn man sich das ausgegebene Passwort aufschreibt, kann das schon Probleme geben. Also zumindest ich kann Null und O von mir aufgeschrieben nicht mehr auseinander halten. ^^
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Sa 19.09.09 12:29 
L und 1 kannst du auch nicht auseinander halten? Viele verwenden in einer for Schleife i oder j als Variable, ich verwende eine kleines "L". Das bei dir l und 1 gleich aussehen liegt entweder an deiner Schrift im Browser oder deinem Sehvermögen :wink: , denn zumindest bei mir unterscheiden sich l und 1 in einem Pixel (auch wenn das ein bisschen wenig ist)
Wenn du den Quelltext in Delphi anzeigst müsstest du erkennen das ein unterschied besteht.

Wenn ich mir deine Fragen so ansehe, kann ich dir eigentlich erstmal nur raten das du dich dringend mit den Grundlagen Crashkurs Delphi von Delphi befassen solltest, dann erklären sich alle deine Fragen von alleine.

Aber Trotzdem:
  • Char : ist ein einzelnes Zeichen. Ein String setzt sich aus einer Aneinanderreihung(array) aus Char zusammen.
  • Function : ist sowas wie eine Procedure, nur das sie mit dem Aufruf ein Ergebnis zurückliefert. Random ist zum Beispiel auch eine Function. Du kannst die Function so wie ich es in dem Beispiel gemacht habe einfach über den ButtonOnClick in den Quelltext kopieren. Fürs erste sollte das reichen.
  • user profile iconSalieri hat folgendes geschrieben Zum zitierten Posting springen:
    Also danke erstmal für diese Erklärung.
    Randomize am Anfang ausführen, also so:

    ausblenden Delphi-Quelltext
    1:
    2:
    3:
    4:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Randomize;
    end;

    Ja?
    Jep genau so.
  • user profile iconSalieri hat folgendes geschrieben Zum zitierten Posting springen:
    Aber ich sehe irgendwie noch nich so ganz, wie ich das ganze dann als Text in mein Editierfeld ausgebe.
    Ich habe dir doch eine Variable im Button Click deklariert. Die machst du einfach weg und schreibst statt dessen halt das Editfeld hin wo das Passwort angezeigt werden soll. zb.: Edit1.Text := .....

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Salieri Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Sa 19.09.09 21:20 
Zitat:
L und 1 kannst du auch nicht auseinander halten? Viele verwenden in einer for Schleife i oder j als Variable, ich verwende eine kleines "L". [...]

Im Quelltext von Delphi isses bei der 1 aber wirklich nur ein einziger Pixel, der einen Punkt tiefer ist und das erkenn ich mit Mandelentzündung nicht mehr, tut mir leid; aber danke für die Aufklärung. ^^

Zitat:
Wenn ich mir deine Fragen so ansehe, kann ich dir eigentlich erstmal nur raten das du dich dringend mit den Grundlagen Crashkurs Delphi von Delphi befassen solltest, dann erklären sich alle deine Fragen von alleine.

Na is doch ne gute bettlektüre für morgen Abend, danke für den Link. ;)
Ich lern es halt in der 13 in Informatik und es ist leider nur zweistündig, ich hatte zwar schon vorgesclagen Informatik als zweite Fremdsprache einzuführen (dann hätte ich kein sch..., blödes Spanisch :D ), aber iwie wollen die das alle nich so recht haben. ^^

Danke auf für die nachfolgende erklärung.

Zitat:
Ich habe dir doch eine Variable im Button Click deklariert. Die machst du einfach weg und schreibst statt dessen halt das Editfeld hin wo das Passwort angezeigt werden soll. zb.: Edit1.Text := .....

Ja, ich hatte irgendwas mit *.Text erwartet, darum war ich etwas verwirrt.

Okay, das funktioniert tadellos und: Ich habs sogar verstanden, is doch schonmal gut. ^^ Ich danke dir für die Hilfe bis hier hin. :)
Jetzt fehlt nurnoch, dass die drei Vorgaben vom Editirfeld mit aufgegriffen werden, also dass der Anwender die Anzahl von Ziffern, kleinbuchstaben und Großbuchstaben selbst festlegen kann. Aber ich hab von 11 Uhr bis vor ner Stunde meine Kellerwände vertäfelt (jaja, damit werd ich nich schneller gesund, aber freie Tage hat man erst im Studium - wenn man Glück hat - darum bleibt mir nur der Samstag für sowas...), heute is da nich mehr viel drin.
Aber es is ja nich so, dass ich nich selbst denken würde, könnte man da
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.BuCreateClick(Sender: TObject);
begin
  EdPassword.Text := GivePassword(20);
end;

nicht einfach statt der 20 die drei Werte der Editierfelder eingeben? Oder würden die Zeichen dann nicht vermischt werden?
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: So 20.09.09 13:31 
[OT]Mit Mandelentzündung arbeiten? Da sollte man einen Arzt konsultieren und eine ruhige Kugel schieben, also am besten programmieren ;-)
Delphi als Fremdsprache wählbar, das wäre mal was!
Freizeit im Studium, da kann ich nur von meinem, Informatikstudium, sprechen. Anfangs fand ich die Semesterpausen immer zu lang, unnütze Zeitverschwendung, die da schon versucht haben ihr Studium irgendwie über die Bühne zu bekommen haben das anders gesehen. Das ging mir dann ganz genauso, etweder arbeiten oder Projekte fertig machen um endlich malwieder eine Note zu bekommen und ein abgeschlossenes Fach näher am Diplom zu sein. Ganze Tage über die Woche hatten nur die Witschaftsfuzzies frei, alle anderen Fakultäten haben von Montag bis Freitag durchgerackert. [/OT]

user profile iconSalieri hat folgendes geschrieben Zum zitierten Posting springen:
Jetzt fehlt nurnoch, dass die drei Vorgaben vom Editirfeld mit aufgegriffen werden, also dass der Anwender die Anzahl von Ziffern, kleinbuchstaben und Großbuchstaben selbst festlegen kann. [...] Aber es is ja nich so, dass ich nich selbst denken würde, könnte man da
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.BuCreateClick(Sender: TObject);
begin
  EdPassword.Text := GivePassword(20);
end;

nicht einfach statt der 20 die drei Werte der Editierfelder eingeben? Oder würden die Zeichen dann nicht vermischt werden?

Ja, man kann drei (oder auch x wieviele) Werte übergeben. Das sind dann statt einem, halt drei Parameter, oder Attribute, daher auch das "A" vor dem eigentlichen Variablennamen. Das ist aber nicht Pflicht, es macht den Quelltext nur besser lesbarer.

Ich gebe dir diesmal nicht den vollen Quelltext, sondern nur einen unvollständigen Teil den du erweitern musst und ein paar Denkanstöße:
Du hast ja nun das Problem das sich die gesammte Länge des Passwortes aus drei einzelnen Teilen (später Gruppen) zusammensetzt deren Zeichen ja, denke ich mal, gemischt im Passwort enthalten sein sollen.
Was für Schleifen und Konstrukte hattet ihr schon in der Schule? Hier wird jedenfalls keine "for" Schleife mehr gebraucht statt dessen eine "while do" Schleife, das "case of" und das "if" Konstrukt.
Bisher wurden ja drei einzelnen Zeichengruppen als eine betrachtet. Nun müssen sie einzeln betrachtet werden und um das hinzubekommen kann man am besten "case of" verwenden.
Drei ist also hier das Stichwort. Via Zufall also Random kann man nun auswählen aus welcher Gruppe das nächste Zeichen im Passwort kommen soll. Zusätzlich muss noch beachtet werden ob überhaupt noch Zeichen aus der ausgewählten Gruppe eingefügt werden dürfen. Das bekommt man mit "if" und der Procedure Dec hin.
Zusammen:
Solange (while do) die aktuelle Summe der drei Zeichenanzahlen größer als Null ist tue :
Wähle per Zufall aus, aus welcher der drei Gruppen das nächste Zeichen kommen soll, unterscheide mit "case of" :
(0, 1, 2) jeweils eine für jeder der drei Gruppen
0 : kleine Buchstaben : Können aus dieser Gruppe noch Zeichen genommen werden (if) Anzahl der Zeichen größer als Null dann :
Ermittle Zeichen aus der Gruppe und füge es den Ergebnis hinzu; Verringere die Anzahl der noch möglichen Zeichen aus der Gruppe um eins.
Mache das gleiche mit Gruppe 1 (große Buchstaben) und Gruppe 2 (Zahlen)

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
function GivePassword(ALowers, AUppers, ANumbers: integer): string;
const
    cLower   = 'abcdefghijklmnpqrstuvwxyz';
    cUpper   = 'ABCDEFGHIJKLMNPQRSTUVWXYZ';
    cNumbers = '0123456789';
var
  CharIndex: integer;
  PasswordChar: char;

begin
  Result := ''// zielstring initialisieren
  while ALowers + ... + ... > 0 do // die neue Schleife (solange Summe der Zeichenanzahlen größer als Null)
  begin
    case Random(3of // wähle per Zufall aus, aus welcher der drei Gruppen das nächste Zeichen kommen soll
      0 : if ALowers > 0 then // sind aus der Gruppe noch Zeichen möglich?
          begin // kleinbuchstaben
            CharIndex := Random(Length(cLower))+1// via Zufall Zeichen aus der Gruppe ermitteln
            Result := Result + cLower[CharIndex];  // und an Ergebnis anhängen
            //Result := Result + cLower[Random(Length(cLower))+1]; // die Kurzfassung der beiden Zeilen oben drüber
            Dec(ALowers); // Anzahl der noch möglichen Zeichen aus der Gruppe um eins verringern
          end;
      1 : // großbuchstaben
          // .... machs mal selber!
      2 : // zahlen
          // hier auch
    end;
  end;
  // Result ist die Standartvariable einer Funktion, sie gibt das Ergebnis beim verlassen automatisch zurück.
end;

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Salieri Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: So 20.09.09 21:21 
Ach Mandelentzündung hab ich iwie zweimal im Jahr, ich hab mich dran gewöhnt. Mein Arzt meint bei zwei Mal Jährlich lohnt es nicht die rausnehmen zu lassen, aber iwie wr ich die schon ganz gern los muss ich sagen.
Zitat:
Delphi als Fremdsprache wählbar, das wäre mal was!

Nich wahr? :D
Also nen Kumpel von mir hat Mo bis Mi Vorlesungen und den Rest der Woche hat er frei... ^^

Zitat:
Was für Schleifen und Konstrukte hattet ihr schon in der Schule?

Wir hatten bisher nur if then else; da dürfte aber bald noch was kommen...

Habs geschafft, dank deiner unermüdlichen Hife. :)

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
function GivePassword(ALowers, AUppers, ANumbers : integer): string;
const
    cLower   = 'abcdefghijklmnpqrstuvwxyz';
    cUpper   = 'ABCDEFGHIJKLMNPQRSTUVWXYZ';
    cNumbers = '0123456789';
var
  CharIndex: integer;

begin
  Result := '';
  while ALowers + AUppers + ANumbers > 0 do
  begin
    case Random(3of
      0 : if ALowers > 0 then
          begin
            CharIndex := Random(Length(cLower))+1;
            Result := Result + cLower[CharIndex];
            Dec(ALowers);
          end;
      1 : if AUppers > 0 then
          begin
            CharIndex := Random(Length(cLower))+1;
            Result := Result + cUpper[CharIndex];
            Dec(AUppers);
          end;
      2 : if ANumbers > 0 then
          begin
            CharIndex := Random(Length(cNumbers))+1;
            Result := Result + cNumbers[CharIndex];
            Dec(AUppers);
          end;
  end;
end;
end;

procedure TForm1.BuCreateClick(Sender: TObject);
var
  ALowers, AUppers, ANumbers : Integer;
begin
  ALowers  := UpDoLower.Position;
  AUppers  := UpDoUpper.Position;
  ANumbers := UpDoNumbers.Position;
  EdPassword.Text := GivePassword(ALowers, AUppers, ANumbers);
end;

end.

Nur warum hast du bei dir in der Funktion noch PasswordChar deklariert? Ich komm da grad iwie ohne aus...
Also so funktioniert es auf jeden Fall und ohn dich hätte ich das nich geschafft. ielen Dank auf jeden Fall, bsonders für die guten Erklärungen. :)