![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обрезание текста в MEMO
Ольга © (2005-07-04 13:45:00)Пишу текст в MEMO стандартными методами:
Memo1.Clear;
Некий цикл
Memo1.Lines.Add('кусок текста');
Конец цикла
count_lines:=Memo1.Lines.count;
size_text:=length(Memo1.Text);
Периодически, когда 20000>size_text<25000 и 9000>count_lines<10000 (все это приблизительно), последние строки в MEMO не рисуются.
Воспроизвести ситуацию, чтобы понять причину, не могу, т.к. возникает она редко и сама по себе рассасывается, несколько потрепав нервы пользователю.
Не могу понять в чем дело, ограничение у MEMO.Text 64 Kб, мой текст почти в 3 раза меньше... Посоветуйте, где копать?
Digitman (2005-07-04 17:48:00) [21]надеюсь, вся эта твоя байда у пользователя творится в основном треде твоего процесса ...
Ольга (2005-07-04 17:46:00) [22]
> [18]
Так сейчас у меня все работает, как часы, хоть сначала в переменную, хоть сразу в мемо. А ждать, когда это повториться не хочется, тем более, что я работаю только днем, а пользователи круглые сутки.
Ольга (2005-07-04 17:41:00) [23]Полный код слишком громоздкий. То что касается мемо я уже написала в [13]. Приведу еще строку формирования запроса, но думаю это ничего нового не добавит.
with Query1 do
begin
sql.Text:='select * from '+TName+' where '+
' nplan is not null AND (';
for i:=0 to listNum.count-1 do
if i=0
then sql.Text:=sql.Text+' nplan='+listNum[i]
else sql.Text:=sql.Text+' or nplan='+listNum[i];
sql.Text:=sql.Text+') and type='+inttostr(Typ);
sql.text:=sql.text+' and (data BETWEEN :data1 AND :data2)';
t:=DateLast12355-1;
parameters.ParamValues['data1']:=t;
t:=DateLast12355+1;
parameters.ParamValues['data2']:=t;
sql.Text:=sql.Text+' order by nplan, data';
open;
while not eof do
begin
Memo1.Lines.Add(FieldByName('h01').AsString);
Next;
end;
end;
StatusBar1.Panels[1].Text:='строк='+inttostr(Memo1.Lines.count);
StatusBar1.Panels[2].Text:='длина='+inttostr(length(Memo1.Text));
Memo1.Visible:=True;
ANB (2005-07-04 17:34:00) [24]И, это, попробуй сначала в строку сложить, а потом уже ее в мемку кинуть. Заодно можешь вставить проверку на ошибку - переписалось из строки или нет. Если ошибка сохранится, а проверка покажет, что все нормально, значит проблема в чтении из БД.
Имхо, MSSQL + ADO + долгие запросы может не отработать.
ANB (2005-07-04 17:28:00) [25]Полный код приведи.
Ольга (2005-07-04 17:22:00) [26]Тип БД MSSQL
> Digitman ©
ЭТО выполняется БЕЗ исключений. И тем ни менее текст выводится не весь. Возможно не все (изредка, по каким-то причинам) выбирается из БД.
ANB (2005-07-04 17:16:00) [27]
> Ольга (04.07.05 16:23) [13]
- тип БД ?
Digitman (2005-07-04 17:07:00) [28]
> Memo1.Lines.Add('кусок текста');
как только ЭТОвыполнилось БЕЗисключений, считай что 'кусок текста' 100%-но "добавился"
и все твои "выкорутасы" с БД к этому НЕ имеют НИ какого отношения.
Ольга (2005-07-04 16:23:00) [29]Проэкспериментировала:
size_text:=length(Memo1.Lines.Text) дает ~23000
for i:=0 to Memo1.Lines.Count-1 do size_text:=size_text+length(Memo1.Lines[i]) дает ~21000, т.е. даже меньше.
Я уже пытаюсь искать ошибку не в МЕМО. Подробнее распишу конструкцию:
Некий цикл
Memo1.Lines.Add('кусок текста');
Конец цикла
Выглядит это так;
ADOQuery.Open;
While ADOQuery.not eof do
begin
Memo1.Lines.Add('кусок текста');
ADOQuery.Next;
end;
В стандартном режиме запрос выполняется быстро. Но, допустим, случилась какая-нибудь заморочка на сервере БД, и запрос отвалился по таймауту (это объясняет нестабильность ошибки). Тогда у меня вопрос: что прилетит клиенту с сервера (кроме сообщения об ошибке) - урезанная выборка данных или ничего? Я то рассчитываю на последнее. И как можно, не навредив, сымитировать такую ситуацию, чтобы проверить мою гипотезу?
Slym (2005-07-04 15:56:00) [30]А если так:
count_lines:=Memo1.Lines.count;
size_text:=length(Memo1.Lines.Text);
помоему Memo1.Lines.Text и Memo1.Text разные весчи
Ольга (2005-07-04 15:49:00) [31]Я ведь не сама символы считаю:
size_text:=length(Memo1.Text);
Здесь, все переводы строк должны быть уже сосчитаны.
Slym (2005-07-04 15:43:00) [32]А у тебя может так и получается 25000 байт полезного + 20000 байт бесполезных #13#10 + прочие накладные расходы...
вот и близок 64к
Slym (2005-07-04 15:41:00) [33]Какаято несостыковка:
20000>size_text<25000 и 9000>count_lines<10000
count_lines*Length(#13#10) уже 18000-20000 байт!
т.е. у тебя полезного текста 0-5000 байт или всреднем 0.5 байта на строку?
TUser (2005-07-04 15:37:00) [34]> Может дело совсем не в МЕМО?
Точно - см. [2]!
Digitman (2005-07-04 15:37:00) [35]Удалено модератором
Ольга (2005-07-04 15:34:00) [36]
> Memo (со своими маздайными 64к) хорош лишь для заведомо
> коротких файлов
Так я и пишу не более 25К. Может дело совсем не в МЕМО?
P.S.: Digitman, фильтруй базар.
Digitman (2005-07-04 15:23:00) [37]
> Программирую я под ХР, а у части пользователей Win98
на них - на юзеров Маздая - и ориентируйся в дан.случае.
и не забывай, что юзер (маздайный или НТшный) смотреть на твою галиматью размером до и более 64к, в том виде в котором ты ему впрариваешь, не обязан - на то есть ПОЛНОЦЕННЫЕ текстовые редакторы !
а Memo (со своими маздайными 64к) хорош лишь для заведомо коротких файлов, а-ля ini ..
Ольга (2005-07-04 15:10:00) [38]
> врешь.
Хотелось бы понять - где вру...
Программирую я под ХР, а у части пользователей Win98.
Цитирую из хелпа:
Note: Under Win 9x, there is a limit of 64k of text for this control.
Anatoly Podgoretsky (2005-07-04 14:28:00) [39]Ольга (04.07.05 13:45)
Что скажешь про операционную систему?
TUser (2005-07-04 14:21:00) [40]До 100 000 строчек дошел - все рисует. Размер текста - 750Кб.
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
for i:=0 to MaxInt do begin
Memo1.Lines.Add(inttostr(i));
if i mod 117 = 0 then begin
Label1.Caption:=inttostr(length(Memo1.Text));
Application.ProcessMessages;
end;
end;
end;