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

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

Обрезание текста в MEMO


Страницы:   1 2 3

Ольга ©   (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;


Страницы:   1 2 3

Наверх

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