![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
AnsiString
ford © (2009-08-24 13:59:00)Здравствуйте!
подскажите пожалуйста,
есть Memo у которого есть строка (не одна) длиной более 1024 байт.
но в функцию почему-то, передается не более 1024байта
Function ClearSt(src:AnsiString):AnsiString;
Begin
...
result:=src;
end;
.....
for i:=0 to Memo1.Lines.Count-1 do
Begin
Memo1.Lines[i]:=ClearSt(Memo1.Lines[i])
End;
почему? ведь AnsiString это строка которая размещается динамически в куче и поидее ограничена тока размером оперативки
причем даже если сделать
Length(Memo1.Lines[i]), то на строке длиной 1378 байт функция возвращает 1024.
Сергей М. (2009-08-24 14:46:00) [1]
> Leonid Troyanovsky © (24.08.09 14:44) [15]
> Для убеждения надо SendMessage
А это дом.задание автору - заглянуть в исходники TMemoStrings)
Anatoly Podgoretsky (2009-08-24 14:46:00) [2]> Leonid Troyanovsky (24.08.2009 14:44:15) [15]
RICHEDIT позже писался и они уже успели повстречаться с ненормальными.
Leonid Troyanovsky (2009-08-24 14:44:00) [3]
> Сергей М. © (24.08.09 14:23) [9]
> Убедись сам:
Для убеждения надо SendMessage(Memo1.Handle, EM_REPLACESEL,..)
И длину строки получать также EM_LINELENGTH.
> Anatoly Podgoretsky © (24.08.09 14:23) [8]
> Ты на кого плюешь, на Микрософт плюешь.
Любопытно, что для RICHEDIT макс длина строки 6143,
но и борланды внесли свою лепту - 4096.
--
Regards, LVT.
TIF (2009-08-24 14:34:00) [4]> посмотреть чего получиться
> Открываем блокнот, отключаем "Перенос по словам", впечатываем 1024 символа (то бишь ровно 1 Килобайт),
>а 1025 перенесётся на новую строку
WordWrap нас спасёт?
TIF (2009-08-24 14:33:00) [5]> Ты на кого плюешь, на Микрософт плюешь.
> Хотя грех не плюнуть.
:)
Это системное ограничение, и правда винить нужно только Microsoft, хотя винить их не за что, правильно сделали, что запрет поставили :) Во всём нужна мера
Открываем блокнот, отключаем "Перенос по словам", впечатываем 1024 символа (то бишь ровно 1 Килобайт), а 1025 перенесётся на новую строку
ford (2009-08-24 14:30:00) [6]
> Anatoly Podgoretsky © (24.08.09 14:25) [10]
>
> Интересно зачем нужны строки такой длины в визуальном компоненте?
>
я загрузил в Мемо для отладки
RTF фалик применил к нему функцию,
посмотреть чего получиться
а в итоге столкнулся с такой вот бедой
Сергей М. (2009-08-24 14:30:00) [7]
> зачем нужны строки такой длины в визуальном компоненте?
Это чтобы у юзера был повод поблагодарить автора за предоставленную возможность от души наелозится мышью по скроллбарам той самой мемы
Anatoly Podgoretsky (2009-08-24 14:25:00) [8]Интересно зачем нужны строки такой длины в визуальном компоненте?
Сергей М. (2009-08-24 14:23:00) [9]
> ford © (24.08.09 14:17) [6]
> эту функцию можно вообще убрать
Зачем тогда упоминаешь ее ?
> в Memo1.Lines[1] например хранится строка более 1024
Не может она там храниться, не выдумывай.
Она там вообще не хранится.
И ограничение это не TMemo.Lines, а самой ОС.
Убедись сам:
showmessage(IntToStr(Length(memo.Lines[memo.Lines.Add(StringOfChar('X', 1025))])));
Anatoly Podgoretsky (2009-08-24 14:23:00) [10]> ford (24.08.2009 14:18:07) [7]
Ты на кого плюешь, на Микрософт плюешь.
Хотя грех не плюнуть.
ford (2009-08-24 14:18:00) [11]
> Anatoly Podgoretsky © (24.08.09 14:16) [5]
шоб их этих авторов :)
придется переписывать всю функцию на Stream :((
ford (2009-08-24 14:17:00) [12]
> Сергей М. © (24.08.09 14:13) [4]
эту функцию можно вообще убрать
for i:=0 to Memo1.Lines.Count-1 do
Begin
Label1.Caption:=Label1.Caption+' '+IntToStr(Length(Memo1.Lines[i]));
Memo1.Lines[i]:=ClearSt(Memo1.Lines[i])
End;
так вот, в Label1 длина строк будет не больше 1024
> "Там" это где ?
в Memo1.Lines[1] например хранится строка более 1024
Anatoly Podgoretsky (2009-08-24 14:16:00) [13]> ford (24.08.2009 14:10:03) [3]
Не использовать МЕМО, авторы посчитали, что никто в здравом уме не захочет видеть более 1024 символа в одной строке.
Сергей М. (2009-08-24 14:13:00) [14]
> ford © (24.08.09 14:10) [3]
> не важно
Да что ты говоришь ?!)
Function ClearSt(src:AnsiString):AnsiString;
Begin
SetLength(src, 1024); // <- это вместо многоточия ты называешь "не важно" ?)
result:=src;
end;
> хотя там больше
"Там" это где ?
ford (2009-08-24 14:10:00) [15]
> А что скрывается за многоточием ?
не важно
в строке
Memo1.Lines[i]:=ClearSt(Memo1.Lines[i])
ставил length(Memo1.Lines[i]) и 1024 хотя там больше
> Anatoly Podgoretsky © (24.08.09 14:03) [1]
а как обойти не подскажешь??
Anatoly Podgoretsky (2009-08-24 14:03:00) [16]> ford (24.08.2009 13:59:00) [0]
Это ограничение TMemo.Lines
Сергей М. (2009-08-24 14:03:00) [17]А что скрывается за многоточием ?