AutoComplete
-
Hast Du? Glaube ich nicht.
Suche auf www.codeproject.com und Du findest ein komplettes ATL/WTL Sample.
-
Martin Richter schrieb:
Hast Du? Glaube ich nicht.
Suche auf www.codeproject.com und Du findest ein komplettes ATL/WTL Sample.Vielen Dank. Hab die Seite gefunden, durchgelesen und das Demo Prject heruntergeladen. Das sieht ja schon richtig gut aus.
Doch leider kapier ich das mit dem IEnumString nicht ganz in dem so wie ich das verstanden habe die Strings gespeichert sind, die dann nacher beim AutoComplete verwendet werden sollen.
Es würde mich freuen wenn ihr mir da noch ein paar weitere Hilfen geben könntet
MFG Tim
-
Ich bin jetzt so weit gekommen, dass ich es geschafft habe, dass im Autocomplete die Windows Verzeichnisse auftauchen. Doch wie kriege ich da meine eigenen Strings rein, in der MSDN steht wieder etwas von IEnumString.
Weis einer wie ich das unten abändern muss damit meine eigenen Strings auftauchen, z.B Apfel, Banane usw.
Code wie er bis jetzt aussieht:
#include <shlobj.h> IAutoComplete *pac; CoCreateInstance(CLSID_AutoComplete, NULL, CLSCTX_INPROC_SERVER, IID_IAutoComplete, (LPVOID*)&pac); IUnknown *punkSource; CoCreateInstance(CLSID_ACListISF, NULL, CLSCTX_INPROC_SERVER, IID_IACList, (LPVOID*)&punkSource); IACList2 *pal2; if (SUCCEEDED(punkSource->QueryInterface(IID_IACList2, (LPVOID*)&pal2))) { pal2->SetOptions(ACLO_FILESYSONLY); pal2->Release(); } pac->Init(eingabefeld, punkSource, NULL, NULL); IAutoComplete2 *pac2; if (SUCCEEDED(pac->QueryInterface(IID_IAutoComplete2, (LPVOID*)&pac2))) { pac2->SetOptions(ACO_AUTOSUGGEST); pac2->Release(); } pac->Release(); punkSource->Release();Bitte helft mir dabei ich sitz da schon seit Tagen dran.:(
MFG Tim
-
Guck dir mal diesen Artikel und den Sourcecode davon an, das müsste helfen

-
Ich vermute mal du meinst das:
// // IEnumString implementation // STDMETHODIMP Next(ULONG celt, LPOLESTR* rgelt, ULONG* pceltFetched) { HRESULT hr = S_FALSE; if (!celt) celt = 1; for (ULONG i = 0; i < celt; i++) { if (m_nCurrentElement == (ULONG)m_asList.GetSize()) break; rgelt[i] = (LPWSTR)::CoTaskMemAlloc((ULONG) sizeof(WCHAR) * (m_asList[m_nCurrentElement].GetLength() + 1)); lstrcpy(rgelt[i], m_asList[m_nCurrentElement]); if (pceltFetched) *pceltFetched++; m_nCurrentElement++; } if (i == celt) hr = S_OK; return hr; } STDMETHODIMP Skip(ULONG celt) { m_nCurrentElement += celt; if (m_nCurrentElement > (ULONG)m_asList.GetSize()) m_nCurrentElement = 0; return S_OK; } STDMETHODIMP Reset(void) { m_nCurrentElement = 0; return S_OK; } STDMETHODIMP Clone(IEnumString** ppenum) { if (!ppenum) return E_POINTER; CCustomAutoComplete* pnew = new CCustomAutoComplete(); pnew->AddRef(); *ppenum = pnew; return S_OK; }muss ich das einfach nur in meinem Code einbauen?
Sorry das ich soviel frage aber ich bin auf dem Gebiet echt neu.
MFG Tim
-
Man kann die Grundlagen von COM nicht einfach an solch einem komplexen Sample veranschaulichen...
Zudem hast Du ein komplettes Sample..
-
Ich hab das jetzt so gemacht. doch ich bekomme immer die Fehlermeldung: error C2065: 'thEnum': nichtdeklarierter Bezeichner obwohl ich thEnum doch eigendlich deklariert habe?
#include <atlcom.h> typedef CComEnum< IEnumString, &IID_IEnumString, LPOLESTR, _Copy<LPOLESTR> > CComEnumStringAbstract; typedef CComObject<CComEnumStringAbstract> CComEnumString; IAutoComplete *pac; CoCreateInstance(CLSID_AutoComplete, NULL, CLSCTX_INPROC_SERVER, IID_IAutoComplete, (LPVOID*)&pac); CComEnumString * thEnumObj = NULL; HRESULT as = CComEnumString::CreateInstance(&thEnumObj); if(FAILED(as)) CComPtr<CComEnumString> thEnum(thEnumObj); LPOLESTR strings[] = {L"One", L"Two", L"Three", NULL}; hr = thEnum->Init(&strings[0], &strings[3], NULL, AtlFlagCopy); IUnknown* ppEnum; as = thEnum->QueryInterface( __uuidof(IUnknown), (void**)ppEnum);MFG Tim
-
Ich Esel das lag natürlich an dem if... das da noch rumschwirte...
der code funktioniert leider immer noch nicht...
Bitte kann mir jemand helfen?typedef CComEnum< IEnumString, &IID_IEnumString, LPOLESTR, _Copy<LPOLESTR> > CComEnumStringAbstract; typedef CComObject<CComEnumStringAbstract> CComEnumString; CComEnumString * thEnumObj = NULL; HRESULT hr1 = CComEnumString::CreateInstance(&thEnumObj); if(FAILED(hr)) return hr; CComPtr<CComEnumString> thEnum(thEnumObj); LPOLESTR strings[] = {L"One", L"Two", L"Three", NULL}; hr1 = thEnum->Init(&strings[0], &strings[3], NULL, AtlFlagCopy); IUnknown* ppEnum; hr1 = thEnum->QueryInterface( __uuidof(IUnknown), (void**)ppEnum); IAutoComplete *pac; CoCreateInstance(CLSID_AutoComplete, NULL, CLSCTX_INPROC_SERVER, IID_IAutoComplete, (LPVOID*)&pac); pac->Init(eingabefeld, ppEnum, NULL, NULL); IAutoComplete2 *pac2; if (SUCCEEDED(pac->QueryInterface(IID_IAutoComplete2, (LPVOID*)&pac2))) { pac2->SetOptions(ACO_AUTOSUGGEST); pac2->Release(); } pac->Release(); ppEnum->Release();
-
Kann mir da keiner helfen? Oder mir vielleicht einen Beispielcode schreiben wie ich ein Autocomplete auf ein Editfeld kriege? Das wäre doch auch was für die FAQ?
MFG Tim
-
Ok es hat jetzt mit dem Beispiel auf Codeproject geklappt. Vielen Dank für eure Hilfe.
Mfg Tim