![]() |
Re: In Datenbank(Edit1.Txt) suchen
Zitat:
Was genau soll ich ändern, aber eigentlich hilft mir das ja auch (noch) nicht bei meinem jetzigen Problem[/quote] Doch (auch in Verbindung mit Franks Antwort). |
Re: In Datenbank(Edit1.Txt) suchen
Möchtet ihr einem auf dem Schlauch stehenden vöölig überforderten Newbie mal kurz in gaaaaaaanz langsamen Schritten erklären, wo der Fehler liegt und am besten auch noch wie er zu beheben ist?
LiEbE GrÜßE |
Re: In Datenbank(Edit1.Txt) suchen
Versuchs mal so:
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(Form1.SUCHFELD.Text, Name) > 0) or (pos(SUCHFELD.Text, Vorname) > 0) then begin // Suchtext im Feld suchen, nicht umgekehrt 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
Ist f eigentlich eine globale Variable? Da das so aussieht, wo wird denn sichergestellt, dass immer vom Dateianfang aus gelesen wird?
|
Re: In Datenbank(Edit1.Txt) suchen
Geht leider auch ned!
|
Re: In Datenbank(Edit1.Txt) suchen
Ignoriert mich ruhig :?
|
Re: In Datenbank(Edit1.Txt) suchen
Zitat:
|
Re: In Datenbank(Edit1.Txt) suchen
AnsiLowerCase+Pos ginge ja och noch :angel2:
|
Re: In Datenbank(Edit1.Txt) suchen
Hallo,
ich hoffe du hast den Quellcode aus #43 nich nur kopiert. Weil dann kann es eventuell nicht gehen. (doppeltes begin, eventuell fehlendes end;)
Delphi-Quellcode:
Außerdem, solltest du wie DeddyH schon geschrieben hat mal nach der Var. f schauen. Wenn es eine glo. Var. ist, wo wird sie denn mit Daten geladen?
procedure TForm1.Button1Click(Sender: TObject);
begin begin Form2 := TForm2.Create(Form1); Form2.Show; ... .... Gruß Jens |
Re: In Datenbank(Edit1.Txt) suchen
Ausserdem auch die andere Hinweise beachten
|
Re: In Datenbank(Edit1.Txt) suchen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Ich hab eine Funktion ausgebuddelt die man eventuell für eine csv-artige Datenbank benutzen könnte. Ich hab die Funktion nicht direkt dafür geschrieben, aber bei einer Handvoll Daten wird es schon gehen. csv bedeutet, daß du die Daten in einer Textdatei getrennt mit Komma, bzw. Semikolon speicherst. Ich hab soweit auch deine Beispieldatei geändert, d.h Daten im Sem. getrennt. Das Beispiel ist kurz, erfüllt aber alle Forderungen, d.h. sucht in der DB und liest den Datensatz ein. Den Rest mußt du selbst machen.
Delphi-Quellcode:
uses
StrUtils; var DBTextPath: String; procedure TForm1.FormCreate(Sender: TObject); begin DBTextPath := ExtractFilePath(ParamStr(0)) + 'Datensatz1.csv'; Memo1.Lines.LoadFromFile(DBTextPath); end; //Gibt den n'ten Text aus einem mit Trennzeichen getrennten String, zB. A|B|C //N = 0 für ersten Text function GetTextN(Text: String; N: Word; Delimiter: Char): String; var sl: TStringList; begin sl := TStringList.Create; try while Trim(Text) <> '' do begin if Pos(Delimiter, Text) = 0 then Text := Text + Delimiter; sl.Add(Trim(Copy(Text, 1, Pos(Delimiter, Text) - 1))); Delete(Text, 1, Pos(Delimiter, Text) + Length(Delimiter) - 1); end; if sl.Count >= (N + 1) then Result := sl[N] else Result := ''; finally sl.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); const D = ';'; var i: Integer; sl: TStringList; begin sl := TStringList.Create; try sl.LoadFromFile(DBTextPath); for i := 0 to sl.Count - 1 do begin if AnsiContainsText(sl[i], Edit1.Text) then begin Edit2.Text := GetTextN(sl[i], 0, D); Edit3.Text := GetTextN(sl[i], 1, D); Edit4.Text := GetTextN(sl[i], 2, D); Edit5.Text := GetTextN(sl[i], 3, D); Edit6.Text := GetTextN(sl[i], 4, D); Edit7.Text := GetTextN(sl[i], 5, D); Break; end; end; finally sl.Free; end; end; |
Re: In Datenbank(Edit1.Txt) suchen
Liste der Anhänge anzeigen (Anzahl: 1)
Leute Leute^^
Ich habe jetzt mal meinen Lehrer gefragt und er hat mir gesagt, dass er das ganze mit POS machen möchte, bzw. dass ich darüber ein Referat halten soll in Verbindung mit diesem Programm. --> Ich beschäftige mich im MOment sicherlich nicht mit anderem, für EUCH einfacherm Zeug! Natürlich bin ich für jede Hilfe sehr sehr dankbar, doch bitte versteht mich auch. Ich lade euch mal das Programm hoch, damit ihr seht, wie das funktioniert... |
Re: In Datenbank(Edit1.Txt) suchen
Es ist nicht nur "einfach für uns", sondern insgesamt einfacher, optimaler und vorallem übersichtlicher ...
Wenn es sein muß, können wir auch anders. z.B.:
Delphi-Quellcode:
Diese Codes machen im Prinzip alle das Gleiche und es gibt noch tausende andere und noch viel schlimmere Möglichkeiten.
B := False;
For i := 1 to Length(S) - Length(C) + 1 do If Copy(AnsiLowerCase(S), i, Length(C)) = AnsiLowerCase(C) Then B := True; If B Then ... // oder If Pos(AnsiLowerCase(C), AnsiLowerCase(S)) > 0 Then ... // statt einfach nur If AnsiContainsText(S, C) Then ... |
Re: In Datenbank(Edit1.Txt) suchen
AnsiContainsText ist einfacher als Pos. Vielleicht erkennt dein Lehrer das Problem nicht, aber es ist ein Problem.
Die Funktion Pos ist einfach, effektiv, aber man muß auch sehr aufpassen, denn es kann dir andere Ergebnisse liefern als du möchtest. Pos verzeiht keine Fehler. Hier paar Beispiele: Die Abfrage if Pos('maier', 'Hans Maier') > 0 then ... oder if Pos('Maier', 'Hans MAIER') > 0 then ... wird nichts finden, denn für Pos ist "maier" und "Maier" nicht gleich. Der Nutzer des Programms muß den Suchtext also genau eingeben. Der Nutzer weiß aber nicht wie der Name in der Datenbank gespeichert ist. Hier gibt es also eine mögliche Fehlerquelle. Es ist deshalb in solchen Fällen üblich solche Fehlerquellen bei der Überprüfung abzufangen. Man erreicht es in dem man beide Texte upper oder lower case überprüft, d.h. man überprüft beide Texte eintweder in Groß- oder Kleinbuchstaben, z.B., if Pos('MAIER', 'HANS MAIER') > 0 then ... oder if Pos('maier', 'hans maier') > 0 then ... Und wie erreicht man das? Man packt beide Texte in eine Funktion, z.B. UpperCase(). if Pos(UpperCase('maier'), UpperCase('Hans Maier')) > 0 then ... Jetzt ist es egal wie die Texte geschrieben sind, denn UpperCase macht sie gleich. Allerdings macht UpperCase nur die Ascii-Zeichen groß. Damit die deutschen Umlautzeichen, also ä, ö, Ü usw. berücksichtigt werden, macht man das mit der neueren Funktion AnsiUpperCase. Hier werden auch ä, ö und Ü berücksichtigt. Die Abfrage sieht dann so aus: if Pos(AnsiUpperCase('müller'), AnsiUpperCase('Hans Müller')) > 0 then ... Da ist also nichts kompliziertes dabei, sondern man denkt bei der Programmierung mit und hat nicht die Einstellung von wegen: was interessiert mich wenn der Nutzer den Namen falsch eingibt. Es ist dann sein Problem. Wenn du das nicht machen wirst weil es dir zu kompliziert ist, dann geh zu deinem Lehrer und sag, daß du nicht den Draht zu Programmierung hast und möchtest lieber in den Kochkurs gehen. Denn wenn du nicht bereit bist es besser als ausreichen zu machen, dann solltest du es lassen. Ausreichend, das ist die 4 als Note. Ok, und was hat es dann mit AnsiContainsText auf sich? AnsiContainsText ist nicht besser als Pos mit AnsiUpperCase, aber etwas kürzer. if AnsiContainsText ('Hans Müller', 'müller') then ... Diese Abfage bedeutet: prüfe ob sich 'müller' in dem Text 'Hans Müller' befindet. Ignoriere dabei die Groß- und Kleinschreibung und beachte dabei alle Zeichen, also auch Umlautzeichen. Übrigens, das Beispiel was ich oben gepostet habe, also noch einfacher geht es nicht. Erstens ist csv Standard, d.h. diese csv Datenbank kannst du mit jedem anderen Datenbankprogramm auch öffnen, also auch mit Access oder Excel. Und es sucht im ganzen Datensatz. Und es ist kurz. Ein Tipp: werde offener, denn du verbringst lieber das ganze Wochenende damit anderen zu sagen was du nicht verstehst, also dir fünf Minuten lang eine Funktion in der Delphi-Hilfe anzusehen. Sehr effizient. |
Re: In Datenbank(Edit1.Txt) suchen
Hallo,
nochmal gefragt!! Wie schon mehrmals erwähnt. Wo wird den, und wie die Var. f geladen. Ob du das Problem mit POS oder anders lösen willst, ist erstmal egal. Die anderen Varianten wären zwar besser, aber wenn mit POS, dann mach das. Aber wichtig zu wissen wäre doch erstmal, wie und womit die Var. f geladen wird. Hast du dein Programm mal im Debugmodus laufen lassen, und nach gesehen, welchen Wert f bei der Abfrage hat? Gruß Jens |
Re: In Datenbank(Edit1.Txt) suchen
Da gibt es den Button "Vorhandene Datei öffnen". Nur aufpassen, du mußt den ganzen Pfad bis Datei angeben. Also speichere den Ordner am besten direkt unter C, sonst hast du viel zu tippen.
|
Re: In Datenbank(Edit1.Txt) suchen
Also ich hab mir den Quelltext noch mal angesehen und ... ok, der Lehrer scheint hier eher Pascal zu lehren. Eigentlich spricht auch nichts gehen AssignFile & Co, denn bevor mal laufen will sollte man erst vernünftig gehen können, aber ich hab das Gefühl der Lehrer hat noch die Unterlagen von 1980. Das erinnerte mich gleich an diese South Park Episode:
![]() Die ersten 60 Sekunden ist das was ich meine. |
Re: In Datenbank(Edit1.Txt) suchen
Nun hab ich auch mal in die Unit1 geschaut. Die Datei ist die ganze Zeit geöffnet und es wird darin herumnavigiert. Wenn Du darin suchen willst, musst Du zuerst an den Dateianfang springen, da sonst nicht sichergestellt ist, dass Du auch wirklich alle Datensätze zwecks Vergleich durchläufst. Zu den globalen Variablen und dem o.a. Umstand, dass die Datei immer offen ist sage ich jetzt mal nichts.
|
Re: In Datenbank(Edit1.Txt) suchen
Popov, das ist einfach große Klasse. Ich danke dir VIELE MALE! :firejump:
Jetzt hab ich auch das ganze verstanden und wenn ich das so meinem Lehrer "beibringe" dann versteht der das hoffentlich auch :P Nur ich habe noch eine Frage dann versteh ich auch alle 100% Zitat:
Ich verstehe das fast so, nur wie stelle ich denn jetzt den Bezug zu mir her. Hier ist es ja: Wenn MÜLLER in dem Text "Hans MÜller" ist, dann mache irgendwas... MÜLLER ist hier der Inhalt des SUCHedits Hans Müller ist irgendein Inhalt, odeR? Wie krieg ich es nun hin, dass er dieses MÜLLER in dem kompletten Datensatz sucht? Sehe ich das Richtig, dass dann (bei mir!!!) in dem Record NAme z.B. gesucht würde? Liebe Grüße |
Re: In Datenbank(Edit1.Txt) suchen
Im Record wind nichts automatisch gesucht. Wenn du den ganzen Datensatz durchsuchen willst, dann mußt du jeden einzelnen String durchsuchen. Ich hab dir oben das Beispiel mit csv gemacht. Da wird komplett der ganze Datensatz durchsucht, weil da der ganze Datensatz komplett geladen wird. Du dagegen lädst jedes Feld einzeln, also mußt du auch einzeln prüfen. Allerdings sind es nur sechs Felder, also auch keine Katastrophe. Dennoch, einzeln.
|
Re: In Datenbank(Edit1.Txt) suchen
MMh. Das Problem ist, nachdem ich meinen Lehrer gefragt habe, meint der, dass ich das anders lösen MUSS. Das heißt, auch wenn die Lösung oben einfach und besser ist, ich "aufgrund des Lehrplans" es jetzt so "einfach"(schuleinfach) wie möglich machen muss, damits der ganze Kurs versteht...
Ist es nicht möglich, dass ich das einfach umgehe indem ich die Editfelder doppelt benutze? Also Datensatz eingeben, als auch als Suchfelder? LG |
Re: In Datenbank(Edit1.Txt) suchen
Was haben denn jetzt die Edits mit Deinem Record zu tun?
|
Re: In Datenbank(Edit1.Txt) suchen
Naja, ich hab z.B.:
Das Edit1 für den Namen Das Edit2 für den Vorname Nun gebe ich im Edit1 was ein und schon wirds angezeigt. Dafür muss ich ja das was ich eingegeben hab auch in diesem Record suchen! Lg |
Re: In Datenbank(Edit1.Txt) suchen
Aus Anwendersicht würde ich doch annehmen, dass, wenn ich im Edit für den Nachnamen "Meier" eingebe, auch nur nach dem Nachnamen "Meier" gesucht wird und nicht z.B. in der Telefonnummer.
|
Re: In Datenbank(Edit1.Txt) suchen
Wäre also das hier theoretisch möglich?
Delphi-Quellcode:
if Pos(AnsiUpperCase(Name), AnsiUpperCase(EdName.Text)) > 0 then
begin ShowMessage('asd'); end; |
Re: In Datenbank(Edit1.Txt) suchen
Wenn die Parameter andersherum wären, sähe das schon ganz brauchbar aus ;)
|
Re: In Datenbank(Edit1.Txt) suchen
@xv300
Wieso mußt du in Edits suchen? Was in Edits ist das sieht der Nutzer. Du mußt in deiner Datenbank suchen, bzw. die komplett Datensatz für Datensatz laden und jedes Feld prüfen. Aber, hast du schon was von Funktionen gehört? Du schreibst eine Funktion und benutzt sie bei jedem Feld. |
Re: In Datenbank(Edit1.Txt) suchen
Kenn ich, führen wir aber erst später im Unterricht ein ;)
Nur wie such ich denn jetzt speziell in dieser Datenbank? Den Fehler hab ich verstanden! LG |
Re: In Datenbank(Edit1.Txt) suchen
Hallo nochmal,
so ich habe mir jetzt mal die Funktion von Popov aus #51 angesehen. In dieser Funktion, ist alles enthalten, was Du benötigen tust.
Delphi-Quellcode:
Beim Form.Create, wird die Datenbank geladen und in einem Memo zur anzeige gebracht.
procedure TForm1.FormCreate(Sender: TObject);
begin DBTextPath := ExtractFilePath(ParamStr(0)) + 'Datensatz1.csv'; //Datenbank in Var. laden Memo1.Lines.LoadFromFile(DBTextPath); //Datenbank in Memo anzeigen end;
Delphi-Quellcode:
Probier diese Funktion doch mal aus, und du wirst sehen, das es eigendlich ganz einfach ist.
procedure TForm1.Button1Click(Sender: TObject);
const D = ';'; var i: Integer; sl: TStringList; begin sl := TStringList.Create; try sl.LoadFromFile(DBTextPath); //Der Inhalt der Datenbank, wird in eine Stringliste geladen for i := 0 to sl.Count - 1 do begin if AnsiContainsText(sl[i], Edit1.Text) then //Vergleich der Stringliste mit deiner Suchanfrage im Edit1 begin Edit2.Text := GetTextN(sl[i], 0, D); //Wenn suche Erfolgreich, dann wird der Datensatz über die Funktion Edit3.Text := GetTextN(sl[i], 1, D); //GetTextN geladen Edit4.Text := GetTextN(sl[i], 2, D); Edit5.Text := GetTextN(sl[i], 3, D); Edit6.Text := GetTextN(sl[i], 4, D); //Hier zum Beispiel, Teil 5 des Strings, bis zum nächsten ';' Edit7.Text := GetTextN(sl[i], 5, D); //Hier String 6, da D=';' Break; end; end; finally sl.Free; end; end; Gruß Jens |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:43 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-2025 by Thomas Breitkreuz