Вниз
Скачать: CL | DM;

AnsiString   Найти похожие ветки 

← →
ford ©   (2009-08-24 13:59) [0]

Здравствуйте!
подскажите пожалуйста,
есть 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.


← →
Anatoly Podgoretsky ©   (2009-08-24 14:03) [1]

> ford  (24.08.2009 13:59:00)  [0]

Это ограничение TMemo.Lines


← →
Сергей М. ©   (2009-08-24 14:03) [2]

А что скрывается за многоточием ?


← →
ford ©   (2009-08-24 14:10) [3]


> А что скрывается за многоточием ?

не важно
в строке
Memo1.Lines[i]:=ClearSt(Memo1.Lines[i])
ставил length(Memo1.Lines[i]) и 1024 хотя там больше


> Anatoly Podgoretsky ©   (24.08.09 14:03) [1]

а как обойти не подскажешь??


← →
Сергей М. ©   (2009-08-24 14:13) [4]


> ford ©   (24.08.09 14:10) [3]


> не важно


Да что ты говоришь ?!)

Function ClearSt(src:AnsiString):AnsiString;
Begin
SetLength(src, 1024); // <- это вместо многоточия ты называешь "не важно" ?)
result:=src;
end;


> хотя там больше


"Там" это где ?


← →
Anatoly Podgoretsky ©   (2009-08-24 14:16) [5]

> ford  (24.08.2009 14:10:03)  [3]

Не использовать МЕМО, авторы посчитали, что никто в здравом уме не захочет видеть более 1024 символа в одной строке.


← →
ford ©   (2009-08-24 14:17) [6]


> Сергей М. ©   (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


← →
ford ©   (2009-08-24 14:18) [7]


> Anatoly Podgoretsky ©   (24.08.09 14:16) [5]

шоб их этих авторов :)

придется переписывать всю функцию на Stream  :((


← →
Anatoly Podgoretsky ©   (2009-08-24 14:23) [8]

> ford  (24.08.2009 14:18:07)  [7]

Ты на кого плюешь, на Микрософт плюешь.
Хотя грех не плюнуть.


← →
Сергей М. ©   (2009-08-24 14:23) [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:25) [10]

Интересно зачем нужны строки такой длины в визуальном компоненте?


← →
Сергей М. ©   (2009-08-24 14:30) [11]


> зачем нужны строки такой длины в визуальном компоненте?


Это чтобы у юзера был повод поблагодарить автора за предоставленную возможность от души наелозится мышью по скроллбарам той самой мемы


← →
ford ©   (2009-08-24 14:30) [12]


> Anatoly Podgoretsky ©   (24.08.09 14:25) [10]
>
> Интересно зачем нужны строки такой длины в визуальном компоненте?
>

я загрузил в Мемо для отладки
RTF фалик применил к нему функцию,
посмотреть чего получиться
а в итоге столкнулся с такой вот бедой


← →
TIF ©   (2009-08-24 14:33) [13]

> Ты на кого плюешь, на Микрософт плюешь.
> Хотя грех не плюнуть.

:)
Это системное ограничение, и правда винить нужно только Microsoft, хотя винить их не за что, правильно сделали, что запрет поставили :) Во всём нужна мера

Открываем блокнот, отключаем "Перенос по словам", впечатываем 1024 символа (то бишь ровно 1 Килобайт), а 1025 перенесётся на новую строку


← →
TIF ©   (2009-08-24 14:34) [14]

> посмотреть чего получиться

> Открываем блокнот, отключаем "Перенос по словам", впечатываем 1024 символа (то бишь ровно 1 Килобайт),
>а 1025 перенесётся на новую строку

WordWrap нас спасёт?


← →
Leonid Troyanovsky ©   (2009-08-24 14:44) [15]


> Сергей М. ©   (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.


← →
Anatoly Podgoretsky ©   (2009-08-24 14:46) [16]

> Leonid Troyanovsky  (24.08.2009 14:44:15)  [15]

RICHEDIT позже писался и они уже успели повстречаться с ненормальными.


← →
Сергей М. ©   (2009-08-24 14:46) [17]


> Leonid Troyanovsky ©   (24.08.09 14:44) [15]


> Для убеждения надо SendMessage


А это дом.задание автору - заглянуть в исходники TMemoStrings)



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.49 MB
Время: 0.012 c
4-1219915857
sniknik
2008-08-28 13:30
2009.10.25
Как узнать кем стартуется сервис...


2-1251403436
LSE
2009-08-28 00:03
2009.10.25
ScanLine


2-1251965130
ford
2009-09-03 12:05
2009.10.25
TWebBrowser список ссылок ячейки таблицы


2-1251711913
Tinky
2009-08-31 13:45
2009.10.25
Проверить integer на вхождение во множество


2-1250691718
DimDim
2009-08-19 18:21
2009.10.25
Сохранение в ini




   Наверх