Results 1 to 5 of 5

Thread: Foutmelding OO programma

  1. #1

    Foutmelding OO programma

    Hoi allemaal,

    Ik heb weer eens een zeer basale vraag, dit keer over
    object georienteerd programmeren. Ik heb onderstaande code van het
    internet gehaald en gecopieerd in mijn Form1 code.

    Maar nu geeft hij een foutmelding. Hij zegt namelijk

    '[Error] Unit1.pas(69): 'Self' is uninitialized. An inherited constructor must be called'

    Weten jullie wat er aan de hand is? Ik heb trouwens Delphi 8. Heeft
    het daarmee te maken? Als het echt veel werk is laat maar zitten hoor.
    Maar volgens mij kan het niet echt moeilijk zijn. Ik heb trouwens regel 69 aangegeven.


    Alvast heel erg bedankt,

    Vinny

    Code:
    // Full Unit code.
     // -----------------------------------------------------------
     // You must store this code in a unit called Unit1 with a form
     // called Form1 that has an OnCreate event called FormCreate.
     
     unit Unit1;
     
     interface
     
     uses
       Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
       Dialogs;
     
     type
       // Define a Ball class
       TBall = class
       protected
         ballSize  : Byte;
         ballSpeed : Byte;
       published
         procedure   Kick(power : Byte); virtual;
         function    GetSpeed : Byte;
         constructor Create(size : Byte);
       end;
     
       // Define a specialised ball
       TFootball = class(TBall)
       private
         ballPanels : Byte;
       published
         // Now we override the TBall kick method to take into account
         // the number of panels of the ball
         procedure   Kick(power : Byte); virtual;
         // Different constructor - must pass panels now
         constructor Create(size : Byte; panels : Byte);
       end;
     
       // definition of the form this unit uses
       TForm1 = class(TForm)
         procedure FormCreate(Sender: TObject);
       private
         { Private declarations }
       public
         { Public declarations }
       end;
     
     var
       Form1: TForm1;
     
     implementation
     
     {$R *.dfm}
     
     // Ball method implementations
     procedure TBall.Kick(power : Byte);
     begin
       ballSpeed := (power * ballSize) DIV 4;
     end;
     
     function TBall.GetSpeed : Byte;
     begin
       Result := ballSpeed;
     end;
     
     constructor TBall.Create(size : Byte);
     begin
       ballSize  := size;
       ballSpeed := 0;
     end; {Dit is regel 69}
     
     // Football method implementations
     procedure TFootball.Kick(power : Byte);
     begin
       // Now take the number of panels into account
       ballSpeed := (power * ballSize * ballPanels) DIV 24;
     end;
     
     constructor TFootball.Create(size : Byte; panels : Byte);
     begin
       Inherited Create(size);   // Call the parent constructor first
       ballPanels := panels;     // Save the passed number of panels
     end;
     
     // The form OnCreate implementation
     procedure TForm1.FormCreate(Sender: TObject);
     var
       beachBall  : TBall;
       soccerBall : TFootball;
     begin
       // Create our two balls
       beachBall  := TBall.Create(5);
       soccerBall := TFootball.Create(5, 12);
     
       // How fast are they moving at the moment?
       ShowMessageFmt('Beach ball  is moving at speed : %d',[beachBall.GetSpeed]);
       ShowMessageFmt('Soccer ball is moving at speed : %d',[soccerBall.GetSpeed]);
     
       // Now kick each ball with a power of 10
       beachBall.Kick(10);
       soccerBall.Kick(10);
     
       // How fast are they moving now?
       ShowMessageFmt('Beach ball  is moving at speed : %d',[beachBall.GetSpeed]);
       ShowMessageFmt('Soccer ball is moving at speed : %d',[soccerBall.GetSpeed]);
     end;
     
     end.
    Last edited by Vinny; 19-Aug-04 at 14:49.

  2. #2
    Ja, in Delphi 7 lijkt het me dat het wel zou moeten werken wat ik vluchtig zie.

    By the way .... altijd makkelijk als je er ook bij vermeld wat regel 69 is .. hoeven wij niet te tellen

    [edit]
    Hahaha ... dat had je net nog niet gedaan hoor die regel 69 aangeven. Had je mijn bericht gelezen soms?
    De beste manier om te leren is door fouten te maken.
    80 procent van alle leugens die jij en ik vertellen blijft onopgemerkt

  3. #3
    Hoihoi,

    Ja ik las het bericht zelf en ik zag ook dat het eigenlijk
    best wel een lap tekst was, en toen dacht ik van
    laat ik het er maar even bijzetten. ;-)

    Hihihihi.

    Maar jij bent gewoon veel te snel!

    Hahaha

    Vinny

    Ps: Het zal wel met Delphi 8 te maken hebben, is het niet?
    Maar moet je dan veel dingen anders doen? Anders moet ik
    mij eerst maar eens in den boeken storten. ;-)

  4. #4
    Senior Member PsychoMark's Avatar
    Join Date
    Nov 2001
    Location
    Raamsdonksveer
    Posts
    10,269
    In Delphi 7 zal 't misschien werken, maar in .NET blijkbaar niet (aangezien we in die hoek zitten tenslotte ). De foutmelding is heel duidelijk; je roept geen "inherited;" of "inherited Create();" of een andere inherited constructor aan in jouw eigen constructor. In voorgaande Delphi's maakte dat niet uit aangezien de constructor pas na het initialiseren van het object werd aangeroepen, maar hier dus niet...
    Qui custodiet ipsos custodes

  5. #5
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    In Delphi for .NET moet een constructor altijd een inherited constructor oproepen. Dit is trouwens ook zo in bijvoorbeeld Visual Basic.NET: daar is het zelfs zo dat de call van de inherited constructor als eerste statement moet staan in de constructor, in Delphi for .NET hoeft dat niet echt maar de programmeur moet er wel zorg voor dragen geen inherited members aan te spreken.
    Noteer ook dat het tweede statement in volgende code in Delphi voor .NET niet is toegestaan, hoewel het in Delphi Win32 perfect geldig is en kan gebruikt worden om MyObject te initialiseren:
    Code:
    MyObject := TMyClass.Create;
    //... do stuff with MyObject
    MyObject.Create;
    Geeft in Delphi.NET fout: Cannot call constructors using instance variables

    Gegeven:
    Code:
    TBase = class
      protected
        FData: string;
      public
        constructor Create;
      end;
    
      TDerived = class(TBase)
      protected
        FData2: string;
      public
        constructor Create;
      end;
    Code:
    { TBase }
    
    constructor TBase.Create;
    begin
      // is OK
      FData := 'Base';
      inherited Create;
    end;
    
    { TDerived }
    
    constructor TDerived.Create;
    begin
      // is OK
      FData2 := 'Derived';
      // error:
      //'Self' is uninitialized.
      //An inherited constructor must be called before accessing ancestor field 'FData'
      FData := 'Huh';
      inherited Create;
    end;
    All methodologies are based on fear. -- Kent Beck.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. Programma crasht in Windows 98, niet in XP
    By Jan Pas in forum Algemeen
    Replies: 13
    Last Post: 31-Dec-04, 11:49
  2. Replies: 22
    Last Post: 07-Nov-04, 22:51
  3. Parameters uitvoeren naar extern programma
    By Peter Wijnhoven in forum Algemeen
    Replies: 5
    Last Post: 03-Nov-04, 15:07
  4. compileren van een programma met database
    By Kevin in forum Algemeen
    Replies: 4
    Last Post: 19-Dec-03, 00:24
  5. Foutmelding PDOXUSERS.LCK
    By joostingh in forum Algemeen
    Replies: 10
    Last Post: 28-Aug-02, 13:33

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •