RichEdit will nicht



  • 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 hinein

    wenn 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


  • Mod

    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 wert

    bei
    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 😃 >>.


  • Mod

    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^^.


Anmelden zum Antworten