RichEdit will nicht
-
CodeFinder schrieb:
Hey das hört sich echt gut an...war das jetzt ein ja ?
^^#gg
solange keiner lacht weil er meint es besser zu koennen {und was auch gut moeglich ist}CodeFinder schrieb:
Dann solltest Du eine Kopie erstellen (C-String) und die Kopie übergeben, da const_cast's auf C++ Strings böse enden können.
hei gute idee - werd ich gleich morgen versuchen #gg
CodeFinder schrieb:
// CHARRANGE Search; // Search.cpMin = uiAt; // Search.cpMax = -1; FINDTEXTEX text; // text.chrg = Search; text.chrg.cpMin = uiAt; text.chrg.cpMax = -1; // ...aaaaaaaaaaah, so ist das gemeint, die anderen structs sind da schon bei {=
hier mal die beispielklasse zu checkboxes:
*wegedit*
hat wie man erwarten kann hier und da seine eigenarten - zb das die Font einfach nur ueber ein unsigned int laeuft - und sonst welche sachen die ich so implementiert habe da ich es so immer benutz
List Control und Treeview usw ist natuerlich laenger - klarnu aber nicht haun #gg
-
nu aber nicht haun #gg
Ach quatsch wieso denn
. Ich könnte Dir jetzt ne Liste mit Fehlern machen^^ (die zum Teil auch gravierend sind^^) aber ich will Dich ja nicht demotivieren
.Jo also wenn ok, dann: cpp [minus] coding [at] arcor [punkt] de

-
schreib mir ruhig deine meinung an mr.evil.evl@gmx.net - hab nichts dagegen diverse sachen auszubessern {= danke {=
-
ich hab dir ne mail geschrieben - waere schoen wenn wir uns darueber dann austauschen
zurueck zu dem anderen problem wegen den suchen
ich habs das jetzt so:
long CRichedit::FindString(DString strName, unsigned int uiAt) const{ FINDTEXTEX text; text.lpstrText = const_cast<LPTSTR>(strName.c_str()); text.chrg.cpMin = uiAt; text.chrg.cpMax = -1; ::SendMessage(m_Handle, EM_FINDTEXTEX, 0, reinterpret_cast<LPARAM>(&text)); return text.chrgText.cpMin; }cpMin ist immer -1
GetLastError gibt hier "5" zurueck - wahrscheinlich da dieses EM_FINDTEXTEX kein GetLastError unterstuetzt, zumindest steht nichts in der MSDN
dort steht aber:If there are no more matches, the return value is –1.und ich bekomm ja immer -1
dazuedit: nachdem ich die "commdlg.h" eingebunden habe und FR_DOWN verwende funktioniert es !! {=
long CRichedit::FindString(DString strName, unsigned int uiAt) const{ FINDTEXTEX text; text.lpstrText = &strName[0]; text.chrg.cpMin = uiAt; text.chrg.cpMax = -1; ::SendMessage(m_Handle, EM_FINDTEXTEX, FR_DOWN, reinterpret_cast<LPARAM>(&text)); return text.chrgText.cpMin; }
-
was anderes:
warum funktioniert das nicht, ich bekomm nie etwas zurueck:
DString CRichedit::GetActLine() const{ unsigned int pos = (GetActLinePos()-1); long leng = (GetLineLenght(pos)+1); TCHAR *line = new TCHAR[leng]; ::SecureZeroMemory(line, leng); ::SendMessage(m_Handle, EM_GETLINE, pos, reinterpret_cast<LPARAM>(line)); delete [] line; return _T(""); }get last error sagt gar nichts
wenn ich
TCHAR[200] mache holt er die zeile aber ohne abschliessendes \0 - ist dann "das ist die zeileXXXXXXXXXXXXXXX"
wenn ich TCHAR[200] mit \0 deklariere schreibt er nichts hineinwenn ich "SecureZeroMemory" weg lasse, sind hinter der zeile IMMER noch andere ungewollte zeichen , und dann knallts bei delete
mit SecureZeroMemory knallts nirgends aber ich erhalte auch kein string }=//dazuedit:
bei dieser variante knallts anders:
DString CRichedit::GetActLine() const{ unsigned int pos = (GetActLinePos()-1); long leng = (GetLineLenght(pos)+(sizeof(TCHAR)*2)); TCHAR *line = new TCHAR[leng]; ::SendMessage(m_Handle, EM_GETLINE, pos, reinterpret_cast<LPARAM>(line)); line[leng] = _T('\0'); delete [] line; return _T(""); }"wrote to memory after heap"
im debugger sieht alles genau richtig aus
-
Sag mal: Hast Du es schon mal mit lesen probiert?

1. Aus der EM_GETLINE Doku:
Pointer to the buffer that receives a copy of the line. Before sending the message, set the first word of this buffer to the size, in TCHARs, of the buffer. For ANSI text, this is the number of bytes; for Unicode text, this is the number of characters. The size in the first word is overwritten by the copied line.Ist doch logisch, dass Dir das Ding nicht initialisiert um die Ohren fliegt bzw. bei 0 nichts liefert!
TCHAR *line = new TCHAR[leng]; *reinterpret_cast<WORD*>(line) = leng;2. Es steht nichts in der Doku, dass der String 0 terminert wäre.
Du erhälst die Länge als return Ergebnis:leng = ::SendMessage(m_Handle, EM_GETLINE, pos, reinterpret_cast<LPARAM>(line)); line[leng] = _T('\0');
-
*reinterpret_cast<WORD*>(line) = leng;das hab ich ja noch nie gesehen, hatte das zwar gelesen in der MSDN aber nicht kapiert
DString CRichedit::GetActLine() const{ unsigned int pos = (GetActLinePos()-1); long leng = (GetLineLenght(pos)+(sizeof(TCHAR)*2)); TCHAR *line = new TCHAR[leng]; SecureZeroMemory(line, leng); *reinterpret_cast<WORD*>(line) = static_cast<WORD>(leng); leng = ::SendMessage(m_Handle, EM_GETLINE, pos, reinterpret_cast<LPARAM>(line)); line[leng] = _T('\0'); delete [] line; return _T(""); }knallt trotzdem bei delete mit der meldung "wrote to memory after heap"
die laenge ist aber definitiv korrekt, das zweite leng braeuchte ich gar nicht holen da es oben bei "GetLineLenght" direkt schon geholt wird, also ist die ganze zeit ein unveraenderter wertbei
long leng = (GetLineLenght(pos)+(sizeof(TCHAR)*2));
knallts und bei
long leng = (GetLineLenght(pos)+(sizeof(TCHAR)*3));
nicht, versteh ich nicht, denn an der letzten stelle wird doch nie was geschrieben
-
Martin Richter schrieb:
line[leng] = _T('\0');Sollte da nicht einfach = 0 reichen ? 0 ist doch 0
.
@Mr Evil:
Dann siehts so aus, als würde etwas mit 'GetLineLenght' nicht stimmen.PS: Jo danke hab Deine Mail bekommen. Werd mich noch zurückmelden!
-
CodeFinder schrieb:
line[leng] = _T('\0');
Sollte da nicht einfach = 0 reichen ? 0 ist doch 0
.ich mach auch immer \0 - das hatte ich damals so gelernt - war allerdings bei C, das \0 bedeutete immer null-terminierung
CodeFinder schrieb:
@Mr Evil:
Dann siehts so aus, als würde etwas mit 'GetLineLenght' nicht stimmen.tatsaechlich, ich hab das mal mit diversen zeilen durchdebuggt, es lag daran das er "anscheinend" immer von der select position aus ging, ich hab das so gemacht das ich zu begin der funktion die alte selection merke, alles deselektiere, die laenge hole und dann wieder die alte selection drueber - hab ich eigentlich immer gemacht wenn ich es fuer eine funktion die selektierungen aendern muss
-
Mr Evil schrieb:
CodeFinder schrieb:
line[leng] = _T('\0');
Sollte da nicht einfach = 0 reichen ? 0 ist doch 0
.ich mach auch immer \0 - das hatte ich damals so gelernt - war allerdings bei C, das \0 bedeutete immer null-terminierung
Jo ist ja auch nicht falsch, nur überflüssig
.PS: <<Sie haben Post
>>.
-
Ich bin ein Fan von Code bei dem man erkennt, dass wir es hier mit Zeichen und strings zu tun haben.
Deshalb finde ich es sogar lesbarer:line[leng] = _T('\0');
-
Martin Richter schrieb:
Deshalb finde ich es sogar lesbarer:
Ok ok, akzeptiert^^.