Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо