2016-07-08 21 views
1

Die MFC CComboBox ermöglicht einer Person, eine AddString einer leeren Zeichenfolge zu tun. Ich habe das gerade bewiesen, indem ich eine GetCount() vor und nach der AddString; Count war 0, dann wurde es 1; und die GUI scheint es auch zu reflektieren, da ihre Liste eine riesige leere Box war, und wenn sie hinzugefügt wurde, wurde sie ein Einzeiler.CComboBox FindString leer

Ich bewies es auch weiter durch

  int a = m_combo.GetCount(); 
      CString sx= _T("Not empty string"); 
      if(a == 1) 
       m_combo.GetLBText(0, sx); 

      TRACE(_T("Start<%s>End"), sx); 

und das Ausgabefenster zeigt

File.cpp(9) : atlTraceGeneral - Start<>End 

so schließen wir die sx Variable leer zu tun ist.

Dann mache ich ein FindString eine CString m_name Variable hat, die leer ist:

int idx= m_combo.FindString(-1, m_name); 

Und es gibt CB_ERR!

Ist das Standardverhalten für leere String-Einträge? Die offizielle Dokumentation sagt nichts dazu!

Wenn ja, was ist der einfachste Weg, um es zu überschreiben? Gibt es einen Parameter oder eine Änderung in den Ressourcen, um das Verhalten zu ändern? Wenn nicht, denke ich darüber nach, eine Klasse abzuleiten oder zu erstellen, nur für den Fall, dass die Zeichenkette leer ist!

+0

Ein Kombinationsfeld ist ein benutzerdefinierbares Steuerelement. Was ist der Anwendungsfall, um eine leere (unsichtbare) Zeichenfolge beim Benutzer zu werfen? Präventives Downvote, weil es keine praktische Programmierfrage ist. – IInspectable

+2

Sehen Sie, wenn 'FindStringExact' tut, was Sie wollen. 'FindString' sucht nach einem Element, das mit * dem angegebenen String beginnt - was nicht wirklich Sinn ergibt, wenn der angegebene String leer ist. –

+1

@IgorTandetnik: Ich habe mit 'FindStringExact' getestet und es hat das gleiche Verhalten; Es gibt auch 'CB_ERR' zurück. Wie auch immer, Update zu deinem Kommentar, weil du der Dokumentation mehr Beachtung schenkst als mir. Es funktioniert genau so, wie Sie es beschrieben haben: 'FindString' stimmt mit Einträgen überein, die mit dem Präfix beginnen, das als String-Parameter für den Funktionsaufruf eingegeben wurde; 'FindStringExact' stimmt mit Einträgen überein, die dem eingegebenen Parameter entsprechen. – sergiol

Antwort

1

Ich habe es manuell für die leere Zeichenfolge und es funktioniert!

CString sItem; 
int idx_aux= CB_ERR; 

// need it because FindString, FindStringExact and SelectSring return CB_ERR when we provide an empty string to them! 

if(m_name.IsEmpty()) 
{ 
    for (int i=0; i<m_combo.GetCount(); i++) 
    { 
     m_combo.GetLBText(i, sItem); 

     if(sItem.IsEmpty()) 
     { 
      idx_aux= i; 
      break; 
     } 
    } 
} 
else 
    idx_aux= m_combo.FindString(-1, m_name);