Results 1 to 8 of 8

Thread: Calling abstract virtual procedure geeft Abstract Error maar werkt wel

  1. #1

    Calling abstract virtual procedure geeft Abstract Error maar werkt wel

    Hi,
    Ik heb een parent form.
    Hierop zit een knop met een onclick procedure; virtual; abstract;
    In een inherited form bestaat deze procedure.
    In het parent form roep ik deze procedure aan Button1Click(button1);
    Er volgt nu een Abstract Error.
    Na het wegklikken van deze melding wordt de procedure in het inherited form wel uitgevoerd.
    Waar komt deze melding vandaan en hoer krijg ik hem weg?
    Dank

  2. #2
    Je overriden procedure (in je inherited form) roept inherited aan?
    Delphi Code:
    1. procedure TOtherForm.MyOnclick(Sender: TObject);
    2. begin
    3.   inherited MyOnClick(Sender); //calls abstract method
    4.   //rest of the code
    5. end;

    Bart

  3. #3
    Je moet inherited niet aanroepen als je een abstract method overridet.
    1+1=b

  4. #4
    Ik heb met en zonder inherited aanroepen geprobeerd.
    De abstract error komt al voor dat ik in de begin van het inherited form kom. (in debug)
    Ook wanneer het inherited form geen MyOnClick heb krijg ik de error (zonder verdere errors)

  5. #5
    Dit moet je hebben:
    Delphi Code:
    1. // In je base form:
    2. procedure Button1Click(Sender: TObject); virtual; abstract;
    3.  
    4. // In je inherited form:
    5. procedure Button1Click(Sender: TObject); override;
    6.  
    7. // En in de implementatie:
    8. procedure TInheritedForm.Button1Click(Sender: TObject);
    9. begin
    10.   // Geen inherited aanroepen!
    11.   AlleenJeImplementatie;
    12. end;
    - Als je geen implementatie hebt in de afgeleide gaat het fout. Je hebt dan alleen de abstract method, en elk gebruik ervan geeft de Abstract Error.
    - Als je inherited aanroept gaat het fout. Je roept dan vanuit de implementatie die abstract method aan, en krijgt de fout. Inherited aanroepen terwijl er helemaal geen method bestaat in het baseform kan wél, dus dat is een subtiel verschil.
    - Als je een TInheritedForm-instantie hebt, maar de aanroep wordt gedaan vanuit een method in het base form (bijvoorbeeld in TBaseform.FormCreate), en de procedure Button1Click is niet als `override` gemarkeerd in TInheritedForm, dan gaat het fout.
    Je roept dan de abstract method aan en krijgt de Abstract error. Als de method is gekoppeld aan het OnClick event van een button in TInheritedForm, of als je het aanroept vanuit een method in TInheritedForm, dan gaat het wel goed.
    Die aanroep vindt juist de andere versie van de method. Je hebt dus eigenlijk twee versies van de method, en het hangt af van de scope welke je vindt. Hierop zal je overigens een compiler warning krijgen (Button1Click hides virtual method of TBaseForm, of zo iets). Die melding kan je onderdrukken door expliciet `reintroduce` te gebruken i.p.v. `override`, maar het effect blijft.

    Overigens ben ik zelf niet zo'n voorstander van het rommelen met de door Delphi aangemaakte methods, zoals Button1Click. Die laat ik liever gewoon bovenaan het form staan. In het base form roep ik vanuit die OnClick een eigen method aan, en die override ik dan.
    Last edited by GolezTrol; 16-Dec-21 at 12:04.
    1+1=b

  6. #6
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Lang geleden heb ik eens een stukje gelezen/discussie gevolgd waarin werd aangeraden om abstraction niet te gebruiken, maar om lege implementaties te gebruiken.
    De achterliggende redenering kan ik me niet meer herinneren, maar het lost dan wel dit soort problemen op.
    Last edited by VideoRipper; 16-Dec-21 at 15:54.
    TMemoryLeak.Create(Nil);

  7. #7
    Dank! ga er mee aan de slag

  8. #8
    Senior Member Thaddy's Avatar
    Join Date
    Dec 2004
    Location
    Amsterdam
    Posts
    2,211
    Nog een opmerking: een abstract class kan weldegelijk al implementatie bevatten en dat maakt het allemaal wat onduidelijk.
    Dat is feitelijk waar je tegenaan loopt.
    Zelf probeer ik zoveel mogelijk om abstract classes geen enkele implementatie te laten bevatten: pure abstract .
    Dat betekend dan ook dat er geen enkele implementatie is.
    Werken aan Ansi support voor Windows is verspilde tijd, behalve voor historici.

Thread Information

Users Browsing this Thread

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

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
  •