was mach ich hier falsch?



  • Hi
    mal eine frage, wenn ich den code habe:

    n = SendMessage(FHandle, EM_LINELENGTH, i, 0);
    
            zeichen = new char(n);
    
            SendMessage(FHandle, EM_GETLINE, i, (LPARAM)zeichen);
    
            str = zeichen;
    
            delete zeichen;
    

    dann meldet er immer eine zugriffsverletzung bei dem delete zeichen
    wieso ?
    zeichen brauch ich doch nicht mehr, die buchstaben wurden in str übernommen
    und zeichen müsst ich schon deleten oder ?

    Edit: mit malloc und free funkz, wieso nicht mit new und delete ?



  • zeichen = new char(n);

    das müsste so heissen

    zeichen = new char[n];

    Eckige Klammern! Keine runden!
    Versuch mal obs daran lag.



  • ... und die dann auch beim delete nicht vergessen 😉



  • Außerdem...

    TCHAR * zeichen = new TCHAR[n+1]
    

    da n den 0-terminator nicht einschließt (die Doku ist leider ungenau, da wäre ich lieber vorsichtig)

    Und der Wechsel zu TCHAR macht das ganze auch noch UNICODE-fähig.



  • thx thx 🙂



  • mal noch eine frage:
    ich hab ein multiline edit control
    wieso gibt mir die

    n = SendMessage(FHandle, EM_LINELENGTH, i, 0);
    

    andauernd die selbe zahl zurück, egal welche zahl ich für i mache (welche zeile ich angebe)
    sogar für i = 10, also weit mehr als zeilen da sind im control gib der mir die zeichenanzahl der ersten zeile wieder
    in der SDK steht wenn wParam grösser als die anzahl der zeilen, liefern EM_LINELENGTH 0 zurück, tut es aber nicht !

    EM_GETLINECOUNT gibt mir die aktuelle zeilenzahl wieder...
    und GET_LINE funkt auch, es gibt mir die zeichen der zeile wieder die ich angebe

    wisst ihr da ein rat ?



  • i steht nicht für die Zeile, sondern für das Zeichen.



  • das ergibt keinen sinn, in der sdk steht:

    EM_LINELENGTH Message

    The EM_LINELENGTH message retrieves the length, in characters, of a line in an edit control.

    ...
    ...

    Return Value

    For multiline edit controls, the return value is the length, in TCHARs, of the line specified by the wParam parameter. For ANSI text, this is the number of bytes; for Unicode text, this is the number of characters. It does not include the carriage-return character at the end of the line.



  • Wer lesen kann, ...

    Aus derselben Quelle:

    wParam
    Specifies the character index of a character in the line whose length is to be retrieved. If this parameter is greater than the number of characters in the control, the return value is zero.

    Wenn du also zehn angibst, erhältst du die Länge der Zeile, in der das zehnte Zeichen steht.



  • hä wozu soll das den gut sein?

    kann ich kein englisch mehr

    The EM_LINELENGTH message retrieves the length, in characters,of a line in an edit control

    heist doch: das diese message die länge, in zeichen, von einer zeile in einem edit control zurückgibt

    aber das erklärt trotzdem nicht wieso ich für _jedes_ i eine zeichenanzahl der ersten zeile erhalte 😕



  • DEvent schrieb:

    aber das erklärt trotzdem nicht wieso ich für _jedes_ i eine zeichenanzahl der ersten zeile erhalte 😕

    Das hat doch MFK gerade erklärt! Im wParam gibst du nicht die Zeile an, sondern den character index. EM_LINEINDEX sollte dir helfen, diesen herauszufinden 🙂



  • @DEvent: Wohl ein bisschen schwer von K.P., was? Fänd ich auch super, wenn man da den LineIndex angeben könnte. Aber das geht nicht so. Stattdessen muss man halt einen Buchstabenindex angeben. Der erste Buchstabe in deinem Control hat den Index 0, der zweite den Index 1 usw. Jedes Zeichen in deinem Control hat also einen Index. Wenn du jetzt für i 100 angibst, dann nimmt er sich das 100ste Zeichen im Control, findet heraus, in welcher Zeile dieses Zeichen steht und gibt dir die Länge der Zeile zurück.



  • hääääääää
    wozu soll den das gut sein?

    ich will die anzahl der zeichen die in einer bestimmten zeile stehen
    damit ich den buffer so reservieren kann das alle hineinpassen

    wenn z.b. 1 zeile 10 zeichen, 2 zeile auch 10 zeichen
    woher soll ich wissen, das die msg jetzt die länge der zeile 1 oder der zeile 2 zurückgibt ?
    gut ich mach index = 11, dann weis ich das die msg die 2weite zeile zurückgibt,
    später hat der benutzer das fenster vergrössert, es passen jetzt 20 zeichen in eine zeile, ich mach wieder index = 11, das gibt mir 20 zurück, aber ich denke (das programm) das es die zweite zeile ist
    also wie kann ich das bitte unterscheiden?

    sorry wenn ich jetzt mich schwer von begriff gebe, aber
    in der sdk steht

    EM_LINELENGTH = Zeilenlänge
    The EM_LINELENGTH message retrieves the length, in characters, of a line in an edit control.
    Die message gibt die länge der zeile zurück in characters.



  • Du brauchst das nicht 50 mal zu wiederholen. Wir wissen's jetzt und wusstens auch vorher. Außerdem: du begehst einen Denkfehler. Die Message gibt dir nicht zurück, wieviele Zeichen in eine Zeile passen, sondern wieviele Zeichen bereits darin stehen.
    Um die Länge einer Zeile mit dem Zeilen-Index n zu bekommen, benutzt du erst EM_LINEINDEX, um den Zeichen-Index des ersten Buchstabens in der gemeinten Zeile zu bekommen. Dann kannst du EM_LINELENGTH benutzen.

    P.S.: Auf der MSDN-Seite zu EM_LINELENGTH steht sogar noch ganz unten bei "see also" EM_LINEINDEX. Da sollte man immer schauen, wenn man ein wenig rumbrowst, um das richtige zu finden. Hilft einem öfter mal weiter.



  • wie soll ich den bitte schön wissen?
    woher soll ich wissen ob zeichenindex xx jetzt in der y-zeile ist?

    wenn der beutzer das fenster vergrösert und mein edit sich der gröse anpasst, ist es ein ganz anderer index (oder wenn der user die schriftgrösse ändert)

    und ausserdem wars kein denkfehler, ich wollte wieviel zeichen drinner stehen
    hab mich vieleicht etwas ungeschickt ausgedrückt

    btw: sag mir pls wenn ich das englische falsch übersetze
    wenn ich sehen, das die msg mir bereits die länge der zeile zurückgibt, dann les ich doch net unter einer komischen msg lineindex nach

    aber der koment sollte wohl an die sdk schreiber von m$ gehen

    und wozu so blöde? wieso kann man net jede zeile über ein index ansprechen, macht imho mehr sinn



  • Hast du's denn jetzt hinbekommen?



  • DEvent schrieb:

    wie soll ich den bitte schön wissen?
    woher soll ich wissen ob zeichenindex xx jetzt in der y-zeile ist?

    Also eigentlich geht das aus "Specifies the character index of a character in the line whose length is to be retrieved." ganz klar hervor :p

    DEvent schrieb:

    wenn der beutzer das fenster vergrösert und mein edit sich der gröse anpasst, ist es ein ganz anderer index (oder wenn der user die schriftgrösse ändert)

    Dazu gibt es ja dann EM_LINEINDEX 😉

    und ausserdem wars kein denkfehler, ich wollte wieviel zeichen drinner stehen
    hab mich vieleicht etwas ungeschickt ausgedrückt

    DEvent schrieb:

    btw: sag mir pls wenn ich das englische falsch übersetze
    wenn ich sehen, das die msg mir bereits die länge der zeile zurückgibt, dann les ich doch net unter einer komischen msg lineindex nach

    Offenbar scheint dem so zu sein - außerdem solltest du zumindest wenn du Probleme bekommst die Seite mal zu Ende lesen 🙂

    DEvent schrieb:

    und wozu so blöde? wieso kann man net jede zeile über ein index ansprechen, macht imho mehr sinn

    Ich könnte mir vorstellen, dass die Zeilenlänge z.B. so untersucht wird, dass die Anzahl der Zeichen zwischen zwei \r\n gezählt werden.
    Und um den Index zu einer Zeile zu ermitteln muss eben jedes Zeichen durchgegangen werden - nicht besonders schnell. Deshalb hat man die zwei Messages getrennt, damit der User, der den Index schon weiß diesen Nachteil nicht hat. Aber es ist doch hoffentlich nicht zuviel verlangt, wenn du zwei Messages hintereinander senden musst 🙄



  • ja ok jetzt habs ich kapiert
    thx 😃


Anmelden zum Antworten