Форум: "Основная";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];
ВнизЧто случается с длинной строкой? Найти похожие ветки
← →
Aleksandr. (2004-10-18 13:33) [0]Строковая переменная имеет длину 1104 знака. К ней прибавляется строковый результат функции длиной 3088 знака - и переменная начинает выглядеть очень странно - на каком-то месте то, что в ней должно было быть, обрывается, и начинается всякий мусор в виде #0 и обрывков разных строковых значений. Что это такое и как это лечить?
← →
Reindeer Moss Eater © (2004-10-18 13:45) [1]и переменная начинает выглядеть очень странно
Человек "не видит" как выглядит переменная.
Ему про это говорит его код.
Наверное код, показывающий как выглядит строка - ошибочный.
← →
AlexG © (2004-10-18 13:46) [2]Скажи точнее о чем ты говоришь, т.к. здесь не ясно используешь ты pchar или string. А так же не ясно ЧТО ты присваиваешь. Может ты мусор и присваиваешь... Приведи пример кода.
← →
Aleksandr. (2004-10-18 14:05) [3]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
← →
Erik1 © (2004-10-18 14:21) [4]Evaluate\Modify показывает слишом много, больше длины строки. Для теста используй ShowMessage(myStr).
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.03 c