![]() |
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 |
Re: In Datenbank(Edit1.Txt) suchen
Hi,
wie speicherst Du die Daten in der Datei ab? Rein als Text, typisierte Datei, ...? |
Re: In Datenbank(Edit1.Txt) suchen
Delphi-Quellcode:
end.
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; |
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:
Läuft bestimmt nicht, aber zeigt, worauf ich hinauswill :stupid:
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; 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 ;) |
Re: In Datenbank(Edit1.Txt) suchen
MMh, das verstehe ich jetzt leider überhaupt nicht :D
Gehts vielleicht einfacher und "erklärt"? LG |
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 ... |
Re: In Datenbank(Edit1.Txt) suchen
Oder ein "richtiges" Datenbanksystem einsetzen
|
Re: In Datenbank(Edit1.Txt) suchen
Zitat:
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 |
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 ;)
|
Re: In Datenbank(Edit1.Txt) suchen
Zitat:
|
Re: In Datenbank(Edit1.Txt) suchen
Zitat:
|
Re: In Datenbank(Edit1.Txt) suchen
Zitat:
EDIT : SQLite nicht SQLLite (peinlich :wall: ) |
Re: In Datenbank(Edit1.Txt) suchen
-Access muss installiert sein; Runtime darf nicht so ohne weitergegeben werden.
-Access fehlen gewisse Features. |
Re: In Datenbank(Edit1.Txt) suchen
Access muss installiert sein? Runtime muss weitergegeben werden ? Ich dachte die ist bei MDAC dabei? Und MDAC ist ein bestandteil von Windows?
Das mit den Features weiß ich leider nicht :( Ich hoffe ich laber hier nicht ganz so viel misst :P Wenn doch tuts mir leid ;) Gruß, Real-TTX |
Re: In Datenbank(Edit1.Txt) suchen
LEUTE, bitte back to topic.
DAs Problem ist nicht das mit der Textdatei, das ist leider vorgegeben durch den Lehrer -.- Das Problem ist wie ich in dem jetzigen Programm eine Suchfunktion einbaue ^^ Also darum gehts mir hauptsächlich... Und es muss wirklich so bleiben wies im Moment ist, und es sollt nur was hinzugefügt werden und nicht verändert/neu gemacht werden.... Danke!!! Lg |
Re: In Datenbank(Edit1.Txt) suchen
Okay ... Quick&Dirty ginge es wohl so:
Delphi-Quellcode:
Dann solltest du in die Datensätze angezeigt bekommen, in deren Name der Suchterm vorkommt ...
// In das OnClick-Event von einem Such-Button
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 if (pos(Name, SUCHFELD.Text) > 0) or (pos(Vorname, SUCHFELD.Text) > 0) then 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 |
Re: In Datenbank(Edit1.Txt) suchen
Danke!
Und wie soll ich am besten das SUCHFELD zuweisen? In nem Array? Lg |
Re: In Datenbank(Edit1.Txt) suchen
Bei Suchfeld hätte ich jetzt an ein Edit gedacht ...
|
Re: In Datenbank(Edit1.Txt) suchen
Das ist ja klar^^
AH!!! Jetzt verstehe ich das erst ;) Danke =) Gibts auch noch ne Möglichkeit dieses Suchfeld in die Maske einzubauen. Also ich hab je ein EDIT für Name, Vorname, Strasse,... . Und wenn ich jetzt bei Vorname z.B.: Max eingebe, dass dort alles angezeigt wird und nicht durch ein Extrasuchfeld! DANKE! |
Re: In Datenbank(Edit1.Txt) suchen
Du kannst statt SUCHFELD auch je das entsprechende Feld/Edit aus deiner Eingabemaske verwenden.
|
Re: In Datenbank(Edit1.Txt) suchen
Ich kriege jetzt garantiert richtig Haue, aber was ist mit Ini? Der will ja nur paar Adressen speichern. Man sollte ja auch nicht übertreiben. So eine Unit die über Ini die Adressen verwaltet ist in paar Minuten programmiert.
|
Re: In Datenbank(Edit1.Txt) suchen
natürlich kann man es per Ini machen, man könnte es auch dynamisch als Ressourcen einbinden usw. Die Frage ist doch nur, ob man einen scheinbar kleineren Aufwand jetzt mit einem höheren Aufwand bei Erweiterung bezahlt.
|
Re: In Datenbank(Edit1.Txt) suchen
Zitat:
Delphi-Quellcode:
if (pos(AnsiUpperCase(Name), AnsiUpperCase(SUCHFELD.Text)) > 0) or ...
|
Re: In Datenbank(Edit1.Txt) suchen
Wieso nicht gleich mit AnsiContainsText, AnsiStartsText und AnsiSameText arbeiten? Dann muss man sich nicht selbst verrenken.
|
Re: In Datenbank(Edit1.Txt) suchen
Du hast Recht und ich hab es auch schon in den Fingern gehabt es zu tippen, aber ältere Delphi-Versionen kennen die Funktionen noch nicht. Wenn er Delphi 3 hat, dann muß er es mit Pos machen, bei neueren ist AnsiContainsText möglich.
|
Re: In Datenbank(Edit1.Txt) suchen
Deshalb ist es immer eine gute Idee, die Delphi-Version im Profil anzugeben ;)
|
Re: In Datenbank(Edit1.Txt) suchen
Was ist denn AnsiContainsText
Ich besitze Delphi 7! |
Re: In Datenbank(Edit1.Txt) suchen
Zitat:
|
Re: In Datenbank(Edit1.Txt) suchen
Zitat:
![]() |
Re: In Datenbank(Edit1.Txt) suchen
Nee, so meint ich das nicht, sondern wie benutze ich das!
Also ich möchte keine sture Hilfstexte, sondern vielleicht eine Newbieorientierte Erklärung... |
Re: In Datenbank(Edit1.Txt) suchen
na genau wie Pos auch
genau das steht auch in der "sturen" OH drin ... also was diese Funktion macht und wie man eine Funktion anwendet sollte man eigentlich auch wissen.
Delphi-Quellcode:
viele Funktionen mit dem Wort Text am Ende arbeiten ignorieren die Groß-/Kleinschreibung.
if AnsiContainsText('dEf', 'abcdef') then ...
dagegen arbeitet AnsiContainsStr CaseSensitive :angel: (früher hätt ich auch noch gesagt, daß ANSI weißt darauf hin, daß es dazu noch die Ansi-Version dieser Funktion ist, aber nun hab ich D2009 kennengelernt) und Contains = "enthält" |
Re: In Datenbank(Edit1.Txt) suchen
Na, das hab ich gebraucht =)
Vielen Dank Euch und ich hoffe mal, dass es so auch geht! Danke LG |
Re: In Datenbank(Edit1.Txt) suchen
ICh habs jetzt mal mit POS probiert, klappt leider NICHT!
Die Tabelle bleibt leer und nichts wird angezeigt! Muss ich das noch irgendwieändern? P.S.: Habe pos genommen, weil ichs besser verstehe, bitte dabei auch bleiben! |
Re: In Datenbank(Edit1.Txt) suchen
Pos() ist aber wie erwähnt casesensitiv.
BTW. würde ich immer die Funktion nehmen, welche besser passt und nicht die, die ich besser kenne! |
Re: In Datenbank(Edit1.Txt) suchen
Trotzdem^^
Auch wenn ich auf die Groß-Schreibung achte, es kommt kein Eintrag! |
Re: In Datenbank(Edit1.Txt) suchen
Zeig mal deinen Code + Testdaten
|
Re: In Datenbank(Edit1.Txt) suchen
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin 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 if (pos(Name, Form1.SUCHFELD.Text) > 0) or (pos(Vorname, SUCHFELD.Text) > 0) then 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; end; |
Re: In Datenbank(Edit1.Txt) suchen
Du darfst Satznummer nur erhöhen, wenn der Eintrag gefunden wird
|
Re: In Datenbank(Edit1.Txt) suchen
Inwiefern meinst du das?
Was genau soll ich ändern, aber eigentlich hilft mir das ja auch (noch) nicht bei meinem jetzigen Problem |
Re: In Datenbank(Edit1.Txt) suchen
Und enthällt die Tabelle auch genügend Zeilen?
Das was man in .Cells eingetragen hat, wird nicht ungedingt angezeigt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:26 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 by Thomas Breitkreuz