- // For some reason, Watcom in WIN386 mode crashes in the CB_FINDSTRINGEXACT message.
- // Do it the long way instead.
- char buf[512];
- for (int i = 0; i < Number(); i++)
- {
- int len = (int)SendMessage((HWND) GetHWND(), CB_GETLBTEXT, i, (LPARAM)(LPSTR)buf);
- buf[len] = 0;
- if (strcmp(buf, (const char *)s) == 0)
- return i;
- }
- return -1;
-#else
- int pos = (int)SendMessage((HWND) GetHWND(), CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)(LPSTR)(const char *)s);
- if (pos == LB_ERR)
- return -1;
- else
- return pos;
-#endif
+ // For some reason, Watcom in WIN386 mode crashes in the CB_FINDSTRINGEXACT message.
+ // wxChoice::Do it the long way instead.
+ int count = GetCount();
+ for ( int i = 0; i < count; i++ )
+ {
+ // as CB_FINDSTRINGEXACT is case insensitive, be case insensitive too
+ if ( GetString(i).IsSameAs(s, FALSE) )
+ return i;
+ }
+
+ return wxNOT_FOUND;
+#else // !Watcom
+ int pos = (int)SendMessage(GetHwnd(), CB_FINDSTRINGEXACT,
+ (WPARAM)-1, (LPARAM)s.c_str());
+
+ return pos == LB_ERR ? wxNOT_FOUND : pos;
+#endif // Watcom/!Watcom
+}
+
+void wxChoice::SetString(int n, const wxString& s)
+{
+ wxCHECK_RET( n >= 0 && n < GetCount(),
+ wxT("invalid item index in wxChoice::SetString") );
+
+ // we have to delete and add back the string as there is no way to change a
+ // string in place
+
+ // we need to preserve the client data
+ void *data;
+ if ( m_clientDataItemsType != wxClientData_None )
+ {
+ data = DoGetItemClientData(n);
+ }
+ else // no client data
+ {
+ data = NULL;
+ }
+
+ ::SendMessage(GetHwnd(), CB_DELETESTRING, n, 0);
+ ::SendMessage(GetHwnd(), CB_INSERTSTRING, n, (LPARAM)s.c_str() );
+
+ if ( data )
+ {
+ DoSetItemClientData(n, data);
+ }
+ //else: it's already NULL by default