Ausgabe von Daten aus Datenbank in CListCtrl!!!
-
Wahscheinlich sehe ich den Wald nicht vor lauter Bäume, aber bis jetzt ist das so dass ich meine Suchfunktion in der OnInit klasse von einem Fenster, wo eine Liste ist, packe, so dass in der Datenbank gesucht, in der Liste gepackt und erst dann die Liste gezeigt wird...
Nun, wenn man aber nach ein Suchbegriff sucht was sehr oft vorkommt ( > 5000 Ergebnissen) dauert das etwas länger, und es scheint so als wenn sich nichts tun würde (Absturz) so dass ich bevorziehen würde die Liste zuerst anzuzeigen und dann die Daten nacheinander zu zeigen. Wie kann ich das realisieren dass nach der OnInit klasse das Programm nicht auf eine Nachricht wartet (z.B. Enter drücken, oder so was) sondern sofort mit miner Suchfunktion weitermacht???Vielen Dank im voraus...
P.S. Falls alles nicht so verständlich ist einfach bescheid sagen...

-
multithreading
-
Ich würde mal ausprobieren, die Suchfunktion an das Ende von OnPaint() zu packen. Und dann noch ein Flag vorneweg, damit sie nur beim ersten Aufruf ausgeführt wird und nicht bei jedem OnPaint().
[edit] Diese miese Antwort sollte ich wohl lieber löschen, bevor dieser Thread noch mal hoch kommt...
[/edit]
-
danke @all.
Ich werde es mal ausprobieren mit OnPaint und melde mich dann mal...
@Sovok: Was meinst du mit Multithreading?
-
Eine Programm hat eine Messageschleife. Diese wird automatisch ausgeführt und leitet die Nachrichten an die Steuerelemente weiter, welche dann darauf reagieren. So funktioniert Windows. Wenn du jetzt eine Funktion ausführtst dann wird diese Messageschleife nicht aufgerufen solange deine Funktion läuft. Ohne Threads kann ein programm nur eine Codezeile nach der anderen ausführen.
Lösung. Berechnung in Threads auslagern.
-
Danke schön, mit ein Thread hat es funktioniert... Was alles so gibt...
Jetzt muss ich nur noch ein paar Schönheitsfehlern beseitigen...
-
Jetzt hat sich ein neues Problem ergeben...
Ich möchte jetzt die Kunden ,die gesperrt sind rot kennzeichnen...
Ich habe eine Klasse erstellt, die von CListCtrl abgeleitet wird und dort habe ich folgendes gepackt...DrawListCtrl.h
afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult); void SetItemTextColor(int iItem = -1, COLORREF color = RGB(0,0,0), BOOL bRedraw = TRUE);und unter DrawListCtrl.cpp folgendes
void DrawListCtrl::SetItemTextColor(int iItem, COLORREF color, BOOL bRedraw) { aTextColors = color; m_iColorItem = iItem; if (bRedraw) RedrawWindow(); } void DrawListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) { NMLVCUSTOMDRAW* lplvcd = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR ); *pResult = CDRF_DODEFAULT; if ( CDDS_PREPAINT == lplvcd->nmcd.dwDrawStage ) { *pResult = CDRF_NOTIFYITEMDRAW; } else if ( CDDS_ITEMPREPAINT == lplvcd->nmcd.dwDrawStage ) { // if ( (lplvcd->nmcd.dwItemSpec) == m_iColorItem) lplvcd->clrText = aTextColors; *pResult = CDRF_DODEFAULT; } }Hier werden auch andere Änderungen gemacht, die 100%ig funktionieren...
In meinem Thread habe ich jetzt SetItemTextColor aufgerufen:
void TABELLE::thrRun() { while (m_Flag) { cs.Lock(); switch(tabart) { case Zahlung: { ..... } case Kunde: { ... CString anfrage = "SELECT kdnummer, matchcode, kundentyp, name1, name2, plz, ort FROM deduct.kundenstamm_kd"; mysql_query(&DB.mDB,anfrage); CString kdnummer = ""; int markzeile = 0; if ((ergebnis = mysql_use_result(&DB.mDB)) != NULL) { counter = 0; while ((zeile = mysql_fetch_row(ergebnis)) != NULL && merker == FALSE) { for(i = 0; i < mysql_num_fields(ergebnis); i+= 8) { CString zeile3 = zeile[i+3]; if (zeile3 == "") zeile3 = zeile[i+4]; int merk = atoi(zeile[i+7]); if ( merk == 0) m_TE_LISTE.SetItemTextColor(counter,RGB(255,0,0),FALSE); //m_TE_LISTE greift auf DrawListCtrl.cpp zu else m_TE_LISTE.SetItemTextColor(counter,RGB(0,0,0),FALSE); m_TE_LISTE.AddItem( _T(zeile[i]),_T(zeile[i+1]),_T(zeile3),_T(zeile[i+5]),_T(zeile[i+6]),_T(zeile[i+2])); //m_TE_LISTE.AddItem funktioniert... m_TA_Suchergebnis.Format("Suchergebnis: %i Positionen", counter+1); SetDlgItemText(IDC_TA_Suchergebnis,m_TA_Suchergebnis); counter++; } } mysql_free_result(ergebnis); DB.Abmelden(); } break; } } cs.Unlock(); m_Flag = 0; merker = TRUE; GetDlgItem(IDCANCEL)->EnableWindow(TRUE); GetDlgItem(IDOK)->EnableWindow(TRUE); } }Nur dadurch dass es ein extra Thread ist "TABELLE::thrRun()", wird alles entweder durcheinander gezeichnet oder nur Schwarz oder nur Rot...
Kann mir jemand sagen wie ich das lösen kann???Danke schon mal im vor****...
Samuel
-
Habt ihr irgendwas nicht verstanden???
Falls ihr irgendwas nicht verstanden habt, sag bescheid...
Es ist nämlich sehr wichtig...
-
*schieb*
Hilfffeeeeee