
unit Unit1;

{$mode objfpc}{$H+}

interface
uses
  LCLTranslator, Classes, SysUtils, sqlite3conn, sqldb, db, FileUtil, Forms, Controls,
  Graphics, Dialogs, DBGrids, StdCtrls, ExtCtrls, Buttons;
type

  { TForm1 }

  TForm1 = class(TForm)
    ButtonPLZ: TButton;
    ButtonSucheDatum: TButton;
    ButtonSucheOrt: TButton;
    ButtonSucheName: TButton;
    ButtonVor: TButton;
    ButtonZurueck: TButton;
    ButtonLoeschen: TButton;
    ButtonHinzu: TButton;
    ButtonAendern: TButton;
    ButtonNeu: TButton;
    ButtonSuchenAlle: TButton;
    ButtonZA: TButton;
    ButtonAZ: TButton;
    ButtonNummer: TButton;
    EditDatumEintrag: TEdit;
    EditVorname: TEdit;
    EditNachname: TEdit;
    EditNummer: TEdit;
    EditOrt: TEdit;
    EditStrasse: TEdit;
    EditMail: TEdit;
    EditSuchfeld: TEdit;
    ImageHilfe: TImage;
    Label1: TLabel;
    LabelAenderung: TLabel;
    LabelZeit: TLabel;
    LabelDatum: TLabel;
    LabelSuchen: TLabel;
    LabelNavigation: TLabel;
    LabelUeberschrift: TLabel;
    LabelNummer: TLabel;
    LabelVorname: TLabel;
    LabelNachname: TLabel;
    LabelOrt: TLabel;
    LabelStrasse: TLabel;
    LabelMail: TLabel;
    LabelSort: TLabel;
    ListBox1: TListBox;
    SQLite3Connection1: TSQLite3Connection;
    SQLQuery1: TSQLQuery;
    SQLTransaction1: TSQLTransaction;
    Timer1: TTimer;
    procedure ButtonPLZClick(Sender: TObject);
    procedure ButtonSucheDatumClick(Sender: TObject);
    procedure ButtonSucheOrtClick(Sender: TObject);
    procedure ButtonSucheNameClick(Sender: TObject);
    procedure ButtonVorClick(Sender: TObject);
    procedure ButtonZurueckClick(Sender: TObject);
    procedure ButtonLoeschenClick(Sender: TObject);
    procedure ButtonHinzuClick(Sender: TObject);
    procedure ButtonAendernClick(Sender: TObject);
    procedure ButtonNeuClick(Sender: TObject);
    procedure ButtonSuchenAlleClick(Sender: TObject);
    procedure ButtonZAClick(Sender: TObject);
    procedure ButtonAZClick(Sender: TObject);
    procedure ButtonNummerClick(Sender: TObject);
    procedure DatenZeigen;
    procedure DatenLaden;
    procedure EditSuchfeldKeyPress(Sender: TObject; var Key: char);
    procedure FormCreate(Sender: TObject);
    procedure ImageHilfeClick(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;
  AnzeigeNummer: Array of String;
  AnzeigeVorname: Array of String;
  AnzeigeNachname: Array of String;
  AnzeigeWohnort: Array of String;
  AnzeigeStrasse: Array of String;
  AnzeigeEMail: Array of String;
  AnzeigeDatumEintrag: Array of String;
  Zaehler: Integer;
  DatenMax: Integer;
  AlphaSort : Boolean;
  IDSort: Boolean;
  ListeNeuLaden: Boolean;

implementation

{$R *.lfm}

{ TForm1 }


procedure TForm1.DatenZeigen;
begin
   Zaehler:= 0;
   ListBox1.Clear;

   SQLQuery1.Close;
   If IDSort = true then
   begin
      SQLQuery1.SQL.text:='SELECT * FROM Namen ORDER BY ID';
   end;
   // asc aufwärts desc abwärts sortieren
   if IDSort = false then
   begin
   if AlphaSort = true then
   begin
      SQLQuery1.SQL.text:='SELECT * FROM Namen ORDER BY Nachname asc'
   end
   else SQLQuery1.SQL.text:='SELECT * FROM Namen ORDER BY Nachname desc';

   end;

   SQLQuery1.Open;

   while not SQLQuery1.Eof do
   begin
      // Arrays vergrößern
      SetLength(AnzeigeNummer, Zaehler + 1);
      SetLength(AnzeigeVorname, Zaehler + 1);
      SetLength(AnzeigeNachname, Zaehler + 1);
      SetLength(AnzeigeWohnort, Zaehler + 1);
      SetLength(AnzeigeStrasse, Zaehler + 1);
      SetLength(AnzeigeEMail, Zaehler + 1);
      SetLength(AnzeigeDatumEintrag, Zaehler + 1);
      AnzeigeNummer[Zaehler]:= SQLQuery1.Fields[0].AsString;
      AnzeigeVorname[Zaehler]:= SQLQuery1.Fields[1].AsString;
      AnzeigeNachname[Zaehler]:= SQLQuery1.Fields[2].AsString;
      AnzeigeWohnort[Zaehler]:= SQLQuery1.Fields[3].AsString;
      AnzeigeStrasse[Zaehler]:= SQLQuery1.Fields[4].AsString;
      AnzeigeEMail[Zaehler]:= SQLQuery1.Fields[5].AsString;
      AnzeigeDatumEintrag[Zaehler]:= SQLQuery1.Fields[6].AsString;
      // Anzeige Nummer, Nachname, Vorname
      ListBox1.Items.add(SQLQuery1.Fields[0].AsString +' ' + SQLQuery1.Fields[2].AsString + ', ' + SQLQuery1.Fields[1].AsString);
      SQLQuery1.Next;
      inc(Zaehler);
   end;

   DatenMax:= Zaehler;
   AlphaSort:= true;
   IDSort:= false;
   If ListeNeuLaden = true then
   begin
      ListBox1.Selected[0]:= true;
      ListeNeuLaden := false;
      EditNummer.Text:= AnzeigeNummer[ListBox1.ItemIndex];
      EditVorname.Text:= AnzeigeVorname[ListBox1.ItemIndex];
      EditNachname.Text:= AnzeigeNachname[ListBox1.ItemIndex];
      EditOrt.Text:= AnzeigeWohnort[ListBox1.ItemIndex];
      EditStrasse.Text:= AnzeigeStrasse[ListBox1.ItemIndex];
      EditMail.Text:= AnzeigeEMail[ListBox1.ItemIndex];
      EditDatumEintrag.Text:= AnzeigeDatumEintrag[ListBox1.ItemIndex];
   end;
end;

procedure TForm1.ButtonVorClick(Sender: TObject);
begin
   if ListBox1.ItemIndex < ListBox1.Count - 1 then
   begin
      // SqlQuery1.SQL.text := 'SELECT *  FROM Namen WHERE ID = ListBox1.ItemIndex + 1';
      EditNummer.Text:= AnzeigeNummer[ListBox1.ItemIndex + 1];
      EditVorname.Text:= AnzeigeVorname[ListBox1.ItemIndex + 1];
      EditNachname.Text:= AnzeigeNachname[ListBox1.ItemIndex + 1];
      EditOrt.Text:= AnzeigeWohnort[ListBox1.ItemIndex + 1];
      EditStrasse.Text:= AnzeigeStrasse[ListBox1.ItemIndex + 1];
      EditMail.Text:= AnzeigeEMail[ListBox1.ItemIndex + 1];
      EditDatumEintrag.Text:= AnzeigeDatumEintrag[ListBox1.ItemIndex];
      ListBox1.Selected[ListBox1.ItemIndex + 1]:= true;
   end;
end;

procedure TForm1.ButtonSucheOrtClick(Sender: TObject);
var
  Suchfeld: String;
begin
   Zaehler:= 0;
   ListBox1.Clear;
   Suchfeld:= EditSuchfeld.Text;
   // * durch % ersetzen
   Suchfeld:= StringReplace(EditSuchfeld.Text, '*', '%', [rfReplaceAll, rfIgnoreCase]);
   SQLQuery1.Close;
   SQLQuery1.SQL.Text:= 'select * from Namen WHERE SUBSTR(Wohnort,7, LENGTH(Wohnort)) like  + "'+ Suchfeld +'"';
   SQLQuery1.Open;
   DatenLaden;
end;

procedure TForm1.ButtonSucheDatumClick(Sender: TObject);
var
  Suchfeld: String;
begin
   Zaehler:= 0;
   ListBox1.Clear;
   Suchfeld:= EditSuchfeld.Text;
   // * durch % ersetzen
   Suchfeld:= StringReplace(EditSuchfeld.Text, '*', '%', [rfReplaceAll, rfIgnoreCase]);
   SQLQuery1.Close;
   SQLQuery1.SQL.Text:= 'select * from Namen WHERE SUBSTR(Datum,1,10) like  + "'+ Suchfeld +'"';
   SQLQuery1.Open;
   DatenLaden;
end;

procedure TForm1.ButtonPLZClick(Sender: TObject);
var
  Suchfeld: String;
begin
   Zaehler:= 0;
   ListBox1.Clear;
   Suchfeld:= EditSuchfeld.Text;
   // * durch % ersetzen
   Suchfeld:= StringReplace(EditSuchfeld.Text, '*', '%', [rfReplaceAll, rfIgnoreCase]);
   SQLQuery1.Close;
   SQLQuery1.SQL.Text:= 'select * from Namen WHERE SUBSTR(Wohnort,1, 5) like  + "'+ Suchfeld +'"';
   SQLQuery1.Open;
   DatenLaden;

end;

procedure TForm1.ButtonSucheNameClick(Sender: TObject);
var
  Suchfeld: String;
begin
   Zaehler:= 0;
   ListBox1.Clear;
   Suchfeld:= EditSuchfeld.Text;
   // * durch % ersetzen
   Suchfeld:= StringReplace(EditSuchfeld.Text, '*', '%', [rfReplaceAll, rfIgnoreCase]);
   SQLQuery1.Close;
   SQLQuery1.SQL.Text:= 'SELECT * FROM Namen WHERE Nachname LIKE  + "'+ Suchfeld +'"';
   SQLQuery1.Open;
   DatenLaden;
end;

procedure TForm1.ButtonZurueckClick(Sender: TObject);

begin
   if ListBox1.ItemIndex > 0 then
   begin
      // SqlQuery1.SQL.text := 'SELECT *  FROM Namen WHERE ID = ListBox1.ItemIndex - 1';
      EditNummer.Text:= AnzeigeNummer[ListBox1.ItemIndex - 1];
      EditVorname.Text:= AnzeigeVorname[ListBox1.ItemIndex - 1];
      EditNachname.Text:= AnzeigeNachname[ListBox1.ItemIndex - 1];
      EditOrt.Text:= AnzeigeWohnort[ListBox1.ItemIndex - 1];
      EditStrasse.Text:= AnzeigeStrasse[ListBox1.ItemIndex - 1];
      EditMail.Text:= AnzeigeEMail[ListBox1.ItemIndex - 1];
      EditDatumEintrag.Text:= AnzeigeDatumEintrag[ListBox1.ItemIndex];
      ListBox1.Selected[ListBox1.ItemIndex - 1]:= true;
   end;
end;

procedure TForm1.ButtonLoeschenClick(Sender: TObject);
var
  Antwort: Integer;
begin
   Antwort := MessageDlg('Bestätigung','Datensatz ' + EditNummer.Text + ' (' + EditNachname.Text +') löschen?', mtConfirmation, [mbYes, mbNo], 0,mbNo);
   If Antwort= mrYes then
   begin
      SqlQuery1.Close;
      SqlQuery1.SQL.text := 'DELETE FROM Namen WHERE ID = "'+ EditNummer.Text +'"';
      SqlQuery1.ExecSQL;
      SqlTransaction1.Commit;
      DatenZeigen;
   end;
end;

procedure TForm1.ButtonHinzuClick(Sender: TObject);
var Nachname, Vorname, Wohnort, ID, Strasse, EMail, DatumEintrag: String;
begin
   Nachname := EditVorname.text;
   Vorname := EditNachname.text;
   ID:= EditNummer.Text;
   Wohnort:= EditOrt.Text;
   Strasse:= EditStrasse.Text;
   EMail:= EditMail.Text;
   DatumEintrag:= LabelDatum.Caption + ' ' + FormatDateTime('hh:nn:ss',Time);
   SqlQuery1.close;
   SQLQuery1.SQL.Text:='INSERT INTO Namen VALUES ("'+ ID + '","' + Nachname + '","' + Vorname + '","' + Wohnort  + '","' + Strasse  + '","' + EMail + '","' + DatumEintrag + '")' ;
   SqlQuery1.ExecSQL;
   EditVorname.Text:= '';
   EditNachname.Text:= '';
   EditNummer.Text:= '';
   EditOrt.Text:= '';
   EditStrasse.Text:= '';
   EditMail.Text:= '';
   SQLTransaction1.Commit;
   ListeNeuLaden:= true;
   DatenZeigen;
   ButtonHinzu.Visible:= false;
end;

procedure TForm1.ButtonAendernClick(Sender: TObject);
  var
    Nachname, Vorname, Wohnort, ID, EMail, Strasse, DatumEintrag : String;
    Antwort: Integer;
begin
   Vorname := EditVorname.text;
   Nachname := EditNachname.text;
   Wohnort:= EditOrt.Text;
   Strasse := EditStrasse.text;
   EMail := EditMail.text;
   ID:= EditNummer.Text;
   SqlQuery1.Close;
   DatumEintrag:= LabelDatum.Caption + ' ' + FormatDateTime('hh:nn:ss',Time);
   SqlQuery1.Sql.Text:= 'UPDATE Namen SET Nachname = + "'+ Nachname + '" , Vorname = + "'+ Vorname + '" , Wohnort = + "'+ Wohnort +'" , Strasse = + "'+ Strasse + '" , EMail = + "' + EMail + '" , Datum = + "'+ DatumEintrag +'" WHERE ID = "'+ ID +'"';
   SqlQuery1.ExecSQL;
   Antwort := MessageDlg('Änderung schreiben','Datensatz ' + EditNummer.Text + ' (' + EditNachname.Text +') ändern?', mtConfirmation, [mbYes, mbNo], 0,mbNo);
   If Antwort= mrYes then
   begin
      SQLTransaction1.Commit;
   end
   else SQLTransaction1.Rollback;

   EditVorname.Text:= '';
   EditNachname.Text:= '';
   EditNummer.Text:= '';
   EditOrt.Text:= '';
   EditStrasse.Text:= '';
   EditMail.Text:= '';
   EditDatumEintrag.Text:= '';
   ListeNeuLaden:= true;
   DatenZeigen;
end;

procedure TForm1.ButtonNeuClick(Sender: TObject);
begin
  ButtonHinzu.Visible:= true;
  EditVorname.Text:= '';
  EditNachname.Text:= '';
  EditNummer.Text:= '';
  EditOrt.Text:= '';
  EditStrasse.Text:= '';
  EditMail.Text:= '';
  EditDatumEintrag.Text:= '';
  EditNummer.Text:= IntToStr(DatenMax + 1);
end;

procedure TForm1.ButtonSuchenAlleClick(Sender: TObject);
var
  Suchfeld: String;
begin
   Zaehler:= 0;
   ListBox1.Clear;
   Suchfeld:= EditSuchfeld.Text;
   // * durch % ersetzen
   Suchfeld:= StringReplace(EditSuchfeld.Text, '*', '%', [rfReplaceAll, rfIgnoreCase]);
   SQLQuery1.Close;
   SQLQuery1.SQL.Text:= 'select * from Namen WHERE Nachname like  + "'+ Suchfeld +'" or ID like  + "'+ Suchfeld +'" or Vorname like  + "'+ Suchfeld +'" or Wohnort like  + "'+ Suchfeld +'"or Datum like  + "'+ Suchfeld +'"';
   SQLQuery1.Open;
   DatenLaden;
   DatenMax:= Zaehler;
end;

procedure TForm1.ButtonZAClick(Sender: TObject);
begin
   AlphaSort:= false;
   ListeNeuLaden:= true;
   DatenZeigen;
end;

procedure TForm1.ButtonAZClick(Sender: TObject);
begin
   AlphaSort:= true;
   ListeNeuLaden:= true;
   DatenZeigen;
end;

procedure TForm1.ButtonNummerClick(Sender: TObject);
begin
   IDSort:= true;
   ListeNeuLaden:= true;
   DatenZeigen;
end;


procedure TForm1.EditSuchfeldKeyPress(Sender: TObject; var Key: char);
begin
   if Key = #13 then
   ButtonSuchenAlle.Click;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  DatumAnzeigen : TDateTime;
begin
   SetDefaultLang('de');
   try
      SQLite3Connection1.DatabaseName:='Adressen.db';
      SQLTransaction1.Database:= SQLite3Connection1;
      SQLQuery1.Transaction:= SQLTransaction1;
      // Verbindung testen -> keine Verbindung -> weiter mit Except
      SQLQuery1.Open;
      SQLQuery1.Close;
   except
      begin
         ShowMessage('Die Datenbank wurde nicht gefunden' + sLineBreak + 'Das Programm wird beendet!');
         Application.Terminate;
      end;
   end;

   AlphaSort:= false;
   IDSort:= true;
   // beim Start/Ändern der Liste wird der erste Eintrag der Liste markiert
   ListeNeuLaden:= true;
   // Hinweise beim Überfahren der Buttons
   ButtonZA.Hint:= 'Aufwärts sortieren';
   ButtonZA.ShowHint:= true;
   ButtonAZ.Hint:= 'Abwärts sortieren';
   ButtonAZ.ShowHint:= true;
   ButtonNummer.Hint:= 'Nach Nummern sortieren';
   ButtonNummer.ShowHint:= true;
   ButtonVor.Hint:= 'nächster Datensatz';
   ButtonVor.ShowHint:= true;
   ButtonZurueck.Hint:= 'vorheriger Datensatz';
   ButtonZurueck.ShowHint:= true;
   ImageHilfe.Hint:= 'Hilfe zur Suchfunktion';
   ImageHilfe.ShowHint:= true;
   ButtonSuchenAlle.Hint:= 'Alle Einträge durchsuchen';
   ButtonSuchenAlle.ShowHint:= true;
   ButtonSucheName.Hint:= 'Nachnamen durchsuchen';
   ButtonSucheName.ShowHint:= true;
   ButtonSucheOrt.Hint:= 'Wohnorte durchsuchen';
   ButtonSucheOrt.ShowHint:= true;
   DatumAnzeigen:= Now;
   LabelDatum.Caption:=FormatDateTime('DD.MM.YYYY',DatumAnzeigen);
   LabelZeit.Caption:=FormatDateTime('hh:nn',Time);
   DatenZeigen;
end;

procedure TForm1.ImageHilfeClick(Sender: TObject);
var
  Antwort:Integer;
begin
     Antwort := MessageDlg('Info','Beispiele für Suchanfragen:' + sLineBreak + sLineBreak + 'Ber* -> Wohnort -> Alle Orte, die mit Ber anfangen' + sLineBreak + sLineBreak +
  'Sch* -> Namen -> alle Namen, die mit Sch anfangen' + sLineBreak + sLineBreak  + '*.02.* -> Datum -> Monat Februar suchen' + sLineBreak + sLineBreak +
  '51* -> PLZ -> alle PLZ, die mit 51 beginnen', mtConfirmation, [mbOK], 0,mbOK);
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
   ButtonHinzu.Visible:= false;
   EditNummer.Text:= AnzeigeNummer[ListBox1.ItemIndex];
   EditVorname.Text:= AnzeigeVorname[ListBox1.ItemIndex];
   EditNachname.Text:= AnzeigeNachname[ListBox1.ItemIndex];
   EditOrt.Text:= AnzeigeWohnort[ListBox1.ItemIndex];
   EditStrasse.Text:= AnzeigeStrasse[ListBox1.ItemIndex];
   EditMail.Text:= AnzeigeEMail[ListBox1.ItemIndex];
   EditDatumEintrag.Text:= AnzeigeDatumEintrag[ListBox1.ItemIndex];
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  LabelZeit.Caption:=FormatDateTime('hh:nn',Time);
end;

procedure TForm1.DatenLaden;
begin
   while not SQLQuery1.Eof do
   begin
      // Arrays vergrößern
      SetLength(AnzeigeNummer, Zaehler + 1);
      SetLength(AnzeigeVorname, Zaehler + 1);
      SetLength(AnzeigeNachname, Zaehler + 1);
      SetLength(AnzeigeWohnort, Zaehler + 1);
      SetLength(AnzeigeStrasse, Zaehler + 1);
      SetLength(AnzeigeEMail, Zaehler + 1);
      AnzeigeNummer[Zaehler]:= SQLQuery1.Fields[0].AsString;
      AnzeigeVorname[Zaehler]:= SQLQuery1.Fields[1].AsString;
      AnzeigeNachname[Zaehler]:= SQLQuery1.Fields[2].AsString;
      AnzeigeWohnort[Zaehler]:= SQLQuery1.Fields[3].AsString;
      AnzeigeStrasse[Zaehler]:= SQLQuery1.Fields[4].AsString;
      AnzeigeEMail[Zaehler]:= SQLQuery1.Fields[5].AsString;
      AnzeigeDatumEintrag[Zaehler]:= SQLQuery1.Fields[6].AsString;
      // Anzeige Nachname, Vorname
      ListBox1.Items.add(SQLQuery1.Fields[0].AsString +' ' + SQLQuery1.Fields[2].AsString + ', ' + SQLQuery1.Fields[1].AsString);
      SQLQuery1.Next;
      inc(Zaehler);
   end;
   // Daten gefunden
   if Zaehler > 0 then
   begin
      ListBox1.Selected[0]:= true;
      EditNummer.Text:= AnzeigeNummer[ListBox1.ItemIndex];
      EditVorname.Text:= AnzeigeVorname[ListBox1.ItemIndex];
      EditNachname.Text:= AnzeigeNachname[ListBox1.ItemIndex];
      EditOrt.Text:= AnzeigeWohnort[ListBox1.ItemIndex];
      EditStrasse.Text:= AnzeigeStrasse[ListBox1.ItemIndex];
      EditMail.Text:= AnzeigeEMail[ListBox1.ItemIndex];
      EditDatumEintrag.Text:= AnzeigeDatumEintrag[ListBox1.ItemIndex];
   end;
end;

end.

