Innerhalb von Memo suchen - C++



  • wenn ich den FindDialog nehme, kann ich ihn ja aber nur benutzen, wenn ich im bearbeitungsmodus bin

    denn bei en eigenschaften finde ich nichts, womit ich diesen dialog im quellcode mit einbinden kann



  • Geh doch einfach bei TMemo::Lines::Strings die einzelnen Strings durch und suche darin mit AnsiString::Pos.



  • Cyber-Space schrieb:

    wenn ich den FindDialog nehme, kann ich ihn ja aber nur benutzen, wenn ich im bearbeitungsmodus bin

    Du meinst sicher Laufzeit oder Runtime.

    Cyber-Space schrieb:

    denn bei en eigenschaften finde ich nichts, womit ich diesen dialog im quellcode mit einbinden kann

    Du willst zur Entwurfszeit in dem Memo Begriffe suchen ?



  • ok, da hab ich mich evtl. ein bisschen falsch ausgedrückt

    also, wenn ich alles gespeichert habe, drücke ich F9. dann startet ja nun das programm (mit fertiger benutzeroberfläche).

    wenn das programm gestartet ist, öffne ich eine vorhandene textdatei (oder andere formate), wo ich per FindDialog einen Begriff suchen lassen möchte.

    aber ich hab keinen blassen schimmer wie ich das anstellen kann

    hoffe, nun versteht man, was ich für ein problem habe



  • am besten mit einem Button oder einer EditBox

    bloß, was ist besser

    hoffe, ihr könnt mir nen tipp geben



  • Mit F9 startest du das Programm im Debuggermodus, das weist du ?

    Falls du keine FindDialog-Komponente auf dem Formular hast, zieh eine drauf.
    In der Hilfe des BCB ist auch ein kleines Beispiel zu diesem Dialog.

    mfg
    kpeter



  • jo, dad weiß ich, das ich anch drücken der F9-Taste im Debuggermodus bin

    ich habe auch den FindDialog schon in meinem Bearbeutungsfenster (in C++ standardmäßig TForm1)

    also die hilfedatei hab ich auch schon durchgestöbert, aber nichts gefunden



  • Tip,

    nimm anstatt des Memo eine TRichEdit-Kompo. Die ist von TCustomMemo abgeleitet, hat mehr
    Eigenschaften und direkt eine Methode FindText.

    Hier das Listing aus meiner F1:

    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;
      // Suchbeginn nach der aktuellen Markierung
      // (falls vorhanden) 
      // andernfalls beim Textanfang starten
      if (RichEdit1->SelLength)
        StartPos = RichEdit1->SelStart + RichEdit1->SelLength;
      else
    
        StartPos = 0;
    
      // ToEnd ist die Länge von StartPos bis zum Ende des Textes
      // im RTF-Eingabefeld
    
      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();
      }
    }
    

    Müsste auf Anhieb gehen 😃



  • danke dir

    es funktioniert alles einwandfrei

    super, danke



  • bin stolz auf dich 👍 👍 👍

    darfst dir auf die schultern klopfen 😃 😃 😃 😃



  • Danke für die Blumen.

    Hier wird immer gerne geholfen.
    😉

    mfg
    kpeter



  • is das bei dir auch, das das RichEdit nicht automatisch zum angezeigten Wort/Text scrollt?



  • Das Fenster muss noch gescrollt werden.
    Wenn eine Position im Text gefunden wurde, die ober- oder unterhalb des sichtbaren Bereiches liegt,
    schickt man ein Message an die TRichEdit:

    RichEdit1->Perform(EM_SCROLLCARET, 0, 0);
    

    Diese Zeile hängst du ganz unten als letze ein.

    Das funktioniert aber nur solange, wie Text markiert (selektiert) ist.



  • jo, thx

    das läuft wie ne sahne^^

    dankeschön



  • ich denke mal, das kann zu den FAQ`s

    von meiner seite ist es geschlossen


Anmelden zum Antworten