Delphi-PRAXiS
Seite 1 von 7  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   In Datenbank(Edit1.Txt) suchen (https://www.delphipraxis.net/135577-datenbank-edit1-txt-suchen.html)

xv300 13. Jun 2009 15:16

Datenbank: Selbsterstelle? • Version: WIN32 • Zugriff über: Per Befehl

In Datenbank(Edit1.Txt) suchen
 
Hallo Ihr!

Ich stehe vor einem PRoblem:

Wir habe ein Datenverwaltunsprogramm gebastelt, bei dem man Namen, strasse etc. eingeben kann, was dann in einer Datei.txt gespeichert wird. Dies kann man wieder aufrufen und bearbeiten. Zusätzlich wird das ganze noch als StringGrid auf einer Form2 ausgegeben. Ich soll mich nun darum kümmern, wie ich SUCHE.

Das heißt, wenn ich einen Namen in eins dieser Edit Felder eingebe, dann soll mir alles von dieser Person angezeigt werden:

Bsp:

Mustermann
Max
Strasse 1
12345
Musterhausen
98760/5432

Das ist ein Datensatz!!!

Und dieser wird in Editfeldern erstellt und auch ausgegeben!
Wenn ich nun einen Teil davon eingebe in ein leeres Feld und auf den Button'Suche' klicke, soll mir alles von ihm angezeigt werden. Das heißt, ich gebe Max ein und bekomme (egal wie, egal ob als Tabelle oder direkt im Edit, hauptsache irgendwie) den Rest angezeigt. Wenn es meherere Möglichkeiten gibt, dann muss auch eine Lösung her.

Wisst ihr zufällig wie sowas funktioniert?


Liebe Grüße

xv300

Die Muhkuh 13. Jun 2009 15:18

Re: In Datenbank(Edit1.Txt) suchen
 
Hi,

wie speicherst Du die Daten in der Datei ab?

Rein als Text, typisierte Datei, ...?

xv300 13. Jun 2009 15:32

Re: In Datenbank(Edit1.Txt) suchen
 
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, ExtCtrls;

type
  TForm1 = class(TForm)
    LaDateisatz: TLabel;
    EdName: TEdit;
    EdVorname: TEdit;
    EdStrasse: TEdit;
    EdPLZ: TEdit;
    EdTelefon: TEdit;
    EdOrt: TEdit;
    LaName: TLabel;
    LaVorname: TLabel;
    LaStrasse: TLabel;
    LaPLZORT: TLabel;
    Telefon: TLabel;
    Budateineu: TButton;
    Budateioeffnen: TButton;
    BuDatensatzhinzu: TButton;
    Buzurueck: TButton;
    Buvorwaerts: TButton;
    Ladatei: TLabel;
    BuBeenden: TButton;
    Label3: TLabel;
    BuTabelle: TButton;
    Button1: TButton;
    RGsuchen: TRadioGroup;
    procedure BuBeendenClick(Sender: TObject);
    procedure BudateineuClick(Sender: TObject);
    procedure BudateioeffnenClick(Sender: TObject);
    procedure BuzurueckClick(Sender: TObject);
    procedure BuvorwaertsClick(Sender: TObject);
    procedure BuDatensatzhinzuClick(Sender: TObject);
    procedure BuTabelleClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

    T_Adresse=Record
    Name: String[20];
    Vorname: String[20];
    Strasse: String[30];
    PLZ: String[7];
    Ort: String[15];
    Telefon : String[20];
    end;
        T_Datei = file of T_Adresse;
var
  Form1 : TForm1;
  Adresse : T_Adresse;
  f : T_Datei;
  Dateiname : String;
  ClickedOK : Boolean;
  Satznummer : Integer;


implementation

uses Unit2;

procedure liesadresse(Var Adresse:T_Adresse);
begin
  with Adresse do
    begin
      Name := Form1.EdName.Text;
      Vorname := Form1.EdVorname.Text;
      Strasse := Form1.EdStrasse.Text;
      PLZ := Form1.EDPLZ.Text;
      Ort := Form1.EdOrt.Text;
      Telefon := Form1.EdTelefon.Text;

    end;
end;  
{$R *.dfm}

procedure TForm1.BuBeendenClick(Sender: TObject);
begin
 Form1.Close;
end;

procedure TForm1.BudateineuClick(Sender: TObject);
begin
  Dateiname := '';
  ClickedOK:=InputQuery('Neue Datei anlegen','Name der neuen Datei(Vollständiger Pfad)',Dateiname);
  if clickedOk then
    begin
      Assignfile(f,Dateiname);
      rewrite(f);
      LaDatei.Caption := 'Datei ' + Dateiname + 'wurde angelegt';
    end;
end;

procedure TForm1.BudateioeffnenClick(Sender: TObject);
begin
    Dateiname := '';
    ClickedOK := InputQuery('Vorhandene Datei öffnen','Name der zu öffnenden Datei(Vollständiger Pfad)', Dateiname);
    if ClickedOK then
      begin
        AssignFile(f,Dateiname);
        Reset(f);
        LaDatei.Caption := 'Datei '+ Dateiname + ' wurde geöffnet !';
      end;



end;
procedure TForm1.BuzurueckClick(Sender: TObject);
begin
 if Satznummer > 0 then
     begin
  Satznummer:= Satznummer - 1;
  LaDateisatz.Caption := 'Datensatz-Nr.: ' + IntToStr(Satznummer);
  Application.ProcessMessages;
  seek(f,Satznummer);
  read(f,Adresse);
      with Adresse do
        begin
          EdName.Text := Name;
          EdVorName.Text := Vorname;
          EdStrasse.Text := Strasse;
          EdPLZ.Text := PLZ;
          EdOrt.Text := Ort;
          EdTelefon.Text := Telefon;

        end

     end
   else Label3.Caption := 'Sie sind wieder am Anfang!';
    Application.ProcessMessages;
end;

procedure TForm1.BuvorwaertsClick(Sender: TObject);
begin
  if not eof(f) then
    begin
      read(f,Adresse);
      inc(Satznummer);
      LaDateisatz.Caption := 'Datensatz-Nr.: ' + IntToStr(Satznummer);
      Application.ProcessMessages;
      with Adresse do
        begin
          EdName.Text := Name;
          EdVorname.Text := Vorname;
          EdStrasse.Text := Strasse;
          EdPLZ.Text := PLZ;
          EdOrt.Text := Ort;
          EdTelefon.Text := Telefon;
         end
      end
  else
    Label3.Caption := 'Sie sind am Dateiende angekommen!!!';
end;

procedure TForm1.BuDatensatzhinzuClick(Sender: TObject);
begin
  liesadresse(Adresse);
  write(f,Adresse);
end;

procedure TForm1.BuTabelleClick(Sender: TObject);
begin
  Form2 := TForm2.Create(Form1);
  Form2.Show;
  Form2.Tabelle.Cells[0,0] := ' ';
  Form2.Tabelle.Cells[1,0] := 'Name';
  Form2.Tabelle.Cells[2,0] := 'Vorname';
  Form2.Tabelle.Cells[3,0] := 'Strasse';
  Form2.Tabelle.Cells[4,0] := 'PLZ';
  Form2.Tabelle.Cells[5,0] := 'Ort';
  Form2.Tabelle.Cells[6,0] := 'Telefon';


  while not eof(f) do
    begin
      read(f,Adresse);
      Satznummer := Satznummer + 1;

      with Adresse do
        begin
          Form2.Tabelle.Cells[0,Satznummer] := IntToStr(Satznummer);
          Form2.Tabelle.Cells[1,Satznummer] := Name;
          Form2.Tabelle.Cells[2,Satznummer] := Vorname;
          Form2.Tabelle.Cells[3,Satznummer] := Strasse;
          Form2.Tabelle.Cells[4,Satznummer] := PLZ;
          Form2.Tabelle.Cells[5,Satznummer] := Ort;
          Form2.Tabelle.Cells[6,Satznummer] := Telefon;
        end
      end
end;
end.

jfheins 13. Jun 2009 15:36

Re: In Datenbank(Edit1.Txt) suchen
 
Zuallererst: In einer Textdatei Daten zu speichern ist noch keine Datenbank ;)

Zum Problem: Du hast die Daten ja sicher an 3 Stellen: 1. In der Textdatei auf der Festplatte, 2. In der GUI im Stringgrid (hier würde sich evtl. eine Listview im Report-Style anbieten) und als 3. Im Hintergrund z.B. als Array of record oder so.

(Für den Fall dass du letzteres nicht hast: Mach' es das erspart eine Menge Arbeit und Nerven)

Dann gehst du folgendermaßen vor:
Delphi-Quellcode:
Suchfeld_OnChange()
begin
Stringgrid.beginupdate;
stringgrid.clear;
for i := 0 to itemcount do
begin
  if (pos(suchfeld.text, items[i].name) > 0) then
    stringgrid.additem(items[i])
end;
stringgrid.endupdate;
end;
Läuft bestimmt nicht, aber zeigt, worauf ich hinauswill :stupid:

Oh, ich seh gerade: Code ... und zwar nicht so tollen Code ... also ich würde erstmal die ganze Datei einlesen und nur im Speicher rumwurschteln. Es sei denn, die Datenmengen werden sehr groß, dann würde ich eine (richtige) Datenbank nehmen ;)

xv300 13. Jun 2009 15:39

Re: In Datenbank(Edit1.Txt) suchen
 
MMh, das verstehe ich jetzt leider überhaupt nicht :D

Gehts vielleicht einfacher und "erklärt"?


LG

jfheins 13. Jun 2009 15:45

Re: In Datenbank(Edit1.Txt) suchen
 
Ok, ich probiers mal:

Anstatt immer auf die Datei zuzugreifen (was übrigens auch langsam ist) machst du folgendes: Du legst dir ein Array of T_Adresse an. Wenn du eine Datei öffnest, liest du die ganze Datei in das Array.
Dann liest du die Elemente aus dem Array und schreibst sie in das Stringgrid.
Falls im Stringgrid was verändert wird, musst du die Änderung in das Array übertragen.
Beim Speichern entsprechend umgekehrt: Das Array in die Datei speichern.

Das nennt sich dann "Trennen der Daten vom Interface" ;)

Der Vorteil von dem Gedöns: Du kannst im Stringgrid eine Teilmenge der Daten anzeigen. (Also z.B. nur die Einträge, deren Namen mit Max beginnen)
Und du malträtierst die Festplatte nicht so sehr ...

mkinzler 13. Jun 2009 16:06

Re: In Datenbank(Edit1.Txt) suchen
 
Oder ein "richtiges" Datenbanksystem einsetzen

Real-TTX 13. Jun 2009 16:26

Re: In Datenbank(Edit1.Txt) suchen
 
Zitat:

Zitat von mkinzler
Oder ein "richtiges" Datenbanksystem einsetzen

Ich finde zum Bleistift ADO mit Access Datenbanken ziehmlich einfach zu bedienen. Und sollte eigentlich für jedermann schnell einsetzbar sein. Das einzige, vielleicht nicht ganz so einfache sind die SQL Statements. Aber dafür findet man schnell Beispiele. Und wenn man schonmal mit Access gearbeitet hat. Sind dei SQL Befehle schnell zu verstehen.

Leider weiß ich nicht ob ADO noch lange im support ist? Es ist ja ein MS Produkt und ADO.NET ist ja der Nachfolger, so viel ich weiß.....

Sollte nicht OT werden...

Gruß,Real-TTX

jfheins 13. Jun 2009 16:33

Re: In Datenbank(Edit1.Txt) suchen
 
Insbesondere für größere Datenmengen wäre ein richtiges DBMS natürlich besser. Aber ich vermute mal ganz stark, dass das für den Threadersteller dann doch etwas zu schwierig werden könnte ;)

mkinzler 13. Jun 2009 16:34

Re: In Datenbank(Edit1.Txt) suchen
 
Zitat:

Ich finde zum Bleistift ADO mit Access Datenbanken ziehmlich einfach zu bedienen.
An Access hatte ich dabei eigentlich nicht gedacht. Eher SqLite oder ne andere embedded DB ( z.B. FireBird embedded)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:08 Uhr.
Seite 1 von 7  1 23     Letzte »    

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