![]() |
Re: Error: Inkompatible Typen Reguläre Prozedur u Methodenze
Das klappt so leider auch nicht. Es kommt ein neuer Fehler:
Delphi-Quellcode:
TMyList = class(TList)
private SortedColumn: Integer; function MyListSortCompare(Item1, Item2: Pointer): Integer; stdcall; public procedure SortByColumn(Column: Integer); end; procedure TMyList.SortByColumn(Column: Integer); var MyListComparef:function(Item1,Item2:Pointer):integer; begin SortedColumn := Column; MyListcomparef:=MakeProcInstance(MyListSortCompare); //<-- Fehler: Nicht genügend wirkliche Parameter Sort(MyListSortCompare); FreeProcinstance(MyListcompareF); end; function TMyList.MyListSortCompare(Item1, Item2: Pointer): Integer; begin result := MachWas(Item1, Item2, SortedColumn); end; |
Re: Error: Inkompatible Typen Reguläre Prozedur u Methodenze
Delphi-Quellcode:
TMyList = class(TList)
protected SortedColumn: Integer; public procedure SortByColumn(Column: Integer); end; implementation var _sortlist: TMyList; // globale hilfsvariable // "normale" Funktion function MyListSortCompare(Item1, Item2: Pointer): Integer; begin result := MachWas(Item1, Item2, _sortlist.SortedColumn); end; procedure TMyList.SortByColumn(Column: Integer); begin SortedColumn := Column; _sortlist := self; Sort(MyListSortCompare); end; |
Re: Error: Inkompatible Typen Reguläre Prozedur u Methodenze
... Oder einfach ein QuickSort selber implementieren...
|
Re: Error: Inkompatible Typen Reguläre Prozedur u Methodenze
:gruebel: Das muss auch einfach ohne ASM gehen
Delphi-Quellcode:
Wie weist man nur m eine Methode zu? :gruebel:
procedure TMyList.SortByColumn(Column: Integer);
var MyListComparef:function(Item1,Item2:Pointer):integer; m:Tmethod; begin SortedColumn := Column; asm //m.code:=@MyListCompare (ging leider nur so) push edi mov edi, offset MyListCompare mov m.code,edi pop edi end; m.Data:=self; MyListcomparef:=MakeProcInstance(m); //<-- Fehler: Nicht genügend wirkliche Parameter Sort(MyListSortCompare); FreeProcinstance(MyListcompareF); end; |
Re: Error: Inkompatible Typen Reguläre Prozedur u Methodenze
Zitat:
|
Re: Error: Inkompatible Typen Reguläre Prozedur u Methodenze
Zitat:
Delphi-Quellcode:
Und zum Code "der Schweizer" muss ich sagen: Viel glück unter Systemen mit aktivierter Data Execution Prevention (DEP).
m.Code := @TMyList.MyListCompare;
Delphi-Quellcode:
type
TSortCompareMethod = function(Item1, Item2: Pointer): Integer of object; procedure MQuickSort(SortList: PPointerList; L, R: Integer; SCompare: TSortCompareMethod); var I, J: Integer; P, T: Pointer; begin repeat I := L; J := R; P := SortList^[(L + R) shr 1]; repeat while SCompare(SortList^[I], P) < 0 do Inc(I); while SCompare(SortList^[J], P) > 0 do Dec(J); if I <= J then begin if I <> J then // kleine zusätzliche Optimierung begin T := SortList^[I]; SortList^[I] := SortList^[J]; SortList^[J] := T; end; Inc(I); Dec(J); end; until I > J; if L < J then MQuickSort(SortList, L, J, SCompare); L := I; until I >= R; end; procedure TMyList.Sort(Compare: TListSortCompareMethod); begin if (FList <> nil) and (Count > 0) then MQuickSort(FList, 0, Count - 1, Compare); end; |
Re: Error: Inkompatible Typen Reguläre Prozedur u Methodenze
Zitat:
Ich habe heute auch einen schweren Tag hintermir. Zitat:
![]() Edit: Ich sollte besser ins Bett |
Re: Error: Inkompatible Typen Reguläre Prozedur u Methodenze
Fertig.
Delphi-Quellcode:
Ihr Assemblerkundigen da draußen, nehmt es mal kritisch unter die Lupe.
function MakeListSortMethodProc(Method:TListSortMethod): TListSortCompare;
begin Pointer(result):=VirtualAlloc(0, $0F, MEM_COMMIT, PAGE_EXECUTE_READWRITE); asm //mov ecx, edx mov [eax], $D189 //mov edx, eax mov [eax+$02], $C289 //mov eax, Method.Data mov [eax+$04], $B8 mov ecx, [ebp+$0C] mov [eax+$05], ecx //push Method.Code mov [eax+$09], $68 mov ecx, [ebp+$08] mov [eax+$0A], ecx //ret mov [eax+$0E], $C3 end; end; procedure FreeListSortProc(Proc: TListSortCompare); begin VirtualFree(Pointer(@Proc), 0, MEM_RELEASE); end; [Edit] Zusätzlich zu Sirius' Korrektur nocheinmal 6 Bytes Assemblercode gespart. [/edit] |
Re: Error: Inkompatible Typen Reguläre Prozedur u Methodenze
Zitat:
Also, vorausgesetzt, dein Kommentar passt zu den Opcodes, denn fehlt ein "$C3"=return am Ende. |
Re: Error: Inkompatible Typen Reguläre Prozedur u Methodenze
Tja, sowas kommt davon, sich selbst zu hetzen :( Ist korrigiert.
[edit] Nachtrag zum Thema hetzen: Buchstabendreher kommen auch daher.[/edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz