(Rich)Edit Seltsames verhalten bei einem Zeichen in der Zeile...
-
Hallo...
mir ist bei meiner (Rich)Edit klasse etwas aufgefallen.
vorweg. Ich habe mir mittels winapi eine editklasse erstellt und eine richedit klasse, die ich von der editklasse ableite.in der Editklasse ist mir der fehler noch nicht aufgefallen. da ich zZ mit der Richeditklasse arbeite.
wenn ich mir text zeilenweise aus der richeditklasse mittels EM_LINELENGTH & EM_GETLINE ausgeben lasse, passiert es das wenn nur ein zeichen (egal welches von der tastatur) in einer zeile steht, mir dieses als ein viereck (nicht interpretierbares zeichen) ausgegeben wird. bei keinem zeichen in der zeile bzw. mehr zeichen passt alles wunderbar.
ich wüste jetzt nicht woher der fehler rührt. ich umgehe den feherl momentan, indem ich, wenn mir EM_LINELENGTH 1 zurückgibt, ich die zeilenlänge auf 2 hochsetzte. Jetzt wird mir zwar der zeilenumbruch mit ausgegeben, aber besser als das nicht interpretierbare zeichen.
ich poste mal den code der functionen von EM_LINELENGTH & EM_GETLINE. vielleicht mache ich da ja auch was falsch.
int EXPORT CEditCtrl::LineIndex ( int nLine /*= -1 */) { HWND hWndEdit = GetDlgItem(); return (int)::SendMessage(hWndEdit,EM_LINEINDEX,(WPARAM)nLine,(LPARAM)0); } int EXPORT CEditCtrl::LineLength ( int nLine /*= -1 */) { HWND hWndEdit = this->GetDlgItem(); int iIDX = LineIndex(nLine); return (int)::SendMessage(hWndEdit,EM_LINELENGTH,(WPARAM)iIDX,(LPARAM)0); } int EXPORT CEditCtrl::GetLine ( int nIndex, LPTSTR lpszBuffer ) { HWND hWndEdit = GetDlgItem(); int iLineLength = LineLength(nIndex); //if(iLineLength == 1)iLineLength++; return GetLine(nIndex,lpszBuffer,iLineLength ); } int EXPORT CEditCtrl::GetLine ( int nIndex, LPTSTR lpszBuffer, int nMaxLength ) { HWND hWndEdit = GetDlgItem(); WORD* wptr; wptr = (WORD *)lpszBuffer; wptr[0] = nMaxLength; lpszBuffer[nMaxLength] = 0; return (int)::SendMessage(hWndEdit,EM_GETLINE,(WPARAM)nIndex,(LPARAM)(LPTSTR)lpszBuffer); }
-
Ich tippe mal in Blaue.
1. Du hast ein MBCS Projekt.
2. Du denkst Du hast den String korrekt terminiert hast.
Ist er aber nicht.
Du bekommst ein Zeichen zurück und auf dem zweiten Zeichen ist noch ein Artefakt, der Bufferlänge...Du musst schon beachten was Du zurück bekommst und danach den Buffer an der ricthigen Selle auf 0 setzen.
-
danke für die göttliche eingabe...
*aufdiekniefall*WORD* wptr; wptr = (WORD *)lpszBuffer; wptr[0] = nMaxLength+1; lpszBuffer[nMaxLength+1] = _T('\0'); int iLen = (int)::SendMessage(hWndEdit,EM_GETLINE,(WPARAM)nIndex,(LPARAM)(LPTSTR)lpszBuffer); lpszBuffer[iLen] = _T('\0');
wie oben stehend habe ich es jetzt gemacht und es funzt. ist das ok so oder gibts da noch was auszusetzen...
-
@rT!f@Ct schrieb:
danke für die göttliche eingabe...
*aufdiekniefall*Nicht zuviel der persönlichen Erniedrigung... das schadet dem Selbstbeswusstsein...
WORD* wptr; wptr = (WORD *)lpszBuffer; wptr[0] = nMaxLength+1; lpszBuffer[nMaxLength+1] = _T('\0'); int iLen = (int)::SendMessage(hWndEdit,EM_GETLINE,(WPARAM)nIndex,(LPARAM)(LPTSTR)lpszBuffer); lpszBuffer[iLen] = _T('\0');
wie oben stehend habe ich es jetzt gemacht und es funzt. ist das ok so oder gibts da noch was auszusetzen...
Also stören würde mich nur, dass Du nMaxLength angibst aber nMaxLength+1 benutzt. Gaaaaanz schlechter Stil. Kann ganz schnell zu gaaanz eigentümlichen Effekten führen...
-
ok,
also du meinst bevor ich +1 verwende lieber die variable mit ++ vorher raufsetzten!?nochmal danke für deine hilfe
[EDIT]
was mir aber immernoch verschoßen bleibt...warum macht sich der fehler nur bei einem zeichen in der zeile bemerkbar.
wenn die zeilenlänge 0 war bzw. 2 oder mehr, ist der fehler nicht aufgetreten.
warum
-
Zeichenlänge 0 kann ich Dir nicht sagen.
Ab der Zeichnelänge 2 greift Deine Terminierung zuvor. Dann wird ja alles exakt übertragen und Du hast Deine 0 Terminierung.
Nur bei Län ge 1 wird ein Zeichen übertragen und der String hat ein komisches Zeichen an Stelle 2 und dann Schrott...
-
danke für die erläuterung...
da muss ich wohl noch ein bischen drüber nachdenken...
-
Du müsstest es im Debugger im Memory Window exakt verfolgen können.
-
ohh ja der Debugger... mit dem hab ich mich auch noch nicht so richtig angefreundet...
ich nutze deine TRACE Funktion um ne ablaufverfolgung zu haben....
-
@rT!f@Ct schrieb:
ich nutze deine TRACE Funktion um ne ablaufverfolgung zu haben....
Uhhh. Das wäre mir zu mühsam und viel zu ungenau...
- Breakpoint setzen.
- Memory oder Watsch Window öffnen.
- Variable eintragen und siehe da...
-
Uhhh. Das wäre mir zu mühsam und viel zu ungenau...
mühsam, wem sagst du das....
und das mit dem ungenau... kann ich nicht sagen, kenn das andere ergebniss nicht. jedoch kam ich bisher immer ans gewünschte ziel.
kennst du ein vernünftige tutorial, das einem den debugger ohne selbiges studieren zu müssen näherbringt?