![]() |
[dcc64 Fehler] ProgrammInfo.pas(272): E2009 Inkompatible Typen: 'Methodenzeiger und r
Hallo zusammen,
bin neu hier im Forum und habe folgendes Problem : Beim erstellen meines Programms bekomme ich diese Fehlermeldung : [dcc64 Fehler] ProgrammInfo.pas(272): E2009 Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur' Ich habe auch schon im Forum gesucht aber keine Erklärung für diesen Fehler gefunden, vielleicht auch nicht richtig verstanden was dort erklärt wurde. Hier mal mein Programm welches aus zwei Units und einem Formular besteht. In der Unit Start gibt es ein Menu mit dem Menüpunkt Programminfo. In der Unit Programminfo wird auf dem Form1 ein Stringgrid erzeugt. Diesem StringGrid möchte ich unter OnDrawCell die Procedure FrawCellsgPI zuweisen. Dabei kommt dann die Fehlermeldung.
Delphi-Quellcode:
Kennt jemand dafür eine Lösung bzw. kann mir genau erklären wo mein Problem liegt ?
unit Start;
interface uses Winapi.Windows, Winapi.Messages, ... type TForm1 = class(TForm) MainMenu1 : TMainMenu; procedure ProgramminfoClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; implementation uses ProgrammInfo; {$R *.dfm} procedure TForm1.ProgramminfoClick(Sender: TObject); begin ProgramminfoClick2(Sender); end; // ################################################# unit ProgrammInfo; interface uses Winapi.Windows, Winapi.Messages, ... procedure DrawCellsgPI(Sender: tobject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); procedure ProgramminfoClick2(Sender: TObject); implementation uses Start; procedure DrawCellsgPI(Sender: tobject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var textformat : cardinal; celltext : string; myDrawRect : TRect; begin with (Sender as TStringGrid) do begin ... end; end; procedure ProgramminfoClick2(Sender: TObject); var sgPI : TStringGrid; // StringGrid für ProgrammInfo begin sgPI := TStringGrid.Create(nil); sgPI.Parent := Form1; sgPI.ondrawcell := DrawCellsgPI; // !!! Hier ist der Fehler !!! sgPI.FixedCols := 0; sgPI.FixedRows := 1; sgPI.FixedColor := clActiveBorder; sgPI.Height := 678; sgPI.Left := 420; sgPI.Top := 235; sgPI.Width := 1480; ... end; Vielen Dank im Vorraus für Eure Hilfe |
Dieses Thema wurde am "30. Jan 2019, 11:54 Uhr" von "Luckie" aus dem Forum "Programmieren allgemein" in das Forum "Object-Pascal / Delphi-Language" verschoben.
|
AW: [dcc64 Fehler] ProgrammInfo.pas(272): E2009 Inkompatible Typen: 'Methodenzeiger u
Zitat:
Zitat:
Delphi-Quellcode:
Code enthält die Code-Adresse der Methode, Data die Addresse des Objektes, zu dem die Methode gehört. Es gibt noch einen weiteren Unterschied zwischen standalone-Prozeduren und Objekt-Methoden: letztere haben einen zusätzlichen Parameter, der nicht in der Deklaration genannt wird, nämlich Self, in dem der Compiler bei einem Aufruf der Methode die Addresse des Objektes übergibt, dessen Methode aufgerufen wird.
TMethod = record
Code, Data: Pointer; end; Deine DrawCellsgPI-Prozedur ist also nicht kompatibel mit der Signatur eines event handlers für OnDrawCell. Wenn Du also den Kode zur Anzeige deiner Programminfo aus der Formklasse heraushalten willst (ein durchaus lobenswertes Vorhaben :wink:) mußt Du DrawCellsgPI mit den Erwartungen des Compilers kompatibel machen. Dafür gibt es zwei prinzipielle Ansätze: 1. Mach aus der Prozedur eine public class method einer Klasse, z. B.
Delphi-Quellcode:
Eine class method (so sie denn nicht als static deklariert wurde) hat auch einen impliziten Self-Parameter, die Signatur passt also.
type
TProgrammInfo = class public class procedure DrawCellsgPI(Sender: tobject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); end; ... sgPI.ondrawcell := TProgrammInfo.DrawCellsgPI; 2. Trickse den Compiler aus. Dazu mußt Du die Deklaration von DrawCellsgPI so ändern:
Delphi-Quellcode:
Die Zuweisung des Eventhanders ist dann etwas aufwendiger aber machbar:
procedure DrawCellsgPI(Self, Sender: tobject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
Delphi-Quellcode:
Option 1 ist meiner Meinung nach die bessere Variante, da Du in dieser Helferklasse ja noch mehr Code bündeln kannst.
var
sgPI : TStringGrid; // StringGrid für ProgrammInfo M : TMethod; begin sgPI := TStringGrid.Create(nil); sgPI.Parent := Form1; M.Code := @DrawCellsgPI; M.Data := nil; sgPI.ondrawcell := TDrawCellEvent(M); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:19 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