CaretPos im TRichEdit SETZEN



  • Wie man die Position des Text-Cursors in Zeilen und Spalten heraus bekommt, wurde ja schon hier geklärt. Aber wie SETZT man die Position? Ich will eigentlich nur in eine bestimmte Zeile springen. Aber mit CaretPos kann man nichts setzen, nur Lesen. (Oder?)
    Und mit SelStart kann man nur zu einem ZEICHEN springen, nicht zu einer ZEILE. Wie man vom Zeichen zur Zeile kommt, weiß ich. Aber nicht anders rum. Lines hat kein ItemIndex wie eine ListBox. Wisst IHR vielleicht was? So habs ich versucht:

    memTextansicht->SetFocus();
    memTextansicht->CaretPos.y = Gewuenschte_Zeile;
    memTextansicht->CaretPos.x = 1;
    memTextansicht->Perform(EM_SCROLLCARET, 0, 0);
    

    Mit nem Haltepunkt in der letzten Zeile und dem Cursor auf CaretPos wird CaretPos={x:0,y:0) angezeigt, in "Gewuenschte_Zeile" steht ne positive Zahl.



  • Wie wäre es denn damit?

    memTextansicht->SetFocus();
    TPoint caretPos = new TPoint(1, Gewuenschte_Zeile);
    memTextansicht->CaretPos = caretPos;
    memTextansicht->Perform(EM_SCROLLCARET, 0, 0);
    

    Vielleicht funktioniert's ja?

    Gruß,

    Alexander



  • Geht leider nicht. Erst meckert er wegen new. Da ist ja kein Sternchen(Jaja, ich weiß!). Mit Sternchen mag er auch nicht, da *TPoint nicht TPoint ist. Ohne new mag er es auch nicht. (Also TPoint caretpos = TPoint(1,Gewuenschte_Zeile)). Denn da sagt er, dass man auf memTextansicht->CaretPos nicht zugreifen kann. Wenn ich es wie eben mache, aber den Wert extra zuweise (caretpos.x), geht es genauso wenig. Nun, CaretPos kann ich wohl begraben. 😞

    Ach ja: Ich rede wirklich von einem RichEdit! Ich weiß, dass es bescheuert ist, es dann MEMtextansicht zu nennen... aber egal.



  • Also, ich habe das gerade mal geschwind ausprobiert und
    folgendermaßen funktioniert das bei mir.
    Dazu brauchst Du ein Formular mit einer TRichEdit-Komponente,
    ein TEdit und einen TButton.

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       TPoint caretPos = RichEdit1->CaretPos;
       caretPos.y = StrToInt(Edit1->Text);
       RichEdit1->CaretPos = caretPos;
       RichEdit1->SetFocus();
    }
    

    Damit könnte man CaretPos praktisch wieder exhumieren 🙂

    Gruß,

    Alexander



  • Bei mir (Builder 3 Std.) ist TRichEdit::CaretPos eine Read-Only-Eigenschaft. Im Builder 4 ist das ebenfalls so (hab im Code nachgesehen). Man muss sich also selber was schreiben. Mir gefiel nach langem Rumprobieren das hier am besten:

    void SetCaretPos(TRichEdit* re, int x, int y)
    {
       // Das Caret ganz an den Anfang setzen (keine Markierung mehr)
       re->Perform(EM_SETSEL, 0, 0);
    
       // Den Index des Zeichens am Zeilenanfang bekommen
       int char_index = re->Perform(EM_LINEINDEX, y, 0);
    
       // Daraus an die Länge der Zeile kommen...
       int line_length = re->Perform(EM_LINELENGTH, char_index, 0);
    
       // ... und schauen, ob x nicht zu groß ist
       if(x < line_length)
          char_index += x;
    
       // Das Caret an die richtige Stelle setzen
       re->Perform(EM_SETSEL, char_index, char_index);
       re->SetFocus();
    }
    

    Das mit dem vielen WinAPI tut mir leid. Ich mag's aber am liebsten, und es ist am schnellsten. 🙂



  • Sorry, dass ich so lange nicht geantwortet habe...

    @Alexander Kempf: Danke, aber ich (BCB5) kann nach wie vor nicht auf RichEdit->CaretPos schreiben. Klappt das bei dir etwa?

    @WebFritzi: Klappt super! Danke!



  • Plemplem schrieb:

    @Alexander Kempf: Danke, aber ich (BCB5) kann nach wie vor nicht auf RichEdit->CaretPos schreiben. Klappt das bei dir etwa?

    Sonst hätte ich das nicht beschrieben. Aber scheinbar klappt's ja jetzt
    auch anders.

    Gruß,

    Alexander


Anmelden zum Antworten