Einzelnen Beitrag anzeigen

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