Wie benutzt man die Methode FindText?



  • Hallo,

    ich glaub es wäre besser mal weiter auf das Problem einzugehen, als Bilder eurer Hilfen hin und her zu schieben :P!

    Die BCB6-Hilfe sagt folgendes:

    enum TSearchType { stWholeWord, stMatchCase };

    typedef Set<TSearchType, stWholeWord, stMatchCase> TSearchTypes;

    int __fastcall FindText(const AnsiString SearchStr, int StartPos, int Length, TSearchTypes Options);

    Das Beispiel dazu:

    int FoundAt, StartPos, ToEnd;
    
    StartPos = 0;
    
    // ToEnd is the length from StartPos 
    // to the end of the text in the rich edit control
    
    ToEnd = RichEdit1->Text.Length() - StartPos;
    
    FoundAt = RichEdit1->FindText("Der Text nachdem gesucht werden soll", StartPos, ToEnd, TSearchTypes()<< stMatchCase);
    

    mfg, Micha!

    Edit: hmmpf zu langsam 😃



  • Ok das funktioniert soweit Danke!

    Edit: Doch nicht!
    Hier der Gesamte Code

    void __fastcall TForm2::FormCreate(TObject *Sender)
    {
    Sicher = false;
    vorhanden = false;
    RichEdit2->Lines->LoadFromFile (pfad_rezeptedb);
    }
    //-----------------------------------------------------
    void __fastcall TForm2::Button1Click(TObject *Sender)
    {
    int StartPos = 0;
    int ToEnd = RichEdit2->Text.Length() - StartPos;
    
    vorhanden = RichEdit2->FindText(Edit1->Text), StartPos, ToEnd, TSearchTypes()<<stWholeWord <<stMatchCase);
    
    if (vorhanden)
      {
      Application->MessageBox("Rezeptname bereits vorhanden!","Achtung",0);
      }
    
    if ((Edit1->Text == "") && (ComboBox1->Text != "Rubrik wählen") && (!vorhanden))
      {
      RichEdit2->Lines->Add(Edit1->Text);
      RichEdit2->Lines->SaveToFile (pfad_rezeptedb);
      RichEdit1->Lines->SaveToFile (pfad_rezepte + Edit1->Text + ".txt");
      Sicher = true;
      }
    
    if ((!Sicher) && (!vorhanden))
      {
      Application->MessageBox (Bitte Alles ausfüllen!","Achtung",0);
      }
    }
    

    So, in der rezeptedb ist bereits enthalten "Test" und "o"
    (Ich weiß keine guten Testbegriffe, aber so ist es halt)
    Wenn ich jetzt noch mal "o" eingebe, sagt er "Bereits vorhanden" ->gut so!
    Wenn ich jetzt noch mal "Test" eingebe, fügt er es trotzdem hinzu ->nicht gut!
    auch wenn ich einen neuen Titel eingebe z.B "Test2", sagt er "Bereits vorhanden" -> nicht gut!

    Erkennt jemand das Problem?



  • selbst wenn ich die rezepteliste komplett entleere, sagt er "Bereits vorhanden!"



  • Hallo

    vorhanden = RichEdit2->FindText(Edit1->Text), StartPos, ToEnd, TSearchTypes()<<stWholeWord <<stMatchCase);
    
    // was macht die Klammer hinter Edit1->Text???
    

    FindText liefert die Position des Such-Strings, wobei 0 die Position des ersten Zeichens im RichText-Steuerelement (im Gegensatz zur ersten Position im Suchbereich) angibt. Wenn der Such-String im angegebenen Bereich nicht vorhanden ist, gibt FindText -1 zurück.

    vorhanden ist in deinem Fall ein bool. Alles was vorhanden != 0 ist, ist wahr (also true)

    ... vielleicht findest du den Fehler jetzt selber ...

    mfg, Micha

    Edit: keine leichte Sache mit der Rechtschreibung



  • Ja Problem erkannt, aber das will immer noch nicht!

    ich hab jetzt:

    int zahl=0;
    zahl = RichEdit2->FindText(Edit1->Text, StartPos, ToEnd, TSearchTypes()<<stWohleWord<<stMatchCase);
    if (zahl !=0) vorhanden = true;
    
    if (vorhanden) Label1->Caption = "vorhanden";
    if (!vorhanden) Label1->Caption = "nicht vorhanden";
    


  • lordblacksheep schrieb:

    Ja Problem erkannt

    Anscheinend nicht 🙄

    Wenn der Such-String im angegebenen Bereich nicht vorhanden ist, gibt FindText -1 zurück.

    mfg, Micha!



  • Also hab ich geändert->

    if (zahl != -1) vorhanden = true;

    genauso müsste auch

    if (zahl == -1) vorhanden = false;

    gehen oder?
    (nur mit ja oder nein antworten)



  • Hallo

    Ja... oder einfacher

    int zahl=0;
    zahl = RichEdit2->FindText(Edit1->Text, StartPos, ToEnd, TSearchTypes()<<stWohleWord<<stMatchCase);
    if (zahl != -1)
    {
      Label1->Caption = "vorhanden";
    }
    else
    {
      Label1->Caption = "nicht vorhanden";}
    

    bis bald
    akari



  • ja



  • genau das hab ich erwartet. Ich hab den Code genau so drin. Doch es geht nicht!

    denn in der rtf-Datei stehen 2 Einträge:
    Test1
    Test2

    Wenn ich jetzt Test1 als Suchbegriff einsetzte -> "vorhanden" -> gut so!
    Wenn ich jetzt Test2 als Suchbegriff einsetzte -> "vorhanden" -> gut so!
    Wenn ich jetzt Test3 als Suchbegriff einsetzte -> "vorhanden" -> NICHT GUT!
    Wenn ich jetzt xxxxx als Suchbegriff einsetzte -> "vorhanden" -> NICHT GUT!

    noch mal der Code wie er orginal da steht!

    RichEdit2->Lines->LoadFromFile (pfad_rezeptedb);
    int StartPos = 0;
    int ToEnd = RichEdit2->FindText(Edit1->Text, usw, usw)
    if (zahl != -1) vorhanden = true;
    if (vorhanden) Label1->Caption "vorhanden";
    if (!vorhanden) Label1->Caption "nicht vorhanden";
    


  • Noch ein Zusatz, der Interessant ist!

    Zuerst etwas nicht vorhandenes eingebe, sagt er nicht vorhanden
    aber wenn ich einmal was vorhandenes habe, ist alles danach auch vorhanden, egal was ich eingebe!

    Wenn ich jetzt Test9 als Suchbegriff einsetzte -> "nicht vorhanden" -> gut so!
    Wenn ich jetzt Test1 als Suchbegriff einsetzte -> "vorhanden" -> gut so!
    Wenn ich jetzt Test9 als Suchbegriff einsetzte -> "vorhanden" -> NICHT GUT!
    Wenn ich jetzt xxxxx als Suchbegriff einsetzte -> "vorhanden" -> NICHT GUT!



  • hiho
    das ist klar
    vorhanden kann gar nicht false werden(ausser beim ersten mal, da bin ihc mir abernoch nicht sicher, poste mal alles worin vorhanden vorkommt)

    RichEdit2->Lines->LoadFromFile (pfad_rezeptedb);
    int StartPos = 0;
    int ToEnd = RichEdit2->FindText(Edit1->Text, usw, usw)
    if (zahl != -1) vorhanden = true;//und wenn zahl == -1?????
    if (vorhanden) Label1->Caption "vorhanden";
    if (!vorhanden) Label1->Caption "nicht vorhanden";
    

    überleg mal selber(die Lösung mein ich)
    mfg allison



  • Hallo,

    RichEdit1->Text = "Hallo Welt, das ist ein Test\n\nWie gehts?";
    int zahl=0;
    int StartPos = 0;
    int ToEnd = RichEdit1->Text.Length();
    
    zahl = RichEdit1->FindText(Edit1->Text, StartPos, ToEnd, TSearchTypes() << stWholeWord << stMatchCase);
    if (zahl != -1)
    {
      Label1->Caption = "vorhanden";
    }
    else
    {
      Label1->Caption = "nicht vorhanden";}
    
    // Eingabe: Welt = vorhanden
    // Eingabe: welt = nicht vorhanden (stMatchCase (Groß-und Kleinschreibung))
    // ...
    

    Hab's getestet, das geht :p

    mfg, Micha



  • hiho
    oder nimm akari's code, der stimmt(wie immer) 😉

    mfg allison



  • stimmt! Ich überleg doch immer, probier immer aus, während ihr antwortet. sry wenn ich nerve. Aber mit jedem Thread lern ich sehr viel dazu!



  • hiho
    klar, war ja nicht böse gemeint 😉
    aber: "learning by doing"^^
    mfg allison


Anmelden zum Antworten