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

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

AV при выполнении метода TObjectList.Sort


Страницы:   1 2 3

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
 procedure X (A,B: Integer);
end;
При его вызове, фактически будет помещено в стек: Self,A,B.

Регулярная процедура:
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'у нужно передавать адрес регулярной процедуры, а не метода.


Страницы:   1 2 3

Наверх

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