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

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

Что случается с длинной строкой? [D7, WinXP]


Aleksandr. ©   (2004-10-18 13:33:00) 

Строковая переменная имеет длину 1104 знака. К ней прибавляется строковый результат функции длиной 3088 знака - и переменная начинает выглядеть очень странно - на каком-то месте то, что в ней должно было быть, обрывается, и начинается всякий мусор в виде #0 и обрывков разных строковых значений. Что это такое и как это лечить?


Erik1   (2004-10-18 14:21:00) [1]

Evaluate\Modify показывает слишом много, больше длины строки. Для теста используй ShowMessage(myStr).


Aleksandr.   (2004-10-18 14:05:00) [2]

Reindeer Moss Eater © :
Выглядит она так через Evaluate\Modify, не придирайтесь к словам.

AlexG © :
Вообще, я написал, что строковая. Ну, если Вам о чем-то скажет:

function TRiFilterList.GetFilterStr: string;
var
 i : integer;
 b : boolean;
begin
 Result:='';
 if Count=0 then
   Result:=''
 else begin
   for i:=0 to Count-1 do begin
     if i>0 then
       Result:=Result+' '+Items[i].CompareStr;
     if Items[i].FieldName<>'' then begin
       if Result<>'' then begin
         if FLightFilter then
           Result:=Result+' '+Items[i].FilterStrAsArray
         else
           Result:=Result+' '+Items[i].FilterStr
       end
       else begin
         if FLightFilter then
           Result:=Items[i].FilterStrAsArray
         else
           Result:=Items[i].FilterStr
       end
     end;
     if Assigned(Items[i].Items) then begin
       b:=Items[i].Items.FLightFilter;
       Items[i].Items.FLightFilter:=FLightFilter;
       if Result='' then
           Result:='('+Items[i].Items.GetFilterStr+')'
       else
         Result:=Result+' ('+Items[i].Items.GetFilterStr+')';
       Items[i].Items.FLightFilter:=b
     end
   end
 end
end;

function TRIFilterItem.GetFilterStr: string;
begin
 Result:=FieldName+' '+SignStr+' '+ValuesStr
end;

function TRIFilterItem.GetFilterStrAsArray: string;
var
 s,t,x : string;
 i     : integer;
 aSign : TRiFilterSigns;
begin
 Result:='';
 s:=ValuesStr;
 aSign:=Sign;
 if aSign=fsIs then
   Result:=FieldName+' = '+s
 else if aSign IN [fsIN,fsNOTIN,fsLike,fsNotLike,fsLikeLeft,fsLikeRight] then begin
   s:=ReplaceString('(','',s);
   s:=ReplaceString(')','',s);
   if aSign IN [fsIn {,fsLike} ] then
     x:='='
   else if aSign IN [fsNotIn] then
     x:='<>'
   else
     x:=' '+RiFilterSigns[Ord(aSign)]+' ';
   while s<>'' do begin
     if Pos(',',s)<>0 then begin
       if NOT InQuotes(s,Pos(',',s),i) then begin
         t:=Trim(System.Copy(s,1,Pos(',',s)-1));
         System.Delete(s,1,Pos(',',s))
       end
       else begin
         t:=Trim(Copy(s,1,i));
         System.Delete(s,1,i)
       end
     end
     else begin
       t:=Trim(s);
       s:=''
     end;
     if Result='' then
       Result:='('+FieldName+x+t
     else begin
       if x='=' then
         Result:=Result+' OR '+FieldName+x+t
       else
         Result:=Result+' AND '+FieldName+x+t
     end
   end;
   Result:=Result+')'
 end
 else
   Result:=FilterStr
end;

Смысл в том, что список итемов, значениями которых может быть условие или опять же список итемов, должен возвращаться либо в виде FieldName IN (1,2,3) либо в виде (FieldName=1) OR (FieldName=2) OR (FieldName=3), так как всякие долбаные ClientDataSet не понимают в своем фильтре слов IN, NOT IN. Впрочем, суть не в этом.
Как видите, все идет через строку, а вышеупомянутый мусор появляется в итоге выполнения

  if FLightFilter then
    Result:=Result+' '+Items[i].FilterStrAsArray


AlexG   (2004-10-18 13:46:00) [3]

Скажи точнее о чем ты говоришь, т.к. здесь не ясно используешь ты pchar или string. А так же не ясно ЧТО ты присваиваешь. Может ты мусор и присваиваешь... Приведи пример кода.


Reindeer Moss Eater   (2004-10-18 13:45:00) [4]

и переменная начинает выглядеть очень странно

Человек "не видит" как выглядит переменная.
Ему про это говорит его код.
Наверное код, показывающий как выглядит строка - ошибочный.


Наверх

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