Błąd kompilacji przy podziale kodu na moduły

0

Siema. Refaktoryzuję sobie kod i chciałem wydzielić go na moduły. Moduł mi się kompiluje jednak podczas próby jego dołączenia do innego nie bangla - pluje błędami kompilacji. Możecie powiedzieć gdzie popełniam błąd ?

Moduł załączany.

unit PricingClasses;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;

type
   {Reprezentacja pozycji cennika}
   PricingPosition = record
      nazwa: AnsiString;
      grupa: AnsiString;
      jednostka: AnsiString;
      cenaMin: Currency;
      cenaMax: Currency;
    end;

   p_PricingPosition = ^PricingPosition;

   {Reprezentacja naglowka cennika}
   PricingHeader = record
      data: AnsiString;
      typ: AnsiString;
      id: Integer;
   end;

   p_PricingHeader = ^PricingHeader;

   { TPricing }
   TPricing = class(TObject)
     private
       LPricingPositions : TList;
       Header : PricingHeader;
     public
       constructor Pricing(Positions: TList; NHeader: PricingHeader);
       constructor Pricing(Path: AnsiString);
   end;

implementation

{ TPricing }

constructor TPricing.Pricing(Positions: TList; NHeader: PricingHeader);
begin

end;

constructor TPricing.Pricing(Path: AnsiString);
begin

end;

end. 

Moduł główny

unit MainWin;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, IBConnection, sqldb, DB, BufDataset, memds, FileUtil,
  Forms, Controls, Graphics, Dialogs, DBGrids, Arrow, DBCtrls, StdCtrls,
  ComCtrls, PricingClasses;


  { TBrowseVendors }

  TBrowseVendors = class(TForm)
    Button1: TButton;
    DatasourceVendors: TDatasource;
    DBGrid1: TDBGrid;
    DBGridVendors: TDBGrid;
    VaDBConnection: TIBConnection;
    SQLQueryVendors: TSQLQuery;
    SQLTransaction1: TSQLTransaction;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormShow(Sender: TObject);

    function ParseWGRO(HtmlFile: ansistring): TList;
    procedure CustomizeDBGrid(var Grid : TDBGrid);

  private
    { private declarations }
  public
    { public declarations }
  end;

var
  BrowseVendors: TBrowseVendors;

implementation

{$R *.lfm}
  
.......
                                    
 
0

Nie znam się na FPC. Jedyny błąd jaki zauważyłem i według mnie może powodować problem, to dwa konstruktory o takiej samej nazwie. Ale mogę się mylić, bo być może takie coś w FPC/Lazarusie/nowszych wersjach Delphi jest już dopuszczalne.

EDIT: a jednak pod FPC się mi to skompilowało. Zresztą skąd wiesz, że kod modułu jest na pewno ok. Skoro - o ile wiem - takie rzeczy można stwierdzić dopiero przy próbie kompilacji kiedy się go dołaczy do sekcji uses. Najlepiej jakbyś napisał jaki komunikat/y błędu/ów otrzymujesz. Gdyż za pewne coś jest źle w innym module.

Bo wiesz, z fusów to wróżyć można. Ale (nie)stety Wróżbita Maciej ma od dawna bana na tym forum za spamowanie swoich "konsultacji" na "Skajpaju" ;)

0

To raczej nie to. Fakt, do pascala przesiadłem się z C++ i zawodowo pisze w C++, przez co wale gafy z tego języka, ale to nie to. Sam moduł się kompiluje, poza tym po usunieciu jednego konstruktora nadal ten sam błąd. Przepraszam - nie podałem jego treści

mainwin.pas(15,3) Fatal: Syntax error, "IMPLEMENTATION" expected but "identifier TBROWSEVENDORS" found

1

No i wszystko jasne. Błedny jest jak wynika z komunikatu moduł mainwin.pas. Teraz jak się przyjrzałem to widze, że brakuje słowa kluczowego type przed deklaracją typu TBrowseVendors. Pewnie klepałeś ten moduł ręcznie, zamiast wspomóc się tym, że Lazarus lub IDE Delphi tworzy takie podstawy jak jakiś moduł powiązany z formatką samodzielnie. I jego zarys nazwijmy to jest ok, trzeba tylko sobie pouzupełniać nie psując "bazy" kodu.

Chociaż dziwny trochę ten komunikat. Wiem, że może się zdarzyć, ale nie wiem dlaczego akurat tutaj się zdarzył. Niemniej jednak pod Lazarusem, kiedy dodałem sobie tworzony wcześniej dla FPC myunit.pp z taką treścią jak podałeś dla swojego modułu, zmieniłem mu nazwę na myunit.pas, wrzuciłem do zapisanego projektu i dodałem do sekcji uses w czystym i domyślnym projekcie z jedną formatką Form1 to wszystko skompilowało się prawidłowo. Pomijając warningi.

0

Dzięki. Jeszcze się nie przyzwyczaiłem do tego, że pascal wymaga tylu słówek ;p Kompiluje się wsio.

1
olesio napisał(a)

Jedyny błąd jaki zauważyłem i według mnie może powodować problem, to dwa konstruktory o takiej samej nazwie.

@olesio - dla FPC to nie jest błąd, konstruktory mogą mieć takie same identyfikatory (i nawet pasowałoby, żeby miały takie same, a najlepiej Create), ale muszą się różnić liczbą lub typem parametrów (zasady takie same, jak przy przeładowywaniu procedur/funkcji); Nie muszą być ani wirtualne (chyba że jest potrzeba ich przeciążania w jakiejś klasie dziedziczącej), ani przeładowywane (ręcznie, bo pewnie jest to robione niejawnie, ale pewności nie mam);

Przykład:

type
  TFoo = class(TObject)
  private
    FValue: Integer;
    FState: Boolean;
  public
    constructor Create(AValue: Integer);
    constructor Create(AState: Boolean);
    constructor Create(AValue: Integer; AState: Boolean);
  end;

  constructor TFoo.Create(AValue: Integer);
  begin
    FValue := AValue;
  end;

  constructor TFoo.Create(AState: Boolean);
  begin
    FState := AState;
  end;

  constructor TFoo.Create(AValue: Integer; AState: Boolean);
  begin
    FValue := AValue;
    FState := AState;
  end;

Tego typu rzeczy nie przejdą w Delphi7, błąd:

[Error] XXX.dpr(X): Overloaded procedure 'Create' must be marked with the 'overload' directive

czyli w starym Delphi7 trzeba je przeładować.

1 użytkowników online, w tym zalogowanych: 0, gości: 1