Nach Wörtern in einer StringList suchen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Nugi89
Beiträge: 68
Registriert: Do 26. Feb 2015, 13:46

Nach Wörtern in einer StringList suchen

Beitrag von Nugi89 »

Hallo habe folgendes Problem,
ich sitze an einem Projekt wo ich 3 Anwendungen besitze die untereinander kommuniziern.
In der ersten Anwendung gebe ich meine Daten ein und lade sie in eine Textdatei, in der zweiten Anwendung wird mir der Inhalt dieser Datei in einem Memofeld angezeigt. Und die 3 Anwendung gebe ich jetzt bestimmte Wörter ein und es soll überprüft werden ob in der Textdatei das gesuchte Wort enthalten ist.

Soweit funktioniert es ja bis auf die 3te Anwendung. Ich komm da nicht ganz mit der Suche klar.
Hier mal der Quelltext

Code: Alles auswählen

 
procedure  TForm1.Bt_OKClick(Sender: TObject);
var
  Name: string;
  Vorname: string;
  daten: TStringList;
begin
  Name:= Edit_Name.Text;
  Vorname:= Edit_Vorname.Text;
  daten:= TStringList.Create;
  daten.LoadFromFile('Test.txt');
 
  if daten.IndeOf(Name) <> -1 then
  begin
    Edit_Ausgabe.Text:= 'vorhanden';
  end
  else
  begin
    Edit_Ausgabe.Text:= 'nicht vorhanden';
  end;
end;


Hat jemand ne andere Idee wie man dieses Problem lösen kann?
mir wird immer wieder gegeben das der Name nicht gefunden wurde obwohl er in der Textdatei enthalten ist.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Nach Wörtern in einer StringList suchen

Beitrag von Socke »

Code: Alles auswählen

if Pos(Name, daten.Text) > 0 then
  Edit_Ausgabe.Text:= 'vorhanden'
else
  Edit_Ausgabe.Text:= 'nicht vorhanden';

http://www.freepascal.org/docs-html/rtl/system/pos.html

P.S. "Name" ist ein unglücklich gewählter Bezeichner für eine Variable, da das Objekt bereits einen Eigenschaft mit dem Namen "Name" besitzt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Nach Wörtern in einer StringList suchen

Beitrag von Komoluna »

Die Funktion Pos gibt dir die Position eines Strings innerhalb eines anderen Strings aus:

Code: Alles auswählen

i := Pos('678', '1234567890');

Wenn Pos 0 zurückgibt ist der String nicht im anderen enthalten. Müsstest nur abfragen

Code: Alles auswählen

if Pos(Name, daten.Text) > 0 then 
  //Vorhanden
else
  //Nicht Vorhanden


MFG

Komoluna

P.S.: Pos ignoriert Zeilen. Wenn der Name also am Anfang einer Zeile stehen muss, solltest du die Abfrage mit Pos für jede Zeile durchführen und auf Pos = 1 statt Pos > 0 testen.

P.P.S: Mist, Socke war schneller ;-)
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Nugi89
Beiträge: 68
Registriert: Do 26. Feb 2015, 13:46

Re: Nach Wörtern in einer StringList suchen

Beitrag von Nugi89 »

Danke hat mir sehr weiter geholfen :)

Nugi89
Beiträge: 68
Registriert: Do 26. Feb 2015, 13:46

Re: Nach Wörtern in einer StringList suchen

Beitrag von Nugi89 »

Eine Frage hätte ich dazu noch. Kann ich diese Variante auch verwenden wenn ich jetzt in der ersten Anwendung einen neuen Eintrag eingeben will, zur Prüfung ob dieser schon in der Datei vorhanden ist, also das dieser nicht doppelt vor kommt?

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Nach Wörtern in einer StringList suchen

Beitrag von Komoluna »

Natürlich, was sollte dich daran hindern?

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Nugi89
Beiträge: 68
Registriert: Do 26. Feb 2015, 13:46

Re: Nach Wörtern in einer StringList suchen

Beitrag von Nugi89 »

hab gerade mal so eine Abfrage bebastelt. Passiert aber nix beim, letzten Punkt steigt er aus.
Hier mal der Quelltext

Code: Alles auswählen

 
procedure TForm1.Bt_OKClick(Sender: TObject);
var
  kette: TStringList;
  Nachname, Vorname, Alter: string;
begin
  kette:= TStringList.Create;
  Nachname:= Edit_Name.Text;
  Vorname:= Edit_Vorname.Text;
  Alter:= Edit_Alter.Text;
 
    try
      kette.LoadFromFile('Test.txt');
      if pos(Vorname, kette.Text) = 0 then
      begin
        if pos(Nachname, kette.Text) = 0 then
        begin
          if pos(Alter, kette.Text) = 0 then
          begin          //Hier wird direkt zu finally gesprungen! Aber Wieso?
            ShowMessage('nicht vorhanden');
            kette.Add(Nachname + Vorname + ' ist ' + Alter + 'Jahre alt!');
            kette.SaveToFile('Test.txt');
          end;
        end;
      end
      else
      begin
        ShowMessage('vorhanden');
      end;
    finally
      Edit_Alter.Text:= '';
      Edit_Nachname.Text:= '';
      Edit_Vorname.Text:= '';
    end;
  end;
end;             


Das Problem liegt darin das er in Bezug auf das Alter probleme Macht. Wie kann man das umgehen?

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Nach Wörtern in einer StringList suchen

Beitrag von Komoluna »

Du testest ob das Der Vor und Nachname und das Alter schon in der Datein/Sl ist. nur wenn alle 3 nicht vorhanden sind fügst du den eintrag hinzu. Du kannst also nicht 2 Leute mit dem selben Alter in deine "Datenbank" einpflegen.

Dass das Programm direkt zu finally springt, liegt daran, dass die alles dannach nurnoch else code ist, der sowieso übersprungen wurde.

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Nugi89
Beiträge: 68
Registriert: Do 26. Feb 2015, 13:46

Re: Nach Wörtern in einer StringList suchen

Beitrag von Nugi89 »

hab das Problem schon behoben :)

Nugi89
Beiträge: 68
Registriert: Do 26. Feb 2015, 13:46

Re: Nach Wörtern in einer StringList suchen

Beitrag von Nugi89 »

Hallo,
jetzt hab ich ein erneutes Problem. Und zwar wenn ich jetzt zum Beispiel nach Max Mustermann in meiner Datei suche und ich
aber Max Klein und Erika Mustermann drin habe, wird mir angegeben das mein Suchbegriff vorhanden ist.

Wie kann man das Problem am Besten beheben?
Da müsste ich ja jede Zeile überprüfen oder? Wenn ja wie geht das? :oops:

Danke schon mal für die Hilfe ^^

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Nach Wörtern in einer StringList suchen

Beitrag von Komoluna »

Code: Alles auswählen

for i:=0 to kette.Count - 1 do
  if pos(Vorname, kette.Strings[i]) = 0 then
    if pos(Nachname, kette.Strings[i]) = 0 then
    begin
      //Hinzufügen
    end else
    begin
      //Gips schon
    end;
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Antworten