Suchfunktion sucht nicht!
-
Hallo liebes Forum,
ich habe (mal wieder) eine Frage. Ich arbeite mich zur Zeit in VC++ --> MFC ein, was mich nicht so leicht fällt. Im Moment schreibe ich an einem kleinen Organizer für mich. Als einfache Übung, dieser ist soweit auch fertig nur bei der Suche hapert es jetzt endgültig.
Ich versuche hier in dem unten gezeigten Source, die CStrings welche in einem Formular eingegeben werden, in ein Array zu schreiben (funktioniert!) danach möchte ich mittels einer Schleife (for) dieses Array durchlaufen und jeden darin enthaltenen String mit einem Vergleichsparameter vergleichen. Sobald ein Parameter gleich dem Vergleichsparameter ist, soll ein Ergebnis in eine Listbox geschrieben werden. - Soweit die Idee.
Mein Problem ist, schon der Vergleich haut nicht hin, sprich ich bekomme zwar keine Fehlermeldungen, auch keine Warnungen. Aber die Listbox bleibt Leer, ganz und gar leer - Nicht in meinem Sinne.
Seltsamerweise werden mir Ergebnisse angezeigt (wenn auch nicht die richtigen, die DB spuckt dann alle Datensätze aus) wenn ich die Zeile:
if(array[i] == Vergleichsparameter)folgendermaßen erweitere:
if(array[i] == Vergleichsparameter || "%")Warum das geschieht ist mir auch noch ein Rätsel, aber nicht das Hauptproblem. Kann mir jemand von euch vielleicht helfen und mir erklären wo im Source mein Fehler liegt???
void CSearchDlg::OnBnClickedSearch() { m_pSet->MoveFirst(); CString Ergebnis="Hab was gefunden!"; CString array[6]; array[0] = m_sNachname; array[1] = m_sTyp; array[2] = m_sCount; array[3] = m_sID; array[4] = m_sBundesland; array[5] = m_sVorname; CListBox* aList = (CListBox*) GetDlgItem( IDC_RESULTS ); aList->ResetContent(); do { int i = 0; for(i<6; i++;) { if(array[i] == Vergleichsparameter) { aList->AddString( Ergebnis ); } } m_pSet->MoveNext(); }while(!m_pSet->IsEOF()); }Danke fürs durchlesen und kopfzerbrechen,
Julian
PS: Sorry für den Themennamen mir ist einfach nichts passendes eingefallen...
____________________________________________IDE: MS Visual Studio .NET 2003 Professional
DB: MS SQL 2008 Express Advanced
OS: MS Windows XP SP3
-
Kann man CStrings denn überhaupt so vergleichen? Bin mir grad nicht sicher, dafür gibts ja eigentlich die Methoden Compare und CompareNoCase...
-
... wie lautet denn die Definition von "Vergleichsparameter"?
-
JulianB schrieb:
Seltsamerweise werden mir Ergebnisse angezeigt (wenn auch nicht die richtigen, die DB spuckt dann alle Datensätze aus) wenn ich die Zeile:
if(array[i] == Vergleichsparameter)folgendermaßen erweitere:
if(array[i] == Vergleichsparameter || "%")Warum das geschieht ist mir auch noch ein Rätsel, aber nicht das Hauptproblem.
Das liegt einfach daran, dass "%" immer wahr ist. Zum Hauptproblem: Was ist Vergleichsparameter?
-
War ja eine schöne Denksportaufgabe...
Du musst schreiben:...
for(;i<6; i++)
...oder gleich
...
for(i = 0; i<6; i++)
...
-
Hallo an alle,
erstmal vielen Dank an euch das ihr euch hier den Kopf mit mir zerbrecht.
"Vergleichsparameter" ist ebenfalls ein CString welcher mit den Daten aus der DB gefüllt wird. Also zum Beispiel:
CString Vergleichsparameter=m_pSet->m_VornameSo im ganz ganz Groben.
_Matze:
CompareNoCase habe ich nun auch schon eingebaut, hat aber nichts geholfen. Ich habe das ungute Gefühl das eigentlich alles Funktioniert aber mein Array garnicht gefüllt wird. Mittlerweile bin ich mal bei CStringArrays angelangt.
Günni99:
Ja Danke, das ist mir kurz vorm Thread lesen dann auch aufgefallen. Hatte mich gewundert warum nie in meine Schleife gesprungen wird. Trotzdem vielen vielen Dank.
MFK:
Okay, ich dachte ich könnte für mich das % als Whitespace für die Suche benutzen. Wusste garnicht das, das Prozentzeichen auch im Code als Whitespace gilt. Schade, aber egal ^^.
So sieht der Code momentan aus:
void CSearchDlg::OnBnClickedSearch() { m_pSet->MoveFirst(); CString Ergebnis="Hab was gefunden!"; CString Equal; CStringArray array; array.Add(m_sVorname); array.Add(m_sSuchbegriff); array.Add(m_sBundesland); array.Add(m_sTyp); array.Add(m_sCount); array.Add(m_sID); CListBox* aList = (CListBox*) GetDlgItem( IDC_RESULTS ); aList->ResetContent(); do { for(int i = 0; i<6; i++) { Equal = array[i]; if(Equal.CompareNoCase(m_pSet->m_Name) != -1) { aList->AddString( Ergebnis ); } } m_pSet->MoveNext(); }while(!m_pSet->IsEOF()); }Die Variablen (z.B. m_sSuchbegriff) sind Membervariablen vom Typ CString.
Ich komme einfach nicht weiter...ABER ich bleibe natürlich dabei, ich will das umbedingt endlich schaffen. Immerhin mein erstes größeres Projekt mit der MFC.
Liebe Grüße,
Julian
-
Dir ist aber klar, dass sich durch MoveNext der Inhalt des CStringArray nicht automatisch aktualisiert? Du vergleichst immer wieder mit dem ersten Datensatz.
-
Hallo MFK,
MFK schrieb:
Dir ist aber klar, dass sich durch MoveNext der Inhalt des CStringArray nicht automatisch aktualisiert? Du vergleichst immer wieder mit dem ersten Datensatz.
??? Ich lese doch nur die Benutzereingaben in mein CStringArray der Inhalt des aktuell durch MoveNext() aufgerufenen Datensatzes vergleiche ich mit dem Inhalt des CStringArrays:
Equal = array[i]; if(Equal.CompareNoCase(m_pSet->m_Name) != -1)Hier lese ich einen CString des CStringArrays in den CString "Equal" und vergleiche ihn mit dem aktuellen Datensatz (m_pSet->m_Name).
Oder ist da ein Denkfehler bei mir???

Liebe Grüße,
Julian
-
Nein, du hast Recht, da hatte ich mich verguckt.
Allerdings gibt CompareNoCase bei Gleichheit 0 zurück. Die Prüfung auf != -1 ist Unsinn.
-
"if(array[i] == Vergleichsparameter)"
war doch korrekt! CStrings haben einen überladenen Vergleichsoperator "==" und deswegen kann man CStrings mit "==" vergleichen....
-
JulianB schrieb:
...Ich habe das ungute Gefühl das eigentlich alles Funktioniert aber mein Array garnicht gefüllt wird...
Bei unguten Gefühlen hilft es oft, sich Gewissheit zu verschaffen, indem man den Debugger nutzt, sich Breakpoints setzt und den Wert von Variablen zur Laufzeit überprüft! Dann kann man fehlerhafte Stellen auch viel schneller (bzw. überhaupt) lokalisieren.
-
Schlag auf Schlag,
ist ja unglaublich wie fix das hier geht ^^. Okay also zurück auf "==" weg von CompareNoCase - (Das mit dem "!= -1" ist peinlich
). Aber mein Problem bleibt bestehen, ich will euch allerdings auch nicht den letzten Nerv rauben! Deswegen einmal die Frage, sieht der Code für euch überhaupt so aus als wenn er funktionierten "könnte"???Liebe Grüße,
Julian
-
Günni99 schrieb:
"if(array[i] == Vergleichsparameter)"
war doch korrekt! CStrings haben einen überladenen Vergleichsoperator "==" und deswegen kann man CStrings mit "==" vergleichen....
Ja, hast Recht. Ich war mir ja auch nicht sicher. Allerdings ist in diesem Fall (Datenbank mit Namen usw.) vielleicht CompareNoCase doch die bessere Wahl, je nachdem von wem und wie gewissenhaft die Datenbank gefüllt wurde.
-
Lass dir doch den Inhalt des Arrays mal in einer MessageBox ausgeben. Vielleicht fehlt da einfach nur ein UpdateData.
-
MFK schrieb:
Lass dir doch den Inhalt des Arrays mal in einer MessageBox ausgeben. Vielleicht fehlt da einfach nur ein UpdateData.
Schlagt mich wenn ihr wollt. MFK hatte recht, das was mir fehlte war das bescheidene UpdateData. Ich hatte es schlichtweg vergessen, alles ist mir aufgefallen aber nicht das.
Sorry, wirklich. Da hätte ich auch selber drauf kommen können. Aber manchmal ist man halt ein wenig vernebelt...
Vielen vielen Dank an euch alle, das mit dem CompareNoCase werde ich mir definitiv zu Herzen nehmen und noch einmal genauer anschauen.
Liebe Grüße und nochmals vielen Dank,
Julian.
-
Und bitte für das nächstemal.
Mache zuerst eine Debug und schaue was an Daten da sind bevor du eine Frage stellst.