ReplaceDialog --> wie lösen??



  • [cpp]
    void __fastcall TFlex_DB::ReplaceDialog1Replace(TObject *Sender)
    {
    if (ReplaceDialog1 -> Options.Contains(frReplaceAll));
    static int Count;
    TSearchTypes Options;
    if (ReplaceDialog1 -> Options.Contains(frWholeWord))
    Options << stWholeWord;
    if (ReplaceDialog1 -> Options.Contains(frMatchCase))
    Options << stMatchCase;

    int Pos = RichEdit1 -> FindText(ReplaceDialog1 -> FindText, RichEdit1 -> SelStart,
    RichEdit1 -> GetTextLen(), Options);

    while (Pos != -1)
    {
    RichEdit1 -> SelStart = Pos;
    RichEdit1 -> SelLength =
    ReplaceDialog1 -> FindText.Length();

    RichEdit1 -> SetSelTextBuf(
    ReplaceDialog1 -> ReplaceText.c_str());
    RichEdit1 -> Perform(EM_SCROLLCARET, 0, 0);

    Count;

    Pos = RichEdit1 -> FindText(
    ReplaceDialog1 -> FindText, RichEdit1 -> SelStart,
    RichEdit1 -> GetTextLen(), Options);
    }

    ReplaceDialog1 -> CloseDialog();

    char buff[40];
    sprintf (buff, "Textsuche beendet.\r\n%d replacements made.", Count);
    MessageBox(Application -> Handle, buff, "Text ersetzen", MB_OK);

    Count = 0;
    }

    else {

    if (RichEdit1 -> SelLength == 0) return;
    RichEdit1 -> SetSelTextBuf(ReplaceDialog1 -> ReplaceText.c_str());
    RichEdit1 -> SelLength = 0;
    }
    RichEdit1 -> SetFocus();[/cpp]

    an den beiden schwarz markierten zeilen, bekomme ich folgende Fehler:
    1.) [C++ Fehler] Flexiva.cpp(239): E2268 Aufruf der undefinierten Funktion 'sprintf'

    2.) [C++ Fehler] Flexiva.cpp(245): E2040 Deklaration nicht ordnungsgemäß abgeschlossen



  • void __fastcall TFlex_DB::ReplaceDialog1Replace(TObject *Sender)
    {
    if (ReplaceDialog1 -> Options.Contains(frReplaceAll));
    static int Count;
    TSearchTypes Options;
    if (ReplaceDialog1 -> Options.Contains(frWholeWord))
    Options << stWholeWord;
    if (ReplaceDialog1 -> Options.Contains(frMatchCase))
    Options << stMatchCase;
    
    int Pos = RichEdit1 -> FindText(ReplaceDialog1 -> FindText, RichEdit1 -> SelStart,
    RichEdit1 -> GetTextLen(), Options);
    
    while (Pos != -1)
    {
    RichEdit1 -> SelStart = Pos;
    RichEdit1 -> SelLength =
    ReplaceDialog1 -> FindText.Length();
    
    RichEdit1 -> SetSelTextBuf(
    ReplaceDialog1 -> ReplaceText.c_str());
    RichEdit1 -> Perform(EM_SCROLLCARET, 0, 0);
    
    Count;
    
    Pos = RichEdit1 -> FindText(
    ReplaceDialog1 -> FindText, RichEdit1 -> SelStart,
    RichEdit1 -> GetTextLen(), Options);
    }
    
    ReplaceDialog1 -> CloseDialog();
    
    char buff[40];
    [b]sprintf[/b] (buff, "Textsuche beendet.\r\n%d replacements made.", Count);
    MessageBox(Application -> Handle, buff, "Text ersetzen", MB_OK);
    
    Count = 0;
    }
    
    [b]else {[/b]
    
    if (RichEdit1 -> SelLength == 0) return;
    RichEdit1 -> SetSelTextBuf(ReplaceDialog1 -> ReplaceText.c_str());
    RichEdit1 -> SelLength = 0;
    }
    RichEdit1 -> SetFocus();
    


  • Hallo

    Vermutlich fehlt dir einfach nur der include auf den Header wo sprintf deklariert ist. Aber warum solltest du eine alte C-Funktion samt C-Array benutzen, was einerseits veraltet und anderseits fehleranfällig ist? Benutzt AnsiString!

    int Count;
    ...
    AnsiString buff = "Textsuche beendet.\r\n" + IntToStr(Count) + " replacements made.";
    Application->MessageBox(buff.c_str(), "Text ersetzen", MB_OK);
    

    bis bald
    akari



  • Du hast in Zeile 3 ein Semikolon zu viel



  • wenn ich deinen code eingebe, kommen folgende fehlermeldungen:

    [C++ Fehler] Flexiva.cpp(239): E2238 Bezeichner 'buff' mehrfach deklariert
    [C++ Fehler] Flexiva.cpp(238): E2344 'buff' bereits deklariert



  • hab noch ein bisschen rumgeschraubt, aber ich glaub, der quellcode stimmt gar net so richtig

    hat jemand vlt. nen fetzen?

    oder sogar vlt. die lösung?



  • ok, es funktioniert

    {
      if (ReplaceDialog1 -> Options.Contains(frReplaceAll));
        static int Count;
        TSearchTypes Options;
        if (ReplaceDialog1 -> Options.Contains(frWholeWord))
          Options << stWholeWord;
        if (ReplaceDialog1 -> Options.Contains(frMatchCase))
          Options << stMatchCase;
    
        int Pos = RichEdit1 -> FindText(ReplaceDialog1 -> FindText, RichEdit1 -> SelStart,
          RichEdit1 -> GetTextLen(), Options);
    
        while (Pos != -1)
        {
          RichEdit1 -> SelStart = Pos;
          RichEdit1 -> SelLength =
            ReplaceDialog1 -> FindText.Length();
    
          RichEdit1 -> SetSelTextBuf(
            ReplaceDialog1 -> ReplaceText.c_str());
          RichEdit1 -> Perform(EM_SCROLLCARET, 0, 0);
    
          int Count;
    
          Pos = RichEdit1 -> FindText(
            ReplaceDialog1 -> FindText, RichEdit1 -> SelStart,
            RichEdit1 -> GetTextLen(), Options);
        }
    
        ReplaceDialog1 -> CloseDialog();
    
        AnsiString buff = "Textsuche beendet.\r\n" + IntToStr(Count) + " replacements made.";
        Application->MessageBox(buff.c_str(), "Text ersetzen", MB_OK);
    
        Count = 0;
    
        if (RichEdit1 -> SelLength == 0) return;
        RichEdit1 -> SetSelTextBuf(ReplaceDialog1 -> ReplaceText.c_str());
        RichEdit1 -> SelLength = 0;
    
      RichEdit1 -> SetFocus();
     }
    

    habe noch in einem button folgenden code eingefügt, denn dann wird FindDialog und ReplaceDialog in einem fenster angezeigt:

    void __fastcall TFlex_DB::Button1Click(TObject *Sender)
    {
      FindDialog1->Position = Point(RichEdit1->Left + RichEdit1->Width,
      RichEdit1->Top);
      FindDialog1->Execute();
    
      ReplaceDialog1->Position = Point(RichEdit1->Left + RichEdit1->Width,
      RichEdit1->Top);
      ReplaceDialog1->Execute();
    }
    


  • un für die, die sich fragen, wie ich den FindDialog deklariert habe

    hier iss der Quellcode:

    void __fastcall TFlex_DB::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();
        RichEdit1->Perform(EM_SCROLLCARET, 0, 0);  //Such-Funktion scrollt
                                                   //automatisch nach unten / oben
      }
    }
    

    den rest müsstet ihr selber schaffen



  • Du bist mein Doppelposter des Jahres :p



  • wieso bin ich das? xD 😃 😃


Anmelden zum Antworten