RichEdit Zeile einfügen



  • Ole, ich wär dann soweit. '+', '-' und '_' werden nach '\t' oder ' ' oder am Zeilenanfang nach '\n' miterfasst. Wenn ich noch den '*' mit aufnehmen soll, werden die Bedingungsketten recht lang. Weiß nicht, ob sowas Nachteile haben kann.

    Wer stiftet die Lösung für die 1. Zeile? 🙂 Text nach Cursor darf nicht abgeschnitten werden. Ich find keinen Hinweis, warum es das macht.



  • 😕 Ich komm mit deinem Code nicht klar. Weil er bei mir nicht die Eigenschaften zeigt die du hier berichtest. Er fügt 2 Zeilen ein nachdrücken der Enter Taste , wobei in der ersten Zeile kurzzeitig der Zeilenvorschub AMrkiert sichtbar ist. Ich kuck mir das morgen nochmal genauer an aber zurzeit hinke ich irgendwie hinterher?



  • Nanu? Ausnahmslos Spezalisten an Bord? 😉

    Also ohne Code für die erste Zeile = keine FAQ:

    <snip>siehe nachfolgende Beiträge</snip>

    [ Dieser Beitrag wurde am 20.05.2003 um 15:54 Uhr von Jansen editiert. ]



  • *Au_weia*! Den Code aus meinem letzten Beitrag bitte meistbietend verbrennen - gröbste Schnitzer. 🙄

    Ich glaub, jetzt bin ich erst mal zufrieden. Sind noch Bugs drin?:

    <snip>siehe nachfolgende Beiträge</snip>

    [ Dieser Beitrag wurde am 20.05.2003 um 15:55 Uhr von Jansen editiert. ]



  • Hab vorhin gemerxt, wenn ich den Cursor vorn in einer Zeiel ansetz und einen Zeilenumbruch schaffe, dann auf
    *RE->Lines->Strings[line_nr-1].AnsiLastChar() == '\n'
    prüfe, bekomm ich eine Zugriffsverletzung. Tatsächlich ist dann das letzte sichtbare Zeichen der vorangegangenen Zeile der AnsiLastChar(). Mein Vorhaben, nur erkennbar gewollte Aufzählungszeichen zu akzeptieren, dürfte damit gescheitert sein.

    Hab diese Prüfungen und damit auch einige if-Zweige weggelassen. Jetzt kann ich keinen Bug mehr feststellen.

    Ich sollte diese Version nochmal posten. Aber die vielen fast gleichen Versionen hinternander, da blickt niemand durch. Ich will auch nicht den Thread total verbomben. Soll ich es posten und einer der Mods wär ggf. so freundlich, die störenden Beiträge incl. diesem zu löschen?



  • Jo, mach mal. Aber nimm doch bitte die C++Code-Tags.



  • Ole, das war's. Bei mir arbeitet die Function jetzt sauber. Hier noch mal der Code + Function für die Wechselschaltung (bei mir) über MenuItem:

    void __fastcall TChild::EinrueckClick(TObject *Sender)
    {
      Einrueck->Checked = !Einrueck->Checked;
      if (Einrueck->Checked)
        Einrueck->Tag = 1;
      else
        Einrueck->Tag = 0;
    }
    //---------------------------------------------------------------------------
    void __fastcall TChild::REKeyPress(TObject *Sender, char &Key)
    {
      if (Key == VK_RETURN && Einrueck->Tag == 1)
      {
        int line_nr = RE->CaretPos.y, lz = 1, start;
        String line_txt = RE->Lines->Strings[line_nr], lzs = "";
        // Auf erstes Zeichen prüfen
        if (RE->Lines->Strings[line_nr].SubString(0,1) == ' ' ||
            RE->Lines->Strings[line_nr].SubString(0,1) == '\t' ||
            RE->Lines->Strings[line_nr].SubString(0,1) == '+' ||
            RE->Lines->Strings[line_nr].SubString(0,1) == '-' ||
            RE->Lines->Strings[line_nr].SubString(0,1) == '_')
        {
          // Anzahl der Zeichen in der Zeile ermitteln
          for (lz; lz <= line_txt.Length(); lz++)
          {
            // aussteigen, wenn am Zeilenanfang kein zu referierendes Zeichen
            if ((line_txt[lz] != ' ' && line_txt[lz] != '\t' &&
                line_txt[lz] != '+' && line_txt[lz] != '-' &&
                line_txt[lz] != '_') || lz > RE->CaretPos.x)
              break;
            // String für Zeilenanfang zusammenstellen
            else if (line_txt[lz] == ' ')
              lzs = lzs + " ";
            else if (line_txt[lz] == '\t')
              lzs = lzs + "\t";
            else if (line_txt[lz] == '+')
              lzs = lzs + "+";
            else if (line_txt[lz] == '-')
              lzs = lzs + "-";
            else if (line_txt[lz] == '_')
              lzs = lzs + "_";
          }
          // mindestens 1 zu wiederholendes Zeichen gefunden?
          if (lz > 1)
          {
            // ZeilenNummer aktuell ermitteln
            line_nr = RE->CaretPos.y;
            // CursorPosition merken
            start = RE->SelStart;
            // Aus aktueller Zeile 2 Zeilen machen:
            // LeerString + String hinter Cursor in neue Zeile
            RE->Lines->Strings[line_nr] =
                RE->Lines->Strings[line_nr].SubString(0,RE->CaretPos.x)+
                "\r\n"+lzs+RE->Lines->Strings[line_nr].SubString(RE->CaretPos.x+1,
                line_txt.Length()-RE->CaretPos.x+1);
            // Cursor hinter LeerzeichenString positionieren
            RE->SelStart = start + lz +1;
            // '\n' wurde eingearbeitet, Key löschen
            Key = 0;
          }
        }
      } // war keine Bedingung true, löst VK_RETURN Zeilenwechsel aus
    }
    


  • Sorry @Jansen, hab erst nach dem Posten deinen Hinweis auf die C++-Codetags gesehen. Ich blick auf den Text, seh im Augenwinkel das Wort "Code" und drück drauf - *Zerstreuter Prof*. Ich gelobe Besserung. 🙄

    @mosta, sorry für das Durcheinander. Da waren ein paar Haken und Ösen, ein paar unverstandene Sachen, Überraschungen, Neuland, teilweise dünne Scheibe :p . 🙄 Dafür sollte es jetzt aber blitzsauber laufen. Hab jedenfalls keinen krummen Hund mehr entdeckt.



  • Bei mir bearbeited er Key=0 nicht er setzt einfach eine neue Zeile ein. Was muss ich für Einstellung an der RichEdit vornehmen.



  • Bist du im OnKeyPress? In anderen Ereignissen kannst du nicht Key=0 setzen. Hatte ich aber klar geschrieben, als ich die Doppelfunction gepostst hab.



  • Oh, ich hatte KeyDown 🙄


Anmelden zum Antworten