none
CEdit::Clear() does not fonctione RRS feed

  • Frage

  • Why does not fonctione CEdit::Clear() fonction in this way?

    Tom

     

     

    void CMyView::OninitialUpdate()
    {
    
       CEdit& theEdit = GetEditCtrl();
       theEdit.SetReadOnly();
      ..
    
    }
    
    
    void CMyView::OnTimer(UINT nIDEvent)
    {
      CEdit& theEdit = GetEditCtrl();
      int nStartChar = 0;
      int nEndChar = theEdit.GetLineCount() - m_nHistoryDepth;
    
      theEdit.SetSel(0, nEndChar, TRUE);
      theEdit.Clear();
    }
    
    

     

    Freitag, 16. September 2011 08:35

Antworten

  • Also Clear geht nicht, bzgl. ReplacseSel/EM_REPLACESEL muss ich mich korrigieren, das geht natürlich.

    Ich weiß nur mit Sicherheit, das WM_PASTE, WM_CUT und WM_CLEAR bei einem Edit-Control mit ES_READONLY nicht funktionieren.

    EM_REPLACESEL hatte ich versehentlich in den gleichen Topf geworfen. Sorry für die Irritation.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    • Als Antwort markiert vcdummie Montag, 19. September 2011 15:02
    Montag, 19. September 2011 13:49
    Moderator
  • Ja, fehlte noch ein UpdateWindow().

    theEdit.ReplaceSel(0,n,FALSE);
    theEdit.UpdateWindow();

    Danke fürs Benutzen Deines (biologischen) MFC-Enzyklopädie Wissen.
    Sollte man noch irgendwie in MSDN integrieren!

    • Als Antwort markiert vcdummie Montag, 19. September 2011 15:03
    Montag, 19. September 2011 15:01

Alle Antworten

  • Was willst Du mit dem Code erreichen.
    Es macht in meinen Augen keinen Sinn GetLineCount zusammen mit SetSel zu verwenden...


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 16. September 2011 08:49
    Moderator
  • Begrenzen der Länge.  (ab ca 10'000 TextLinien ist eine Programmverlangsamung spürbar)
    Ich leite cout, cerr Ausgaben in ein CEditFenster um.

     

     

    Freitag, 16. September 2011 08:57
  • Aber GetLinCount liefert doch gar nicht die Länge des Textes.

    Ich würde es so machen:

     

    void CMyView::OnTimer(UINT nIDEvent)
    {
      CEdit& theEdit = GetEditCtrl();
      int nEndChar = theEdit.GetWindowTextLength() - m_nHistoryDepth;
    
      if (nEndChar>0)
      {
        theEdit.SetSel(0, nEndChar, FALSE);
        theEdit.ReplaceSel("",FALSE);
      }
    }
    

     Die erste Zeile wird dann halt evtl. verstümmelt...

     


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

    Freitag, 16. September 2011 09:43
    Moderator
  • Hm.. GetLineCount(), GetWindowText()

    Mein Test ergibt folgendes:

    - Für theEdit.Clear() ich muss den Text mit GetLineCount() selektionen
    - Für theEdit.ReplaceSel(), es ist wie Du sagst mit GetWindowTextLength()

    bizarr?!

    Das Problem ist in meinem Fall aber theEdit.SetReadOnly(TRUE/FALSE):

    - in ReadOnly Mode: Der selektionierte Text wird nicht gelöscht.

    Ich will in meinem Fenster keine Eingabe erlauben, nur als Ausgabe verwenden.  Ich verstehe nicht wieso ich in ReadOnly Mode kein selektinerten Text löschen kann.

     

    Freitag, 16. September 2011 14:18
  • Dann musst Du vorher ReadOnly aufheben. ReplaceSel, Clear etc. funktionieren nicht im ReadOnly Mode.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 16. September 2011 17:53
    Moderator
  • Ja eben das musste ich durch Testen erst mühsam herausfinden.
    Es ist ja das ReadOnly Mode und nicht WriteProtect Mode.

    MSDN und MFC-Quellcode brachten mich nicht weiter.
    Woher weisst Du im voraus das ReplaceSel, Clear nicht funktionieren?

    Montag, 19. September 2011 07:37
  • Woher weisst Du im voraus das ReplaceSel, Clear nicht funktionieren?

    Nun kommentiere einfach mal Dein SetReadOnly aus und sehe was passiert.

    Wenn Du Deinen kompletten Text löschen möchtest, und danach sieht es für mich aus, dann könntest Du auch

    theEdit.SetSel(0, -1, FALSE);

    verwenden.

    Montag, 19. September 2011 08:04
  • Also Clear geht nicht, bzgl. ReplacseSel/EM_REPLACESEL muss ich mich korrigieren, das geht natürlich.

    Ich weiß nur mit Sicherheit, das WM_PASTE, WM_CUT und WM_CLEAR bei einem Edit-Control mit ES_READONLY nicht funktionieren.

    EM_REPLACESEL hatte ich versehentlich in den gleichen Topf geworfen. Sorry für die Irritation.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    • Als Antwort markiert vcdummie Montag, 19. September 2011 15:02
    Montag, 19. September 2011 13:49
    Moderator
  • Ja, fehlte noch ein UpdateWindow().

    theEdit.ReplaceSel(0,n,FALSE);
    theEdit.UpdateWindow();

    Danke fürs Benutzen Deines (biologischen) MFC-Enzyklopädie Wissen.
    Sollte man noch irgendwie in MSDN integrieren!

    • Als Antwort markiert vcdummie Montag, 19. September 2011 15:03
    Montag, 19. September 2011 15:01
  • Gib einen Kommentar in der MSDN ab oder schreibe eine Korrektur Email. an Microsoft. Diese werden bei berechtigten Themen zu 99% eingearbeitet.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Dienstag, 20. September 2011 08:38
    Moderator