![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
AV при выполнении метода TObjectList.Sort
Rule © (2006-10-25 13:36:00)не пойму почему выходит AV, сам AV происходит в процедуре сортировки, значит вызываю процедуру таким образом Columns.Sort(dmCommon.MethodAddress('ComparePosColumnsObjects'));
сама прцедруа сортировки такова
function TdmCommon.ComparePosColumnsObjects(Item1,
Item2: Pointer): Integer;
begin
Result := TEntityColumn(Item1).Pos-TEntityColumn(Item2).Pos
end;
трассировка показала, что TEntityColumn(Item1).Pos - нормальный, а TEntityColumn(Item2).Pos - недоступное значение ...
я думал что в списке есть указатели на несуществующие объекты, но перед вызовом сортировки непосредственно (перед Columns.Sort(dmCommon.MethodAddress('ComparePosColumnsObjects'));) я написал вот такой код
for i:= 0 to Columns.Count-1 do Dialogs.ShowMessage(IntToStr(TEntityColumn(Columns[i]).Pos));
и он отработал нормально, значит несуществующих объектов у меня нет ....
подскажите куда ещё можно копать
ЗЫ: код работал нормально вроде, хотя у меня уже сомнения по этому поводу ... но в этой части кода я не ковырял вообще ....
спасибо всем за внимание ...
Rule (2006-10-25 13:51:00) [41]тем более это все работало до опредленнного момента
Rule (2006-10-25 13:51:00) [42]Сергей М. © (25.10.06 13:49) [10]
я не имел ввиду разница в определении, я имел в виду раница в данном случае ...
Rule (2006-10-25 13:51:00) [43]Джо © (25.10.06 13:49) [8]
Метод:
TObj = class
procedure X (A,B: Integer);
end;
При его вызове, фактически будет помещено в стек: Self,A,B.
помоему в стек ложится так Self,B,A а обратно берется в обратном порядке тоесть A,B,Self, что ни в коем случае не должно мешать ...
Сергей М. (2006-10-25 13:49:00) [44]
> Rule © (25.10.06 13:48) [7]
> в чем разница
Сейчас будет портация в "Начинающие".
Rule (2006-10-25 13:49:00) [45]Джо © (25.10.06 13:47) [6]
это я то понимаю :-)))) но как он портит картину, функция возвращает просто число, в вычислении оно тут не учавствует, или ты имеешь ввиду что там в списке параметров присутствует Селф, который невидно и он портит всю малину ???
Джо (2006-10-25 13:49:00) [46]Метод:
TObj = classПри его вызове, фактически будет помещено в стек: Self,A,B.
procedure X (A,B: Integer);
end;
Регулярная процедура:
procedure X (A,B: Integer);
При ее вызове в стек будет помещено A,B.
Но это детали. А главное: [1],[2].
Rule (2006-10-25 13:48:00) [47]Сергей М. © (25.10.06 13:40) [2]
Джо © (25.10.06 13:39) [1]
а в чем разница между регулярной функцией в данном случае и функциональным методом ??????
вот код примера из справки делфи
function CompareNames(Item1, Item2: Pointer): Integer;
begin
Result := CompareText((Item1 as TComponent).Name, (Item2 as TComponent).Name);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
List1.Sort(@CompareText);
end;
передается адрес функции, какя разница если я передам адресс метода ????
Джо (2006-10-25 13:47:00) [48]> [5] Rule © (25.10.06 13:46)
> Джо © (25.10.06 13:40) [3]
> где Self ????
Это неявный параметр, который передается в методы объектов.
Rule (2006-10-25 13:46:00) [49]Джо © (25.10.06 13:40) [3]
где Self ????
Сергей М. (2006-10-25 13:41:00) [50]Т.е. погнали в "Начинающие"
Джо (2006-10-25 13:40:00) [51]Ну, и, соответственно, неявный параметр Self портит всю малину остальным, следующим за ним, параметрам :)
Сергей М. (2006-10-25 13:40:00) [52]Параметром метода TList.Sort д.б. адрес регулярной функции, а не адрес функционального метода.
Джо (2006-10-25 13:39:00) [53]Не знаю (и не указано), что такое есть Columns, но — TObjectList.Sort'у нужно передавать адрес регулярной процедуры, а не метода.