TRichEdit und ScrollBars crashen
-
Seit einiger Zeit plagt mich o.g. Problem.
Ich habe eine App mit 3 RichEdits und diese sollen *was sonst* Text wiedergeben.
Soweit so gut. Sobald aber die Scrollbars irgendwie angepackt werden crasht die App nach unbestimmter Zeit. Ich bin auf der Suche nach Abhilfe über folgenden Link gestolpert.http://home.att.net/~robertdunn/Papers/TRichEditHandles.html
Ich denke Dunns Ausführungen unter #problem 2 meinem Problem entsprechen.
Nun habe ich eine TRichEdit-Derivat erzeugt und die besagte RecreateWnd() einfach mal überladen und leer gelassen: Problem besteht aber immer noch.
Hier mal die m.E. relevanten Ausschnitte
TXController* XController ... DWORD WINAPI DisplayThread(LPVOID lpThreadParameter) { BaseController* bc= BaseController::getInstance(); VideoController* vc= VideoController::getInstance(); AudioController* ac= AudioController::getInstance(); stringstream s; while(XController->isRunning) { // BaseController if(XController->cbBCLogging->Checked) { // updating limit counter long limit=XController->reditBC->Text.Length(); s.seekp(0); s<< limit << "/ " << EDIT_LIMIT << ends; XController->eBCLimit->Text= s.str().c_str(); // Autoclear if bufferlimit is reached if (limit>=EDIT_LIMIT) bc->clearOutput(); XController->WriteWindow(bc->getOutput(), XController->reditBC, XController->_bcMutex); } // VideoController if(XController->cbVCLogging->Checked) { ... // analog } // AudioController if(XController->cbACLogging->Checked) { ... // analog } Sleep(25); // rest a while, baby } ExitThread(0); return 0; // never reached: avoid warning } ... void __fastcall TXController::WriteWindow(string text, const TRichEdit* win, HANDLE mutex) { if (text.size()>0) { WaitForSingleObject(mutex, INFINITE); win->Text = text.c_str(); // HERE EVERYTHING IS FUCKED UP // EVEN IF I USE SCROLLBARS MANUALLY win->SelStart = win->Perform(EM_LINEINDEX, win->Lines->Count, 0); win->Perform(EM_SCROLLCARET, 0, 0); ReleaseMutex(mutex); } }Ich gehe auch davon aus, dass bei mir irgendwo der Wurm drin ist...
Die Fehlermeldung(Debugger): "Systemfehler: Code 1400. Ungültiges Fensterhandle"
Das bestätigt letztlich Dunns Schilderungen.Wie kann ich dagegen angehen???
-
Nachtrag:
o.g. Problem habe ich kurze Zeit später behoben, indem ich ---ACHTUNG:
TRichEdit einfach gegen TMemo ausgetauscht habe.
Einziger Zusatz war, dass ich die getOutput()-Rückgabe an die "Zeilenumbruch-Macke" für's TMemo angepasst habe ('\n' zu "\r\n").Was soll ich denn nun davon halten? Habe ich mal wieder irgendwo eine kleine Spitzfindigkeit nicht berücksichtigt, sei es im eigenen Code, irgendeiner VCL-eigenen Geschichte, oder gar etwas in der WINAPI* ??? Ich weiß es nicht.
Es funktioniert jetzt jedenfalls einwandfrei.*Ich habe es sogar gewagt die VCL zu umgehen und in einem MyRichEdit-Derivat die WINAPI direkt zu benutzen: Gleiches Resultat
Hier noch mal der geänderte Code:
btw: void __fastcall TXController::WriteWindow(string text, const TMemo* win :warning: , HANDLE mutex) { if (text.size()>0) { replaceLinefeed(text); :warning: WaitForSingleObject(mutex, INFINITE); // folgende Änderunge sind eher irrelevant win->Text=win->Text + text.c_str(); win->Perform(EM_LINESCROLL,0, win->Lines->Count-1 ); ReleaseMutex(mutex); } }