![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Самопроизвольное? изменение переданных параметров [D6, WinXP]
perov © (2002-07-15 08:45:00)Имеется такой участок кода
procedure PlChangeSQL(var AQuery: TOraQuery; ANewSQL: string; const par: array of const);
var
i: Integer;
begin
with AQuery do begin
if Prepared then UnPrepare;
if Active then Close;
SQL.Clear;
SQL.Add(ANewSQL);
до строкиSQL.Clearзначение par[1].vAnsiString, то что действительно передавалось.
После выполненияSQL.Clearменяется на случайное.
Значение par[0].vAnsiString не меняется.
Что здесь неправильного?
perov (2002-07-16 05:28:00) [1]to Vorobyev S
Правильно :)
to all
array of const всю информацию (кроме целых чисел и символа) хранит в виде указателей. и между моментов формирования array of const (он формируется динамически) и моментом его использования, объекты, на которые он ссылается уже могут не существовать (что и было в моем случае), поэтому вызов SQL.Clear мог перераспределить память, колторуу ранее занимали объекты, на которые ссылается array of const
Vorobyev S (2002-07-15 15:17:00) [2]Возможно твоя проблема связана с динамическим выделением памяти... Трудно сказать не видя кода...
Проверьвсе указатели и как выделяется памятьдля объектов (в том числе и массивов) с помощью New() или Object.Create() или же Malloc, SetLength() и т.п.
У меня была похожая проблема, никак не мог понятькак изменение данных в одних объектах влияет на другие переменные..
Оказалось, что для переменных (использовались указатели) неправильно выделялась память, в итоге области памяти перекрывались..
Думаю все, что написал, понятно :-)
perov (2002-07-15 13:22:00) [3]Параметры запроса хранятся в свойстве param.
При вызове метода Clear "меняется" содержимое par[1].vAnsiString.
par описан как array of const и к свойтсву params типа TParams не имеет никакого отношения.
sniknik (2002-07-15 13:06:00) [4]Clear очищает текст запроса, как он может повлиять на другие переменные?????
посмотри как установлено свойство ParamCheck, если true то при любом изменении текста запроса будут переопределятся параметры.
perov (2002-07-15 10:43:00) [5]Clear очищает текст запроса, как он может повлиять на другие переменные?????
par - это массив параметров, а не свойство params
и как свойство SQL может что-то знать об окружающем его мире за пределами объекта, который это свойство содержит?
par[1].vansistring содержит указатель на строку, которая формируется динамически , причем anewsql ничто об этом не знает, но создается впечатление, что par[1].vansistring ссылается на область памяти, занятой AQuery.SQL
вызов происходит так
PlChangeSQL(qry999, sql, par);
par формируется следующим образом:
...
AddElementOpenArray(["nam", edtFAM.Text + "%"], par);
...
где
procedure AddElementOpenArray(args: array of const; var Res: TArrayofConst);
var
i, j: Integer;
begin
i := High(res) + 1;
SetLength(Res, High(Res)+ 1 + High(Args) + 1);
for j := 0 to High(Args) do begin
Res[i] := Args[j];
Inc(i);
end;
end;
Desdechado (2002-07-15 10:38:00) [6]естественно. после Clear очищается список параметров. он же потом генерируется заново при появлении SQL.
jonik pegas (2002-07-15 10:30:00) [7]А ты чего ожидал после Clear-a?. Он сбрасывает свои параметры после изменения SQl запроса. Присвой значения параметра после.
Anatoly Podgoretsky (2002-07-15 10:29:00) [8]Это намек, что бы ты привел содержимое ANewSQL и par
perov (2002-07-15 10:29:00) [9]par содержит пары элементов - имя, значение
и на данном участке кода par и sql никаким образом не связаны да и не могут иметь общих точек соприкосновения...
есть в par[1] будет Integer то все нормально.
тут дело в чем-то другом....
yozhik (2002-07-15 10:24:00) [10]возможно в строке ANewSQL нет второго параметра, поэтому он и меняется на случайное значение