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-27 15:21:00) [1]

Mirage   (27.10.06 15:00) [52]
а нет, так это я сразу решил, сделал регулярные функции и все ок, просто тему раздули ...


Mirage   (2006-10-27 15:00:00) [2]

>[51] Rule(c) 27-Oct-2006, 14:51
это я про извраты с передачей метода как обычной функции. или ты о другом софте? %-)


Rule   (2006-10-27 14:51:00) [3]

Mirage   (27.10.06 14:49) [50]
это в каком таком смысле ????
неужто шовмессадж - это запредельные потребности от делфи ?


Mirage   (2006-10-27 14:49:00) [4]

>[49] Rule(c) 27-Oct-2006, 14:09
>кстати в продолжении темы
барин, а вы традиционные позы не пробовали? ну зачем Delphi обязательно ставить на голову? %-)


Rule   (2006-10-27 14:09:00) [5]

Ketmar ©   (26.10.06 16:34) [48]
разочароваться во мне ??? да пожалуйста :-) я жениться на тебе не собираюсь ... кстати в продолжении темы, у меня АВ теперь просиходить при такой вот простой операции Dialogs.ShowMessage('1'); через раз, или доэсперементировался или пора делфю сносить ...


Ketmar   (2006-10-26 16:34:00) [6]

>[47] Rule(c) 26-Oct-2006, 16:29
>но я думаю особо это ничего не значит, так как и без этого
>одно время оно у меня работало ...
скажи, что ты так неудачно пошутил, а? ну пожалуйста! не дай мне разочароваться...


Rule   (2006-10-26 16:29:00) [7]

MetalFan ©   (26.10.06 15:44) [45]
но я думаю особо это ничего не значит, так как и без этого одно время оно у меня работало ...


Rule   (2006-10-26 16:24:00) [8]

MetalFan ©   (26.10.06 15:44) [45]
да


MetalFan   (2006-10-26 15:44:00) [9]


> Rule ©   (26.10.06 14:33) [41]
>
> у мну работает эта функция
>

рабтает именно для TObjectList.sort?


Rule   (2006-10-26 15:21:00) [10]

Ketmar ©   (26.10.06 14:57) [43]
доверяй но проверяй, хотя оно мне не нужно, я как сказал ЮЗ в соседней ветке, я перековырял код  и сделал так чтоб он чесался рукой нужной в нужном ухе :-)


Ketmar   (2006-10-26 14:57:00) [11]

>[41] Rule(c) 26-Oct-2006, 14:33
>у мну работает эта функция
а с чего бы ей не работать? сначала привели текст без справки и указания на область применения -- вот и получился бред. теперь -- вполне.


Rule   (2006-10-26 14:33:00) [12]

у мну работает эта функция


Rule   (2006-10-26 14:33:00) [13]

пож опять случайное попадание в регистры ? :-)


Ketmar   (2006-10-26 14:01:00) [14]

>[36] MetalFan(c) 26-Oct-2006, 08:58
>выдержка из хелпа madCollection
молодец. с этого и надо было начинать смотрим внимательно:

>Sometimes you need to give a procedure address in to a
> Windows API
...
>Please note that this works only for *stdcall*methods!
вот теперь всё становится на свои места. а то ты уж меня перепугал совсем -- я думал, madshi свихнулся... %-)


Сергей М.   (2006-10-26 12:43:00) [15]


> MetalFan ©   (25.10.06 15:43) [25]
> попалась интересная функция:


Ее и искать не нужно было, она всегда под рукой - Make/FreeObjectInstance().
По ее образу и подобию до смешного легко и просто сотворить MakeCompareRegularFuncFromCompareMethod().


icWasya   (2006-10-26 11:29:00) [16]

>Rule ©   (25.10.06 13:51) [13]
>тем более это все работало до опредленнного момента

поскольку параметры передаются через регистры, то может оказаться, что в регистрах случайно могут оказаться правильные значения :)


MetalFan   (2006-10-26 10:05:00) [17]

что скажете? по прежнему бред? объясните, почему это не будет работать?
плз, в асме не силен, но интересно!


MetalFan   (2006-10-26 08:58:00) [18]

выдержка из хелпа madCollection

Sometimes you need to give a procedure address in to a Windows API, but you would rather give in a method instead. In such a situation the function "MethodToProcedure" can come in handy. You give in a method address and your current "Self" value and you get a procedure address as the result, which you then can give in to a Windows API.

Please note that this works only for *stdcall* methods! Don't use it for any other calling convention! (But since almost all Windows APIs are stdcall, this should not be a big problem.)

After you don't need the procedure pointer anymore, please free it with "VirtualFree".
function MethodToProcedure (self       : TObject;
                           methodAddr : pointer) : pointer; overload;

function MethodToProcedure (method     : TMethod) : pointer; overload;

Here comes a little example which demonstrates a correct and useful usage of "MethodToProcedure":
unit EnumWindows;

// this unit implements a little class named TEnumWindows, which does nothing
// but enumerate all windows

interface

implementation

uses Windows, SysUtils, madTools;

type
 TEnumWindows = class
 private
   function EnumCallbackMethod(window: dword; lParam: integer) : bool; stdcall;
 public
   constructor Create;
 end;

constructor TEnumWindows.Create;
var EnumCallbackProc : pointer;
begin
 inherited;

 // you must give in a procedure address into EnumWindows
 // if you would give in "@TWindowList.EnumCallbackMethod" your code would crash
 // because methods have an additional hidden "Self" parameter
 // so we need to convert our method to a procedure first
 EnumCallbackProc := MethodToProcedure(Self, @TEnumWindows.EnumCallbackMethod);

 // "EnumCallbackProc" now contains a pointer to a newly allocated procedure
 // which does nothing but jump to our "EnumCallbackMethod" with the correct parameters
 EnumWindows(EnumCallbackProc, 0);

 // don't forget to free the allocated procedure
 VirtualFree(EnumCallbackProc, 0, MEM_RELEASE);
end;

function TEnumWindows.EnumCallbackMethod(window: dword; lParam: integer) : bool; stdcall;
begin
 result := true;

 // do anything with the "window"s you get here...
 [...]
end;

end.


Ketmar   (2006-10-26 01:26:00) [19]

>[33] MetalFan_pda 25-Oct-2006, 23:44
>приведеннный код сперт из библиотеки mad... (madTools.pas)
я считал автора mad'а вменяемым. или ты привёл обломок, который сам по себе "не играет", или даже не знаю, что...


default   (2006-10-26 00:08:00) [20]

кстати вроде как у всех рекордов надо packed ставить, а не у внешнего чтобы всё шло строго друг за другом


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

Наверх

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