Wie benutzt man die Methode FindText?



  • hiho
    also bei mir sieht das so aus
    http://www.file-upload.net/download-375967/help.bmp.html
    bei dir auch?
    mfg allison





  • Hallo

    Um es kurz zu machen, hier die entsprechenden Hilfeauszüge

    Mit Hilfe von FindText kann in einem Textbereich eines RichText-Steuerelements nach dem im Parameter SearchStr angegebenen String gesucht werden. Nur der Text in dem Bereich, der mit StartPos beginnt und dessen Länge im Parameter Length festgelegt ist, wird durchsucht. Mit Options kann festgelegt werden, ob nur nach ganzen Wörtern gesucht oder die Groß-/Kleinschreibung berücksichtigt werden soll. 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.

    Verwenden Sie FindText anstatt mit Programmanweisungen den Text des Steuerelements zu durchsuchen, da Sie auf diese Weise verhindern, daß die Operation durch codierte RichText-Attribute fehlschlägt.

    Und noch das Beispiel

    //Für dieses Beispiel werden drei Objekte benötigt: TRichEdit, TButton und 
    //TFindDialog.
    //Nach einem Klick auf die Schaltfläche wird rechts vom Eingabefeld ein 
    //Dialogfeld Suchen angezeigt. Wenn nun ein Suchtext eingegeben und die Suche 
    //gestartet wird, erhält der erste passende String nach der aktuellen 
    //Cursorposition im RTF-Eingabefeld eine Markierung.
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    
    {
      FindDialog1->Position = Point(RichEdit1->Left + RichEdit1->Width, RichEdit1->Top);
      FindDialog1->Execute();
    
    }
    
    void __fastcall TForm1::FindDialog1Find(TObject *Sender)
    
    {
      int FoundAt, StartPos, ToEnd;
      // Suche hinter aktueller Markierung beginnen (falls vorhanden).
      // Andernfalls am Textanfang starten.
      if (RichEdit1->SelLength)
        StartPos = RichEdit1->SelStart + RichEdit1->SelLength;
      else
    
        StartPos = 0;
    
      // ToEnd ist die Länge von StartPos 
      // bis zum Textende in Steuerelement.
    
      ToEnd = RichEdit1->Text.Length() - StartPos;
    
      FoundAt = RichEdit1->FindText(FindDialog1->FindText, StartPos, ToEnd, TSearchTypes()<< stMatchCase);
      if (FoundAt != -1)
      {
        RichEdit1->SetFocus();
        RichEdit1->SelStart = FoundAt;
        RichEdit1->SelLength = FindDialog1->FindText.Length();
      }
    }
    

    Damit sollte der Einsatz der Funktion klar sein.

    bis bald
    akari



  • 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