![]() |
bei String, Array, und Records suchen
Hallo liebe Delpfianer,
bin mal wieder am rumknobeln und komme an einem Punkt einfach nicht weiter, obwohl ich das Forum schon durchstöbert und vieles davon probiert habe. Folgendes ist gegeben: Eine kleine Anwendung: Form1: ist für die Benutzeranmeldung (Benutzername & Passwort) für diese Anwendung. Form2: hier werden die Benutzer angelegt und in eine Textdatei gespeichert, geöffnet und bearbeitet. Form3: das eigentliche Hauptfenster meiner Anwendung. Ziel ist es mit Form2 Benutzer (Benutzername, Kennwort usw.) anzulegen, zu barbeiten oder zu löchen. Diese Daten werden in eine Datei gespeichert (Benutzer.dat). Das funktioniert auch alles ganz gut. Hier mal die Unit:
Delphi-Quellcode:
Nun Ziel ist es wenn die Anwendung ausgefürt und Form1 angezeigt wird, das der Benutzer seinen Benutzernamen und Passwort einträgt, anschließend diese Eingaben dann mit der zuvor in Form2. erstellten Benutzer.dat verglichenn werden und wenn sie mit einem Datensatz übereinstimmen, Form3 also das Huptfenster geöffnet wird.
var
benutzermax: Word = 1; // Arrygröße-Max. Anz. d. Benutzer type TBenutzer = record // Typ der Struckturvariable Benutzername: string[255]; Kennwort: string[255]; Kennworthinweis: string[255]; Vorname: string[255]; ZVorname: string[255]; Nachname: string[255]; Geschlaecht: boolean; Geborenam: string[255]; Geborenin: string[255]; Straße: string[255]; PLZ: string[255]; Ort: string[255]; Festnetz: string[255]; Mobil: string[255]; Email: string[255]; Internetseite: string[255]; Kontakthinweis: string[255]; end; var benutzer: array of TBenutzer; // dyn. Datenhaltung puffer: array of TBenutzer; // dto. zum zw.speichern index: Word = 0; // akt. Feldindex beginnt mit 0 f: TFileStream; // persistente Datenhaltung pfad: string; procedure TForm2.DS_Benutzer_Speichern; begin benutzer[index].Benutzername := Edit6.Text; benutzer[index].Kennwort := Edit7.Text; benutzer[index].Vorname := Edit1.Text; benutzer[index].ZVorname := Edit2.Text; benutzer[index].Nachname := Edit3.Text; benutzer[index].Geborenam := Edit4.Text; benutzer[index].Geborenin := Edit5.Text; benutzer[index].Kennworthinweis := Edit8.Text; benutzer[index].Straße := Edit12.Text; benutzer[index].PLZ := Edit9.Text; benutzer[index].Ort := Edit11.Text; benutzer[index].Festnetz := Edit10.Text; benutzer[index].Mobil := Edit13.Text; benutzer[index].Email := Edit16.Text; benutzer[index].Internetseite := Edit14.Text; benutzer[index].Kontakthinweis := Edit15.Text; end; procedure TForm2.DS_Benutzer_Anzeigen; begin Edit6.Text := benutzer[index].Benutzername; Edit7.Text := benutzer[index].Kennwort; Edit1.Text := benutzer[index].Vorname; Edit2.Text := benutzer[index].ZVorname; Edit3.Text := benutzer[index].Nachname; Edit4.Text := benutzer[index].Geborenam; Edit5.Text := benutzer[index].Geborenin; Edit8.Text := benutzer[index].Kennworthinweis; Edit12.Text := benutzer[index].Straße; Edit9.Text := benutzer[index].PLZ; Edit11.Text := benutzer[index].Ort; Edit10.Text := benutzer[index].Festnetz; Edit13.Text := benutzer[index].Mobil; Edit16.Text := benutzer[index].Email; Edit14.Text := benutzer[index].Internetseite; Edit15.Text := benutzer[index].Kontakthinweis; end; procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); var i: Integer; begin i := Application.MessageBox('Soll die Änderungen gespeichert werden?', 'Frage', 36); if i = 6 then // Ja-Button gedrückt begin DS_Benutzer_Speichern; // aktuellen Datensatz sichern if Button8.Enabled then Button8Click(Self) else Button9Click(Self) end; benutzer := nil; puffer := nil end; procedure TForm2.FormCreate(Sender: TObject); begin SetLength(benutzer, benutzermax); // Array mit einem Feld wird angelegt DS_Benutzer_Anzeigen; pfad := ExtractFilePath(ParamStr(0)) + 'Benutzer'; // einen Standard-Dateinamen zuweisen Caption := pfad; DS_Benutzer_Anzeigen; // ersten Datensatz anzeigen Button8.Enabled := False; // Datei existiert noch nicht SaveDialog1.Options := [OFOverwritePrompt]; // Warnung vor Überschreiben SaveDialog1.FileName := pfad end; procedure TForm2.Button2Click(Sender: TObject); // DS löschen var i: Word; j: Integer; begin if benutzermax = 1 then Application.MessageBox('Der letzte Datensatz kann nicht gelöscht werden!', 'Problem', 0) else if MessageDlg('Wollen Sie den Datensatz wirkliche löschen?', mtWarning, [mbYes, mbNo], 0) = mrYes then begin SetLength(puffer, benutzermax - 1); j := -1; for i := 0 to benutzermax - 1 do if i <> index then begin Inc(j); puffer[j] := benutzer[i]; end; Dec(benutzermax); for i := 0 to benutzermax - 1 do benutzer[i] := puffer[i]; // zurück kopieren benutzer := Copy(benutzer, 0, benutzermax); // letzten DS abschneiden if index > 0 then Dec(index); DS_Benutzer_Anzeigen; end; end; . . . procedure TForm2.Button1Click(Sender: TObject); // neuer DS var i, j: Integer; begin DS_Benutzer_Speichern; SetLength(puffer, benutzermax + 1); j := -1; for i := 0 to benutzermax - 1 do begin Inc(j); puffer[j] := benutzer[i]; if i = index then Inc(j) // hier wird der neue DS eingefügt end; Inc(benutzermax); SetLength(benutzer, benutzermax); for i := 0 to benutzermax - 1 do benutzer[i] := puffer[i]; // zurück kopieren if index < benutzermax - 1 then Inc(index); DS_Benutzer_Anzeigen; end; . . . procedure TForm2.Button7Click(Sender: TObject); // öffnen var i: Word; begin if OpenDialog1.Execute then begin pfad := OpenDialog1.FileName; try f := TFileStream.Create(pfad, fmOpenRead) except MessageBeep(0); Application.MessageBox('Die Datei konnte nicht geöffnet werden!', 'Fehler', 52); Exit end; f.ReadBuffer(benutzermax, SizeOf(Word)); SetLength(benutzer, benutzermax); for i := benutzermax - 1 downto 0 do f.ReadBuffer(benutzer[i], SizeOf(TBenutzer)); // alle Datensätze einlesen index := 0; DS_Benutzer_Anzeigen; // ersten Datensatz anzeigen Form3.Caption := pfad; // Anzeige Dateipfad in Titelleiste des Formulars Button8.Enabled := True; // freigeben zum Speichern f.Free end end; procedure TForm2.Button8Click(Sender: TObject); // speichern var i: Integer; begin try f := TFileStream.Create(pfad, fmOpenWrite) except ShowMessage (' Fehler beim Speichern von ' + pfad); Exit end; f.WriteBuffer(benutzermax, SizeOf(Word)); for i := benutzermax - 1 downto 0 do f.WriteBuffer(benutzer[i], SizeOf(TBenutzer)); f.Free end; procedure TForm2.Button9Click(Sender: TObject); // speichern unter begin if SaveDialog1.Execute then begin pfad := SaveDialog1.FileName; try f := TFileStream.Create(pfad, fmCreate) except ShowMessage ('Fehler beim Erzeugen der neuen Datei!'); Exit end; f.Free; Button8Click(Self); // zum Menüpunkt: Datei speichern Caption := pfad; Button8.Enabled := True end end; Dazu habe ich, außer die Proceduren Speichern, Speichern unter, Neuer Datensatz, Datensatz löschen sowie die FormClose-Procedur, die oben stehenden Unit weitesgehend auch in Form1 übernommen und durch folgende Proceduren erweitert:
Delphi-Quellcode:
Nun mein Problem ist das das so leider nicht funktioniert. Wenn ich die Eingabe leer lasse dan n öffnet sich Form3 obwohl das ja vermieden werden soll aber das ist nicht das eigendliche Problem. Wo es bei mir aussetzt ist das wenn ich die richtigen daten eingebe, er mir sagt der Datensatz wurde nicht gefunden. Wenn ich aber die gleiche Suchprocedure im Form2 benutzer klappt alles Problemlos wie es soll.
procedure TForm12.Button1Click(Sender: TObject); //Suchen
var i: Word; begin for i := 0 to benutzermax-1 do if UpperCase(benutzer[i].benutzername) = UpperCase(Form1.Edit1.Text) then if UpperCase(benutzer[i].kennwort) = UpperCase(Form1.Edit21.Text) then begin index := i; Form3.Show; Exit end; ShowMessage('Datensatz nicht gefunden!'); end; Sieht Ihr meine Fehler oder Gedankenfehler??? Ich hab jetzt die Syntax so oft gelesen das ich nicht mehr weiß wo oben oder unten ist. Über eure Hilfe wäre ich sehr Dankbar Liebe Grüße Dennis |
AW: Hilfe!!! bei String, Array, und Records suchen
Ein paar Ratschläge: schmeiß die globalen Variablen weg, ebenso das Array. Statt des Arrays würde ich Dir, da Du ja laut Profil D2010 verwendest, zu einer generischen Liste raten, die wächst und schrumpft dynamisch. Dann würde ich den Vergleich nicht mit Uppercase machen, sondern mit AnsiSameText für den Benutzernamen und AnsiSameString für das Kennwort, da bei Letzterem ja wohl Groß- und Kleinschreibung schon eine Rolle spielen sollten. Und wieso benutzt Du nicht die vordefinierten sprechenden Konstanten, die machen den Code doch viel besser lesbar, und das ganz ohne Kommentare? Passend dazu solltest Du Deine Komponenten auch mal sprechend benennen, oder schaust Du jedesmal nach, welchen Sinn Edit465 hat?
|
AW: Hilfe!!! bei String, Array, und Records suchen
Oder noch besser mit regulären Ausdrücken arbeiten, so kann man eine Ähnlichkeitssuche anstatt einer Such nach exakten Gliechheit durchführen.
|
AW: Hilfe!!! bei String, Array, und Records suchen
Ok??? Leider hab ich von generischen Liste oder der Ähnlichkeitssuche gehört. Werd mal das DP durchsuchen .Könntet ihr das mal an einem Beispiel erklären? Ich kann das nicht für mich umsetzten. Danke auch dafür LG Dennis
|
AW: Hilfe!!! bei String, Array, und Records suchen
Wie wär‘s mit einer From3.DatenBasis.IndexOf(const User, Passwort: string): integer; ?
Besser, ein Klasse TBenutzerClass, die Zufriff auf die Datenbasis hat und über eine solche Methode verfügt. |
AW: Hilfe!!! bei String, Array, und Records suchen
Leider bin ich jetzt TOTAL überfodert.. hab mal das DP durch gesucht, aber nix verständliches gefunden. Hat mal jemand zufällig ne Anleitung für Dummies ?
Danke Dennis |
AW: Hilfe!!! bei String, Array, und Records suchen
Ehrlich gesagt verstehe ich im Moment auch nicht, wie uns hier eine Ähnlichkeitssuche weiterhelfen sollte. Entweder Benutzername und Passwort sind korrekt oder eben nicht, man kann ja nicht "so ähnlich" eingeloggt werden. Zur Liste:
Delphi-Quellcode:
Hilft Dir das erstmal weiter?
uses ..., Generics.Collections;
type TPerson = record Name, Passwort: ShortString; end; TPersonenListe = TList<TPerson>; //generische Liste mit TPerson-Elementen TForm1 = class(TForm) ... private { Private-Deklarationen } FPersonen: TPersonenListe; function PersonInList(const AName, APW: ShortString): Boolean; ... end; ... procedure TForm1.FormCreate(Sender: TObject); var Person: TPerson; begin //Erzeugen der Liste FPersonen := TPersonenListe.Create; //Einfügen von 3 Personen (testhalber) Person.Name := 'Heinz'; Person.Passwort := '123'; FPersonen.Add(Person); Person.Name := 'Hans'; Person.Passwort := '234'; FPersonen.Add(Person); Person.Name := 'Adalbert'; Person.Passwort := 'Rubbeldikatz'; FPersonen.Add(Person); end; procedure TForm1.FormDestroy(Sender: TObject); begin //Liste wieder freigeben FPersonen.Free; end; (* Ermitteln, ob eine Person mit der angegebenen Namens-Passwort-Kombination vorhanden ist. Beim Namen wird case-insensitive verglichen, beim Passwort nicht. *) function TForm1.PersonInList(const AName, APW: ShortString): Boolean; var Person: TPerson; begin Result := false; for Person in FPersonen do begin Result := AnsiSameText(string(Person.Name), string(AName)) and AnsiSameStr(string(Person.Passwort), string(APW)); if Result then break; end; end; |
AW: Hilfe!!! bei String, Array, und Records suchen
Ich stell mich heute wieder an - ich weiß aber wie soll ich dann diese Funktion über eine Procedur aufrufen können(Button1Click)??? Weil so wird Sie ja sonst nicht beim Ausführen verwendet. LG Dennis
|
AW: Hilfe!!! bei String, Array, und Records suchen
Na, wie jede "normale" Funktion auch:
Delphi-Quellcode:
aName := edtName.Text;
aPasswort := edtPasswort.Text; if PersonInList(aName, aPasswort) then LoggedIn := true else MessageBox(Handle, 'Benutzer unbekannt oder falsches Passwort', 'Fehler beim Login', MB_OK or MB_ICONERROR); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:41 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