Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Error: Inkompatible Typen Reguläre Prozedur u Methodenzeiger (https://www.delphipraxis.net/98744-error-inkompatible-typen-regulaere-prozedur-u-methodenzeiger.html)

BlueStarHH 31. Aug 2007 15:12


Error: Inkompatible Typen Reguläre Prozedur u Methodenzeiger
 
Ich habe mir eine eigene Klasse von TList abgeleitet. Dieser möchte ich eine Sortierfunktion hinzufügen. Dazu muss man der vorhandenen TList-Funktion Sort etwas vom Typ TListSortCompare übergeben. Ich bekomme es nicht hin. An der markierten Stelle kommt die Fehlermeldung "Inkompatible Typen: Reguläre Prozedur und Methodenzeiger"

Delphi-Quellcode:
  TMyList = class(TList)
  private
     SortedColumn: Integer;
     function MyListSortCompare(Item1, Item2: Pointer): Integer;
  public
     procedure SortByColumn(Column: Integer);
  end;

procedure TMyList.SortByColumn(Column: Integer);
begin
  SortedColumn := Column;
  Sort(MyListSortCompare); //<-- FEHLER: Inkompatible Typen: Reguläre Prozedur und Methodenzeiger
end;

function TMyList.MyListSortCompare(Item1, Item2: Pointer): Integer;
begin
  result := MachWas(Item1, Item2, SortedColumn);
end;

mkinzler 31. Aug 2007 15:16

Re: Error: Inkompatible Typen Reguläre Prozedur u Methodenze
 
self.Sort()

BlueStarHH 31. Aug 2007 15:18

Re: Error: Inkompatible Typen Reguläre Prozedur u Methodenze
 
Zitat:

Zitat von mkinzler
self.Sort()

Klappt damit nicht, da dies nicht das Problem ist. Meine neue Sort-Methode heißt SortByColum. Daher gibt es da keine Namenskollision.

Apollonius 31. Aug 2007 15:19

Re: Error: Inkompatible Typen Reguläre Prozedur u Methodenze
 
MyListSortCompare muss eine einfache Funktion sein, keine Methode. Deklariere sie also nicht in der Klasse und lasse das TMyList bei der Definition weg.

BlueStarHH 31. Aug 2007 15:22

Re: Error: Inkompatible Typen Reguläre Prozedur u Methodenze
 
Zitat:

Zitat von Apollonius
MyListSortCompare muss eine einfache Funktion sein, keine Methode. Deklariere sie also nicht in der Klasse und lasse das TMyList bei der Definition weg.

Das geht nicht weil ich in MyListSortCompare zugriff auf die Instanzvaribale "SortedColumn" brauche! Wie könnte ich darauf zugrifen, wenn ich MyListSortCompare außerhab der Klasse deklariere?

sirius 31. Aug 2007 15:28

Re: Error: Inkompatible Typen Reguläre Prozedur u Methodenze
 
Was sind denn deine Listenelemente?

BlueStarHH 31. Aug 2007 15:30

Re: Error: Inkompatible Typen Reguläre Prozedur u Methodenze
 
Zitat:

Zitat von sirius
Was sind denn deine Listenelemente?

Selbst erstellte Klassen, abgeleitet von TObject. Meiner Einschätzung nach, sollten die für die Fragestellung jedoch nicht relevant sein.

Apollonius 31. Aug 2007 15:30

Re: Error: Inkompatible Typen Reguläre Prozedur u Methodenze
 
hier gibt es bei den Schweizern Code, um einen Methodenzeiger in einen Funktionszeiger zu konvertieren. Das wäre was du suchst, ABER: Diese Funktion erfordert stdcall, während deine Funktion Register sein muss. Kannst du Assembler (=und dir selbst eine derartige Funktion für register schreiben)? Sonst könnte ich das mal probieren...

BlueStarHH 31. Aug 2007 15:38

Re: Error: Inkompatible Typen Reguläre Prozedur u Methodenze
 
Hi Apollonius,

Assembler kann ich leider gar nicht. Ich wäre Dir also sehr dankbar, wenn Du (oder andere) es mal probieren würden.

sirius 31. Aug 2007 15:40

Re: Error: Inkompatible Typen Reguläre Prozedur u Methodenze
 
Es dürfte reichen deiner Methode ein stdcall anzuhängen.

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(MyListcompare);
  Sort(MyListSortComparef); //<-- FEHLER: Inkompatible Typen: Reguläre Prozedur und Methodenzeiger
  FreeProcinstance(MyListcompareF);
end;

function TMyList.MyListSortCompare(Item1, Item2: Pointer): Integer;
begin
  result := MachWas(Item1, Item2, SortedColumn);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz