Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Passwort Eingabe (https://www.delphipraxis.net/190-passwort-eingabe.html)

Jonson 18. Jun 2002 10:47


Passwort Eingabe
 
Es wird ein Passwort eingegeben. Hat jemand vielleicht eine Funktion für Passwort Überprüfung? Passwort (wird 2 mal eingegeben) sollte min. 6 Zeichen haben. Ich weiß nicht was ich eigentlich prüfen sollte und wie? was ist Sinnvoll?

Mit freundlichen Grüßen

Jonson

jbg 18. Jun 2002 10:55

Auch schon so probiert:
Code:
function IsValidPassword(const Password, ConfirmPassword): Boolean;
begin
  Result := (Length(Password) >= 6) and (Password = ConfirmPassword);
end;
Oder habe ich dich jetzt komplett falsch verstanden?

Jonson 18. Jun 2002 12:33

@jbg: Danke!

Jonson

Jonson 18. Jun 2002 12:41

Hi jbg,

bei Length(Password) Fehler: Inkompatible Typen

Jonson

jbg 18. Jun 2002 12:43

Einfach Copy&Paste ist nicht. Dafür habe ich schon gesorgt. :roll:

Ich habe vergessen beim Prozedurkopf : string mit anzugeben. Aber da hättest du auch selbst drauf kommen können.

Luckie 18. Jun 2002 12:58

Zitat:

Zitat von jbg
Einfach Copy&Paste ist nicht. Dafür habe ich schon gesorgt. :roll:

:lol: Werde ich mir als Abwehrmaßnahme gegen Copy&Paste Programmierer merken. :mrgreen:

Jonson 18. Jun 2002 13:16

Hi jbq,

Ich will kein Pastaprogrammierer sein :oops: , darum sage mir bitte warum schreibt man hier const. Wozu ist das gut? Es funktioniert auch ohne const

Jonson

jbg 18. Jun 2002 13:26

Wenn ein String an eine Prozedur/Funktion übergeben wird, dann wir er sozusagen kopiert. Dieses Kopieren ist wichtig, damit in der Funktion bei einer Änderung des Strings nicht gleich die übergebene Variable verändert wird. Wenn aber klar ist, dass dieser String gar nicht in der Funktion verändert werden soll, dann kann man mit der Angabe von const einen Geschwindigkeitsgewinn erziehlen, da der String nun nicht mehr kopiert werden muss, weil der Compiler schon verhindert, dass überhaupt in den String geschrieben werden kann.

Luckie 18. Jun 2002 13:30

Hm, ich hätte jetzt gesagt:
Wird der Parameter ohne const übergeben, dann wird eine Kopie angelegt von dem String auf dem Stack beim Aufruf. Wird der Parameter mit const übergeben, wird die Zeichenkette nicht kopiert sondern nur ein Zeiger auf die Zeichenkette auf dem Stack abgelegt., was Geschwindigkeitsvorteile bringt.

sakura 18. Jun 2002 13:37

Also, mal eine kurze Aufklärungsminute... :D

Parameter mit var
Es wird genaugenommen ein Pointer auf die Originalvariable übergeben. Wenn die Methode die Variable ändert, dann ändert sich auch das Original.

Parameter mit const
Dem Compiler wird deutlich gemacht, wiederum einem Pointer zu überreichen. Der Programmierer verbietet sich selbst, den Inhalt der Variable zu ändern.

Parameter ohne var/const
Der Compiler legt eine Kopie der Variable an. Diese kann geändert werden. Sollte der Inhalt sich nicht ändern, dann arbeitet Delphi (ab Version 4 od. 5) intern genauso, als wäre die Variable mit const deklariert.
Bei Pascal-Strings wird zusätzlich noch der Referenzcounter gesetzt/gelöscht.

Ich hoffe, dass dieses ein wenig Aufschluss gibt.

Tags gefixt - Luckie

Luckie 18. Jun 2002 13:41

Zitat:

Zitat von sakura
Parameter mit const
Dem Compiler wird deutlich gemacht, wiederum einem Pointer zu überreichen. Der Programmierer verbietet sich selbst, den Inhalt der Variable zu ändern.

Also haben wir beide recht gehabt.

Christian Seehase 18. Jun 2002 14:56

Moin Zusammen,

was man dabei aber auch wieder nicht vergessen darf:
Wird als Parameter ein Objekt übergeben, z.B. eine StringListe, so können auch dann Werte verändert werden, selbst wenn dieser Parameter als const übergeben wird, da der Inhalt des Parameters so oder so eine Referenz auf das Objekt enthält.

Solange kein String als Wertparameter übergeben wird (also ohne var/const) nehmen sich die Varianten bezüglich ihrer Geschwindigkeit nicht viel.

sakura 18. Jun 2002 15:13

Hi,

also kurz als Erweiterung um Christians Kommentar mit einzubeziehen.

Wenn ein Objekt als Parameter übergeben wird, dann kann man generell auf alle (öffentlichen) Methoden und Eigenschaften des Objektes zugreifen und somit den Inhalt ändern.

Object als var: Der alte Pointer (intern als Pointer) zum Objekt kann gelöscht/überschrieben werden. Objekt sollte wahrscheinlich vorher zerstört werden, um alle Ressourcen freizugeben. Der Aufrufer benutzt nach dem Methodenaufruf das neue Objekt.

Object als const: Der alte Pointer kann nicht geändert werden - aber die Methoden und Eigenschaften des Objektes können genutzt/geändert zu werden.

Object ohne var/const: Wie bereits bei normalen Variablen - der Pointer wird kopiert, sollte dieser innerhalb der Methode geändert werden. Er wird belassen, wenn keine Neuzuweisung auf den Pointer erfolgt.

:)

Danke Christian - jetzt sollte (hoffentlich) diese Frage vollständig geklärt sein.

Susi_W 18. Jun 2002 23:32

Muss man das verstehen?
 
Hi ihr.

Ich hab jetzt versucht zu verstehen, was da steht, aber irgendwie bin ich nicht ganz mitgkommen.
Wenn man einen Parameter mittels var übergibt, ändert man doch den Inhalt der Variable.
Mit const kann man ihn nicht ändern(denke ich).
Wenn man den Parameter ohne var/const deklariert, wird eine Kopie auf dem Stack angelegt.
Selbst wenn ich eine StringListe per const übergebe, kann ich deren Inhalt ändern.
Ich versteh das nicht.
Da hat Borland wohl Mist gebaut.

Gute Nacht an alle, Susi.

Christian Seehase 18. Jun 2002 23:51

Moin Susi,

ich weiss gar nicht, was Du willst? So wie es aussieht hast Du es doch verstanden, nur was ein Objekt ist vielleicht noch nicht so ganz. ;-)
Eine Variable, die ein Objekt darstellt enthält nur den Zeiger auf das Objekt.
(Leider (zum Glück!?) hat Borland es verstanden dies so schön zu kapseln, dass es nicht unbeding sofort auffällt.)
Dadurch sind alle Eigenschaften/Methoden des Objektes zugänglich.
Beispiel StringListe:
Die Methode Add ist dafür zuständig neue Strings an die Liste anzuhängen. Da diese ja zugänglich ist, funktioniert auch das Add.
Was hingegen nicht geht, wenn der Wert als Konstante oder Wertparameter übergeben wird, ist es den Inhalt auf ein anderes Objekt zu ändern. Könnte auch fatal sein (und in Speicherlecks münden), wenn vorher nicht das ursprüngliche Objekt wieder freigegeben würde.
Das ist das gleiche Prinzip, wie bei den API Funktionen. Sollen hier die Funktionen Werte zurückliefern, so wird oft einfach die Adresse eines Speicherbereiches übergeben, in den die Funktion dann die Ergebnisse schreiben kann. Dabei stört es dann auch überhaupt nicht den Parameter als Konstant(e) anzugeben. Der Pointer reicht, um dieses zu ermöglichen.
Wenn Borland "Mist gebaut" hat, dann bei der Deklaration der einen oder anderen API-Funktion. Die lassen sich oft nicht so aufrufen, wie es laut PSDK gehen sollte. :-(

BTW:

MrSpock 19. Jun 2002 06:35

Hallo Susi_W,

die Aussage:

Zitat:

Wenn man einen Parameter mittels var übergibt, ändert man doch den Inhalt der Variable.
sollte am Ende ergänzt werden durch:

Code:
, wenn man dem Parameter innerhalb der Procedure / Function einen Wert zuweist.
denn der Wert auch als Var Parameter übergebener Variablen wird sonst nicht verändert. :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:28 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-2025 by Thomas Breitkreuz