TMemo Text einfügen



  • Jo hiermit bin ich zufireden:

    Main->Editor->Lines->Insert(Main->Editor->CaretPos.y, cline.c_str());
    

    thx & cu,
    code_pilot



  • Hi,

    Und wie kann ich ein Zeichen, and die OnKeyUp-, bzw. OnKeyDown-Ereignisbehandlung übergeben wurde, unterbinden? Also, so machen, dass es nicht angezeigt wird. Denn mit einfachem Key = 0 funktioniert es nicht.

    Sorry, falls diese Frage nicht zum Topic passt.



  • Original erstellt von <bIce>:
    mit einfachem Key = 0 funktioniert es nicht

    Nimm das OnKeyPress-Event, dann klappt's auch mit Key = 0. Oder suchst du eher sowas?



  • ich hab gerade auch mit

    Key = '\b'
    

    ausprobiert.
    Bei

    OnKeyDown
    

    wird das Zeichen vor dem Caret gelöscht und nicht das Zeichen das an die Prozedur übergeben wurde. Und mit

    OnKeyUp
    

    funktioniert's auch nicht.



  • mit OnKeyPress klappt's, aber es löst nicht mein ursprüngliches Problem, dass ich bei der Fragestellung leider nicht beschrieben habe.
    Das Zeichen sollte durch eine Zeichenkette ersetzt werden. Und wenn ich es mit OnKeyPress mache, dann wird eine neue Zeile über der aktuellen mit der Zeichenkette hinzugefügt.

    Jetzt noch der Quelltext dazu:

    switch(Key){
    case VK_TAB:
    RichEdit1->Lines->Insert(RichEdit1->CaretPos.y, " ");
    Key = 0;
    }



  • Ich hab noch eine akzeptable Lösung gefunden, mein Fehler war, dass ich es nicht erkannt habe, dass mit TStringList->Insert() eine neue Zeile hinzugefügt wird.

    Die Lösung sieht so aus:

    void __fastcall TForm1::RichEdit1KeyPress(TObject *Sender, char &Key)
    {
       switch(Key){
          case '\t':
             RichEdit1->Lines->BeginUpdate();
             int line = RichEdit1->CaretPos.y;
             int curPos = RichEdit1->SelStart;
    
             AnsiString txt = RichEdit1->Lines->Strings[line];
             AnsiString insTxt = "   ";
             txt.Insert( insTxt, RichEdit1->CaretPos.x + 1 );
             RichEdit1->Lines->Delete(line);
             RichEdit1->Lines->Insert(line, txt);
    
             RichEdit1->SelStart = curPos+insTxt.Length();
             RichEdit1->Lines->EndUpdate();
             Key = 0;
       }
    }
    

    Original erstellt von Jansen:
    Nimm das OnKeyPress-Event, dann klappt's auch mit Key = 0.

    Du hast recht, es funktioniert mit OnKeyPress



  • Mit SelStart warst du doch schon so dicht an der "richtigen" Lösung ...

    switch(Key)
       {
          case '\t' :
            RichEdit1->SelText = "   ";
            Key = 0;
            break;
          ...
       }
    


  • Danke für diese "richtige" Lösung. Ehrlich gesagt wusste ich nicht einmal, dass es eine SelText-Eigenschaft gibt. Aber mir ist doch noch eine Frage eingefallen.

    Wie kann in der TRichEdit Komponente das VK_DELETE-Ereignis richtig verwerten, also das das Zeichen vor dem Cursor gelöscht wird. Denn dieses Ereignis kommt nur bei OnKeyUp an und mir fällt nichts passendes kurzes ein.



  • Nimm OnKeyDown. 🙂
    Wenn du dort Key auf 0 setzt wird kein Zeichen gelöscht.



  • Original erstellt von Jansen:
    Nimm OnKeyDown. 🙂
    Wenn du dort Key auf 0 setzt wird kein Zeichen gelöscht.

    Im Gegenteil ich möchte dass das Zeichen gelöscht wird.

    Aber ich musste leider feststellen, dass das Problem nur in meinem Projekt auftritt. VK_DELETE kommt aus irgendeinem Grund nur bei OnKeyUp an. Wünscht ich mir noch viel Spass den Fehler zu suchen, in 3 Units mit 1127, 946, 572 Quelltextzeilen 😡



  • Naja, es werden ja wohl nicht alle 2500+ Zeilen mit der Tastaturbehandlung zu tun haben, und nur dort würde ich den Fehler vermuten.


Anmelden zum Antworten