AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language [dcc64 Fehler] ProgrammInfo.pas(272): E2009 Inkompatible Typen: 'Methodenzeiger und r
Thema durchsuchen
Ansicht
Themen-Optionen

[dcc64 Fehler] ProgrammInfo.pas(272): E2009 Inkompatible Typen: 'Methodenzeiger und r

Ein Thema von BerleFreund · begonnen am 30. Jan 2019 · letzter Beitrag vom 30. Jan 2019
Antwort Antwort
BerleFreund

Registriert seit: 30. Jan 2019
7 Beiträge
 
#1

[dcc64 Fehler] ProgrammInfo.pas(272): E2009 Inkompatible Typen: 'Methodenzeiger und r

  Alt 30. Jan 2019, 10:13
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:
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;
Kennt jemand dafür eine Lösung bzw. kann mir genau erklären wo mein Problem liegt ?

Vielen Dank im Vorraus für Eure Hilfe

Geändert von Luckie (30. Jan 2019 um 10:55 Uhr) Grund: Delphi Tags ergänzt. Bitte selber dran denken.
  Mit Zitat antworten Zitat
30. Jan 2019, 10:54
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.
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: [dcc64 Fehler] ProgrammInfo.pas(272): E2009 Inkompatible Typen: 'Methodenzeiger u

  Alt 30. Jan 2019, 11:54
Zitat:
procedure DrawCellsgPI(Sender: tobject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
DrawCellsgPI ist eine "standalone"-Prozedur, keine Methode eines Objects. Ein Zeiger auf eine solche Prozedur ist ein simpler Pointer mit der Code-Adresse der Prozedure, also sizeof(pointer) groß.

Zitat:
var sgPI : TStringGrid; // StringGrid für ProgrammInfo

begin
sgPI := TStringGrid.Create(nil);
sgPI.Parent := Form1;
sgPI.ondrawcell := DrawCellsgPI; // !!! Hier ist der Fehler !!!
OnDrawCell ist wie alle Events in der VCL eine Methoden-Referenz. Eine Methoden-Referenz ist ein Record aus zwei Pointern, es gibt dafür sogar einen eigenen Typ in der System-Unit:

Delphi-Quellcode:
TMethod = record
    Code, Data: Pointer;
end;
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.

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 ) 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:
type
  TProgrammInfo = class
  public
   class procedure DrawCellsgPI(Sender: tobject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
  end;

...
  sgPI.ondrawcell := TProgrammInfo.DrawCellsgPI;
Eine class method (so sie denn nicht als static deklariert wurde) hat auch einen impliziten Self-Parameter, die Signatur passt also.

2. Trickse den Compiler aus.

Dazu mußt Du die Deklaration von DrawCellsgPI so ändern:
procedure DrawCellsgPI(Self, Sender: tobject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); Die Zuweisung des Eventhanders ist dann etwas aufwendiger aber machbar:

Delphi-Quellcode:
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);
Option 1 ist meiner Meinung nach die bessere Variante, da Du in dieser Helferklasse ja noch mehr Code bündeln kannst.
Peter Below
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:30 Uhr.
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