AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi bei String, Array, und Records suchen
Thema durchsuchen
Ansicht
Themen-Optionen

bei String, Array, und Records suchen

Ein Thema von Dennis_Wolfram · begonnen am 4. Feb 2012 · letzter Beitrag vom 4. Feb 2012
Antwort Antwort
Dennis_Wolfram

Registriert seit: 8. Dez 2007
Ort: Berlin & Augsburg
29 Beiträge
 
Delphi 2010 Enterprise
 
#1

bei String, Array, und Records suchen

  Alt 4. Feb 2012, 14:02
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:
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;
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.

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

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
Dennis Wolfram
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Hilfe!!! bei String, Array, und Records suchen

  Alt 4. Feb 2012, 14:32
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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Hilfe!!! bei String, Array, und Records suchen

  Alt 4. Feb 2012, 14:33
Oder noch besser mit regulären Ausdrücken arbeiten, so kann man eine Ähnlichkeitssuche anstatt einer Such nach exakten Gliechheit durchführen.
Markus Kinzler
  Mit Zitat antworten Zitat
Dennis_Wolfram

Registriert seit: 8. Dez 2007
Ort: Berlin & Augsburg
29 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: Hilfe!!! bei String, Array, und Records suchen

  Alt 4. Feb 2012, 14:47
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
Dennis Wolfram

Geändert von Dennis_Wolfram ( 4. Feb 2012 um 14:49 Uhr)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Hilfe!!! bei String, Array, und Records suchen

  Alt 4. Feb 2012, 14:55
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.
  Mit Zitat antworten Zitat
Dennis_Wolfram

Registriert seit: 8. Dez 2007
Ort: Berlin & Augsburg
29 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: Hilfe!!! bei String, Array, und Records suchen

  Alt 4. Feb 2012, 14:58
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
Dennis Wolfram
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Hilfe!!! bei String, Array, und Records suchen

  Alt 4. Feb 2012, 15:57
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:
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;
Hilft Dir das erstmal weiter?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Dennis_Wolfram

Registriert seit: 8. Dez 2007
Ort: Berlin & Augsburg
29 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: Hilfe!!! bei String, Array, und Records suchen

  Alt 4. Feb 2012, 17:09
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
Dennis Wolfram
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Hilfe!!! bei String, Array, und Records suchen

  Alt 4. Feb 2012, 17:22
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);
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:21 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