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 dien = 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 angebewisst 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 hineinpassenwenn 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 stehtEM_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ücktbtw: 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 nachaber 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ücktDEvent 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 nachOffenbar 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