Delphi Compiler Error
E2009 Incompatible types – ‘%s’
Reason for the Error & Solution
The compiler has detected a difference between the declaration and use of a procedure.
program Produce; type ProcedureParm0 = procedure; stdcall; ProcedureParm1 = procedure(VAR x : Integer); procedure WrongConvention; register; begin end; procedure WrongParms(x, y, z : Integer); begin end; procedure TakesParm0(p : ProcedureParm0); begin end; procedure TakesParm1(p : ProcedureParm1); begin end; begin TakesParm0(WrongConvention); TakesParm1(WrongParms); end.
The call of ‘TakesParm0’ will elicit an error because the type ‘ProcedureParm0’ expects a ‘stdcall’ procedure, whereas ‘WrongConvention’ is declared with the ‘register’ calling convention. Similarly, the call of ‘TakesParm1’ will fail because the parameter lists do not match.
program Solve; type ProcedureParm0 = procedure; stdcall; ProcedureParm1 = procedure(VAR x : Integer); procedure RightConvention; stdcall; begin end; procedure RightParms(VAR x : Integer); begin end; procedure TakesParm0(p : ProcedureParm0); begin end; procedure TakesParm1(p : ProcedureParm1); begin end; begin TakesParm0(RightConvention); TakesParm1(RightParms); end.
The solution to both of these problems is to ensure that the calling convention or the parameter lists matches the declaration.