RichEdit unter CodeGear 2009 - Probleme mit SelStart



  • Hallo Community,

    Ich hab in meinem Programm ein RichEdit, in welches ich Text aus einer datei auslese und diesen anschließend im OnChange-Ereignis auf Schlüsselwörter geprüft und diese Farblich hervorhebe.
    In dem OnChange Arbeite ich mit den Methoden "SelStart" - "SelLength" und mit "RichEdit->Lines->Text".
    Ich lade mit immer eine bestimmte Zeile in einen AnsiString und durchsuche diesen anschließend mit der Funktion "Pos".

    int iWork = RichEdit1->Lines->Text.Length();
      int CPos = RichEdit1->SelStart;
      int ZAnf = 1;         
      int ZEnd = iWork -2;
      int i;
      AnsiString sWork;
    
      if (iWork < 3)
    	return;
      for (i=CPos; i > 0; i--)
      {
    	sWork = RichEdit1->Lines->Text[i];
    	if (sWork == '\n'  ||  sWork == '\r')
    	{
    	  ZAnf = i;
    	  break;
    	}
      }
      for (i=CPos +1; i < iWork; i++)
      {
    	sWork = RichEdit1->Lines->Text[i];
    	if (sWork == '\n'  ||  sWork == '\r') 
    	{
    	  ZEnd = i;
    	  break;
    	}
      }
    
      RichEdit1->SelLength = ZEnd - ZAnf;
      AnsiString str = RichEdit1->Lines->Text.SubString(ZAnf, ZEnd - ZAnf +2);
    

    Im 2007er Compiler hat dies ohne Probleme funktioniert.
    Nach der Umstellung auf den 2009er hab ich festgestellt, dass das Laden des Textes aus einer DAtei und das Hervorheben der Wörter funktioniert.
    Ändert man jedoch den Text oder legt einen neuen an, wird das hervorheben falsch gemacht. es werden Wörter markiert die keien Schlüsselwörter sind
    oder Schlüsselwörter werden nur halb markiert.

    Also muss sich im 2009er etwas geändert haben, die routine ist die gleiche.
    Beim druchtracen ist mir nichts aufgefallen.
    Anscheinend nimmt SelStart jedoch eine falsche Position obwohl im Trace die richtige steht.

    Ist da etwas bekannt? Wie kann man das ändern?!
    Danke



  • Hallo

    Das dürfte daran liegen das der Builder ab 2009 nicht mehr im ANSI-Modus arbeitet, sondern mit Unicode. Deine expliziete Verwendung des Datentypes AnsiString dürfte für das Verschlucken von Informationen verantwortlich sein. Verwende stattdessen immer den Datentyp String. Dann verwendet der Kompiler automatisch den richtigen Datentyp.

    bis bald
    akari



  • aber die Fehler treten ja im RichEdit auf, unabhängig davon ob ich einen AnsiString, UnicodeString oder nur String verwende.

    Wenn ich meinen Text z.B. nur in eine Zeile schreibe, funktioniert das farbliche hervorheben ohne Probleme.
    Füge ich \r\n hinzu , sprich "Enter".
    stimmt der RichEdit ->SelStart nicht überein.
    Erst um 1 Stelle, dann um 2. usw.

    Obwohl er im String die richtigen Koordinaten hat.



  • mittlerweile hab ich ne Lösung gefunden.
    Ich hab festgestellt das in dem String den ich in dem Richedit habe
    das '\n' nicht beachtet wird.
    Je mehr "Returns" ich in dem Richedit gemacht habe umso mehr hat sich die Markierung verschoben.

    Hab mir eine Routine die mir die '\n' in dem Text vor der Markierung zählt
    und addiere diese Anzahl dann auf das RichEdit->SelText drauf.

    Für meinen Fall ist das ausreichend


Log in to reply