Search code examples
delphi-prismassemblyinfo

Error in the AssemblyInfo file


I get the error "Error 1(E4) "end." or implementation section members (types or methods) expected."

Nowhere on the internet I can find information about this error.

I get this error because of this line of the AssemblyInfo.pas file:

Implementation
    SomeMethod();
end.

I work in Delphi Prism.


Solution

  • That's not valid inside implementation.

    The Pascal (which Delphi Prism is based loosely on) unit consists of a couple of sections. The interface section provides the same functionality as the C/C++ header file; it exposes the public content to users of the code unit.

    The implementation is like the C/C++ source file that the header exposes. It's where you actually implement the content the interface unit made available. Therefore, it should contain the actual code for the methods and functions.

    A quick example (Delphi code, but is pretty similar):

    unit Test.NyClass;
    
    interface
    
    // Defines types and so forth that, if exposed via the proper declaration, can be seen outside
    // this unit simmply by adding this unit to the uses clause of the calling code.
    uses 
      SysUtils;
    
    type
      TMyClass=class(TObject)
        FMyNumber: Integer;     // protected members (no specifier, so defaults to protected)
        FMyString: String;
      private                     
        function GetMyNumber: Integer;    // Getters
        function GetMyString: string;     
        procedure SetMyNumber(const Value: Integer);  // Setters
        procedure SetMyString(const Value: string);
      published
        property MyNumber: Integer read GetMyNumber write SetMyNumber;  // properties exposed to class users
        property MyString: string read GetMyString write SetMyString;
      end;
    
    implementation
    
    // Actually provides the implementation for the getters/setters, any additional methods, 
    // types not needed outside this implementation section, etc.
    
    // Optional uses clause. Add units here you only need access to in the implementation code;
    // this prevents circular references ("Unit A uses Unit B which uses Unit A").
    uses
      SomeOtherUnit;           
    
    // Implementation of the getters and setters declared for the properties above. Outside code
    // can't call these directly (they were declared as private), but they're called automatically
    // when the corresponding property is referenced.
    function TMyClass.GetMyNumber: Integer;
    begin
      Result := FMyNumber;
    end;
    
    function TMyClass.GetMyString: string;
    begin
      Result := FMyString;
    end;
    
    procedure TMyClass.SetMyNumber(const Value: Integer);
    begin
      if FMyNumber <> Value then
        FMyNumber := Value;
    end;
    
    procedure TMyClass.SetMyString(const Value: string);
    begin
      if FMyString <>  Value then
        FMyString := Value;
    end;
    
    // Optional initialization section. This is what your code is probably intending to use (if Prism
    // supports it - don't have it on this machine to check).
    initialization
      // Any necessary loading initialization, etc. Called when the unit is being loaded into memory,
      // so you have to be careful what you're doing here.
    
    // Optional finalization section. This is where you do cleanup of anything  allocated in the
    // initialization section.
    finalization
    
    end.