Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.10.25;
Скачать: 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 вся ветка

Текущий архив: 2009.10.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.018 c
2-1251721550
AndrewG
2009-08-31 16:25
2009.10.25
Splitter


2-1251984161
LDV
2009-09-03 17:22
2009.10.25
TListBox - Color select item


2-1250066321
kostyl_kostyl
2009-08-12 12:38
2009.10.25
TspClient и TspServever


15-1250852265
partizan
2009-08-21 14:57
2009.10.25
Прочитать документ word


15-1251459961
Наиль
2009-08-28 15:46
2009.10.25
Лишние символы при исполнении bat-файла