Autovervollständigung



  • Ich hab ein Problem das ich nicht zu lösen weiß! Vielleicht hat mir einer von euch einen Tip wie man sowas machen könnte!

    Ich habe eine kleine Suchfunktion die auf meine Access-DB zugreift. dort sind Nummern hinterlegt die solch ein Format haben 1234-05-R. Jetzt soll wenn der User 12 eingibt ihm irgendwie alle verfügbaren mit dem Anfang zu Auswahl stehen.
    Ich hoffe das Problem ist ein wenig klar, wie löst man so etwas?



  • SELECT * from table where Nummer like '12%'

    So?



  • nein er soll mir ja qausi das auch dann zur Laufzeit wieder ändern, sprich wenn ich 12 eingeb bringt er mir
    1214-05-R
    1225-05-R
    1236-05-R
    1237-05-R,
    geb ich jetzt aber noch die 3 ein soll er nur noch
    1236-05-R
    1237-05-R
    anzeigen!
    Wie wenn ich dem IE ne URL eingebe, die schon mal aufgerufen war, dann zeigt er die erste in der Adresszeile an und die weiteren möglichkeiten mit dem Anfang in einem Pulldown!



  • Wie wärs denn, wenn du den Kram in eine Combobox lädst und die dann nur als Dropdownlistenfeld benutzt?

    Dann springt der so ähnlich nämlich bei Eingaben. Du kennst das aus dem "Neue Klasse" Dialog, da, wo man die Basisklasse wählen kann, das funktioniert auch so.

    🙂



  • wenn ich mein Feld der Combo zuweise, dann habe ich aber dennoch nur den aktuellen Datensatz drin, wie bekomme ich alle Datensätze da rein?
    Aber die Idee 👍



  • Na, du musst das erstmal füllen.

    Bei mir sieht das so aus:

    void CArtikelView::LadeFirmen()
    {
    	CFirmenSet set;
    	set.Open();
    
    	while(!set.IsEOF())
    	{
    		m_cbxHersteller.AddItem(set.GetBezeichnung(), set.GetID());
    		set.MoveNext();
    	}
    
    	set.Close();
    }
    

    AddItem ist eine eigene Funktion, die in einem Schritt den String hinzufügt UND das ItemData setzt, damit ich das später identifizieren kann. 🙂

    int CAdCbx::AddItem(CString f_strText, DWORD f_nData)
    {
    	int nIdx = AddString(f_strText);
    	SetItemData(nIdx, f_nData);
    	return nIdx;
    }
    

    Okay?



  • Mehr oder weniger Okay!

    m_cbxHersteller.AddItem(set.GetBezeichnung(), set.GetID());
    

    Was für ein Typ ist denn die Membervariable m_cbxHersteller, was macht GetBezeichnung im Prinzip mit Sicherheit getFieldValue,
    oder??



  • m_cbxHersteller ist im Prinzip eine CComboBox (eben meine eigene Combobox), also eine Controlvariable.

    Ich arbeite ja irgendwie anders mit den Recordsets als du.
    GetFieldValue nutze ich nirgens direkt. Wenn überhaupt, dann indirekt im DoFieldExchange. 😕
    Ich lasse mir da nur das geben, was im Feld "Bezeichnung" in der aktuellen Zeile drin steht. 🙂



  • Also ich bring das nicht so ganz auf die Reihe, wo muss denn das AddItem stehen? Und sind AddString und SetItemData von dir implementiert? Denke wohl nicht er sagt mir aber undeclared identifier, was für includes hast du denn??
    Ich habe eine Membervariable auf meine Combo gelegt und wenn ich die.addItem mache dann sagt er addItem is not a member of CString



  • Hi,

    du musst die ComboBox auch vom Typ "CComboBox" machen, sonst kannst du nicht die Methoden der ComboBox benutzen.
    Aber es ist kein problem, man kann auf ein Control mehrere Membervariablen legen.

    Du kannst dann auf beide zugreifen:

    UpdateData(false);
    m_strCombo.Replace("a","b");
    m_ctlCombo.AddString("bla");
    

    Du musst dann mit ner Schleife wie estardu schon geschrieben hat nur noch die ComboBox füllen, die Auswahl des Benutzer kannst du dann ganz einfach nach nem UpdateData aus dem CString auslesen.

    mfg
    tobi



  • OK OK stimmt das war richtig, ich hatte nur eín String, hab es jetzt aber auf ein Combo geändert und hab gleiches Problem, addItem ist einfach kein Member von CCombobox.

    Sorry entweder ich steh grad aufm Schlauch oder ich bin einfach zu doof dazu!



  • estartu_de schrieb:

    AddItem ist eine eigene Funktion, die in einem Schritt den String hinzufügt UND das ItemData setzt, damit ich das später identifizieren kann. 🙂

    int CAdCbx::AddItem(CString f_strText, DWORD f_nData)
    {
    	int nIdx = AddString(f_strText);
    	SetItemData(nIdx, f_nData);
    	return nIdx;
    }
    


  • aber wie kann ich denn dann drauf zugreifen? hab es voll nach deinem Schema gemacht,

    m_PCD_CMB.AddItem(getSearchResultPCD());
    

    'AddItem' : is not a member of 'CComboBox'



  • estartu_de schrieb:

    m_cbxHersteller ist im Prinzip eine CComboBox (eben meine eigene Combobox), also eine Controlvariable.

    Heisst nichts anderes, als dass sie eine eigene Klasse von CComboBox abgeleitet hat. Sieht man übrigens auch an dem Quellcode, den ich in meinem letzten Beitrag zitiert habe.

    Bitte in Zukunft die Antworten, die man dir gibt, etwas genauer lesen.



  • OK ihc hatte Gestern anscheinend nicht mehr die Konzentration, als ich mir das heute morgen angeschaut hab, hba ich mir gleich gedacht oh Gott was macht der da! Naja, jetzt hab ich es hin bekommen!

    Tow-B.de schrieb:

    die Auswahl des Benutzer kannst du dann ganz einfach nach nem UpdateData aus dem CString auslesen.

    also wie ich jetzt die Auswahl bekomme ist mir noch nicht ganz klar, kann mir das einer noch mal ganz einfach erklären? Ich hab das jetzt mal so gemacht.

    CDBVariant varValue;
    	UpdateData(TRUE);
    	short nFields = m_pSet->GetODBCFieldCount();
    	for( short index = 0; index < nFields; index++ )
    	          {
    			m_pSet->MoveFirst();
    			while (!m_pSet->IsEOF())
    			{
    				m_pSet->GetFieldValue( index, varValue );
    
    				m_PCD_CMB.AddString(*(varValue.m_pstring));
    
    				m_pSet->MoveNext();
    			}
    		}
    	UpdateData(FALSE);
    
    }
    


  • Du machst einfach zusätzlich zur Controlvariablen noch eine Wertevariable (CString) an die Combobox.



  • wie mach ich die bitte an die Combobox? Denn im DataExchange kann ich mit

    DDX_CBIndex(pDX, IDC_COMBO1, m_test);
    

    eine int Variable anlegen, aber wie mache ich eine String Variable? So wie ich das mache geht das glaub net!



  • War aber fast richtig, du hast nur das falsche DDX genommen.

    Nimm DDX_TEXT:

    DDX_Text(pDX, IDC_COMBO1, m_test);
    

    Da hast das VC7? Ist das so grausig, dass man sogar DDX von Hand machen muss? *grusel* 😮
    Ich dachte, ich wär blos zu unflexibel dafür... 🙄



  • hm OK ich dachte ich könne jetzt dann einfach den String nehmen in dem ich

    CComboBox * combo;                                                
    	combo = (CComboBox *) GetDlgItem(IDC_COMBO1);
    	m_Selected = combo->GetCurSel();
    	UpdateData(FALSE);
    

    mache, aber da steht dann in m_Selected meinemum Combo assozierten String immer nur so ein doofer Strich drin!

    Wie greif ich jetzt richtig und elegant drauf zu, und ist es sinnig über OnKillFocus das zu machen??



  • Ähm, du hast aber schon ein Tutorial zu Dialogelementen und den Zugriff darauf angeguckt, oder? 😮

    m_Selected ist ein CString? Warum weist du ihm dann bitte eine Zahl zu? 🙄

    m_Selected = combo->GetCurSel();
    

    Mach UpdateData(TRUE); und DANACH steht in dem String der gewählte Text. 🙂
    GetCurSel brauchst du dann nur noch, falls nix ausgewählt ist, als Fehlerüberprüfung - wobei ich vermute, dass dann ein Leerstring geliefert wird.


Anmelden zum Antworten