![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что случается с длинной строкой? [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]и переменная начинает выглядеть очень странно
Человек "не видит" как выглядит переменная.
Ему про это говорит его код.
Наверное код, показывающий как выглядит строка - ошибочный.