[Delphi] TThread class en EAbstracterror

Pagina: 1
Acties:

  • Parcye
  • Registratie: Maart 2001
  • Laatst online: 24-08-2017
Ik ben bezig een class op te maken die afstamt van de TThread class.

De abstract method Execute heb ik geimplementeerd, en bij de constructor create roep ik de inheretid create ook aan. Maar meteen naar die inheretid create krijg ik een EAbstractError.

Iemand enig idee wat ik heb overgeslagen of ben vergeten?

"Als je het kan bedenken, kan het gemaakt worden" Parcye - 14 januari 2002


Verwijderd

Hoe roep je 'm aan? Ik heb het vermoeden als

tthread.create(false), maak daar eens (true) van..

  • Parcye
  • Registratie: Maart 2001
  • Laatst online: 24-08-2017
dat klopt, ik doe false... maar true maakt geen enkel geverschil

"Als je het kan bedenken, kan het gemaakt worden" Parcye - 14 januari 2002


Verwijderd

Heb je het al geprobeerd?

Waar het om gaat: je roept een abstracte functie aan..

  • Parcye
  • Registratie: Maart 2001
  • Laatst online: 24-08-2017
ik heb het geprobeerd, het gaat er om dat ik die thread niet kan maken want ik krijg meteen een EAbstractError na de inheretid create(false/true)

Delphi:
1
MyThreadje := TMyThread.Create(true, 'ikke');


Na deze code is MyThreadje nil en dat komt omdat in de create:

Delphi:
1
2
3
4
5
constructor TMyThread.Create(AutoStart: boolean; const Naam: string);
begin
  inherited Create(AutoStart);
  MijnName := Naam;
end;


Het na 'inherited Create(AutoStart);' fout gaat.

[ Voor 56% gewijzigd door Parcye op 26-01-2003 20:41 ]

"Als je het kan bedenken, kan het gemaakt worden" Parcye - 14 januari 2002


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Die EAbstractError error krijg je als je een instantie maakt van een klasse waar nog abstracte functies inzitten. De abstracte functie in een TThread is de Execute. Die heb je geoverride neem ik aan, want anders heeft de thread geen nut. Heb je de declaratie wel goed gedaan? Niet misschien de override; vergeten?
Delphi:
1
    procedure Execute; override;


Let dan ook op de warnings, want deze geven aan dat je je override vergeten bent: '[Warning] Unit2.pas(13): Method 'Execute' hides virtual method of base type 'TThread''

[ Voor 18% gewijzigd door LordLarry op 26-01-2003 20:57 ]

We adore chaos because we like to restore order - M.C. Escher


  • Parcye
  • Registratie: Maart 2001
  • Laatst online: 24-08-2017
Dat heb ik er in staan, ik heb die warning niet, dus dat zit goed.

"Als je het kan bedenken, kan het gemaakt worden" Parcye - 14 januari 2002


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Wat is de declaratie van je nieuwe constructor Create. override? overload? reintroduce? zijn er daar nog warnings over?

We adore chaos because we like to restore order - M.C. Escher


  • Parcye
  • Registratie: Maart 2001
  • Laatst online: 24-08-2017
Opgelost.... ben maar naar Delphi 7 gegaan

"Als je het kan bedenken, kan het gemaakt worden" Parcye - 14 januari 2002


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Welke Delphi versie had je dan? Ik ken geen Delphi versie waar dit een bug zou zijn en het veranderen van Delphi versie zou dan ook niet uit moeten maken.

We adore chaos because we like to restore order - M.C. Escher


  • whoami
  • Registratie: December 2000
  • Laatst online: 12:26
Had je ook eens geprobeerd om je *.obj files te deleten en dan opnieuw te builden?

LordLarry schreef op 26 January 2003 @ 20:55:
Die EAbstractError error krijg je als je een instantie maakt van een klasse waar nog abstracte functies inzitten. De abstracte functie in een TThread is de Execute. Die heb je geoverride neem ik aan, want anders heeft de thread geen nut. Heb je de declaratie wel goed gedaan? Niet misschien de override; vergeten?
Delphi:
1
    procedure Execute; override;


Let dan ook op de warnings, want deze geven aan dat je je override vergeten bent: '[Warning] Unit2.pas(13): Method 'Execute' hides virtual method of base type 'TThread''



Mocht je ergens een functie vergeten zijn te overriden in die inherited class, dan zou de compiler toch al gaan klagen als hij ziet dat je een object maakt van die inherited class, die toch nog abstract is doordat je een functie vergeten te overriden hebt, ipv at runtime een exceptie te gooien.

[ Voor 5% gewijzigd door whoami op 26-01-2003 21:25 ]

https://fgheysels.github.io/


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

whoami schreef op 26 January 2003 @ 21:25:
Mocht je ergens een functie vergeten zijn te overriden in die inherited class, dan zou de compiler toch al gaan klagen als hij ziet dat je een object maakt van die inherited class, die toch nog abstract is doordat je een functie vergeten te overriden hebt, ipv at runtime een exceptie te gooien.
Nee, helaas. In sommige gevallen krijg je idd een warning, maar het compilen werkt gaat gewoon door. Het idee hierachter is dat je gewoon alles met die instantie kan doen, zolang je maar die abstracte functie niet aanroept. Als je dat wel doet krijg je dus die EAbstractError Exceptie.


Parcye: Je roept toch niet de inherited van de Execute aan toch? Die is er niet en zou ook een EAbstract kunnen geven.

We adore chaos because we like to restore order - M.C. Escher


  • Parcye
  • Registratie: Maart 2001
  • Laatst online: 24-08-2017
LordLarry : ik had Delphi 5, een code van een Delphi 6 coder gepakt als voorbeeld, en ja, Inherited zat in de execute, werkt wel in D6+D7 maar D5 niet dus :D maar Delphi 7 is gewoon fijner :D

"Als je het kan bedenken, kan het gemaakt worden" Parcye - 14 januari 2002


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Die inherited in je Execute in D5 was dus de oorzaak van je excepty.

We adore chaos because we like to restore order - M.C. Escher


  • whoami
  • Registratie: December 2000
  • Laatst online: 12:26
LordLarry schreef op 26 januari 2003 @ 21:38:
[...]


Nee, helaas. In sommige gevallen krijg je idd een warning, maar het compilen werkt gaat gewoon door. Het idee hierachter is dat je gewoon alles met die instantie kan doen, zolang je maar die abstracte functie niet aanroept. Als je dat wel doet krijg je dus die EAbstractError Exceptie.
Hmm, dat vind ik vreemd.... Ik heb Delphi hier nu niet staan, maar ga dat toch ff moeten uittesten.
Normaal gezien is iedere class die -al is het er maar 1- abstracte functies bevat een abstracte class, en zou je de constructor er dus niet mogen kunnen van aanroepen, en zou je al een compiler error krijgen.

Bv in dit code-voorbeeld (dit is wel C#, aangezien ik hier Delphi niet installed heb):
code:
1
2
3
4
5
6
7
8
9
10
abstract class Test
{
   Test()
   {
   }
   public abstract void DoeIets();
}


Test t = new Test();

Dit compileert niet, en dan krijg je volgende error:
D:\NeoISD\cfgCategories.aspx.cs(60): Cannot create an instance of the abstract class or interface 'NeoISD.test'
Indien dat mocht lukken in Delphi, dan zou ik dat toch echt een slecht punt vinden voor Delphi.
Van zodra er een abstracte functie in een class zit, is die class imho abstract en mag je er geen objecten van kunnen instantieren.
Parcye: Je roept toch niet de inherited van de Execute aan toch? Die is er niet en zou ook een EAbstract kunnen geven.

Misschien een foutje in Delphi 5, dat als je een abstracte functie overrided, het keyword inherited ook automatisch in die functie body komt.... :?

https://fgheysels.github.io/


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

whoami schreef op 27 January 2003 @ 09:16:
Hmm, dat vind ik vreemd.... Ik heb Delphi hier nu niet staan, maar ga dat toch ff moeten uittesten.
Normaal gezien is iedere class die -al is het er maar 1- abstracte functies bevat een abstracte class, en zou je de constructor er dus niet mogen kunnen van aanroepen, en zou je al een compiler error krijgen.

Bv in dit code-voorbeeld (dit is wel C#, aangezien ik hier Delphi niet installed heb):
[code]
Dit compileert niet, en dan krijg je volgende error:

Indien dat mocht lukken in Delphi, dan zou ik dat toch echt een slecht punt vinden voor Delphi.
Van zodra er een abstracte functie in een class zit, is die class imho abstract en mag je er geen objecten van kunnen instantieren.
Integenstelling tot o.a. Java, C++ en C# is dit niet het geval bij Delphi. De Delphi compiler laat je dus wel classes instantieren die abstracte functies bevatten en geven bij de aanroep van zo'n abstracte functie een exceptie. Wel wordt er een compiler warning gegeven dat men hier een abstracte classe wil instantieren. Als argument wordt gegeven dat Delphi op deze manier felixbler is en door de compiler warning toch waarschuwd voor een mogelijk probleem. Runtime referenties naar classen die dan geinstantieerd worden maken het ook lastiger voor de compiler tijdens compile time om altijd te achterhalen of er een abstracte klasse geinstantieerd dreigt te worden.
Misschien een foutje in Delphi 5, dat als je een abstracte functie overrided, het keyword inherited ook automatisch in die functie body komt.... :?
Tja, het had inderdaad netter geweest als dat niet gedaan werd, maar de code completion kijkt niet naar andere units en heeft dus geen manier om het te achterhalen. Bovendien is de code die Delphi genereerd voor een thread wel correct en zou de ontwetende programmeur zelf de incorrecte inherited toe moeten voegen.

We adore chaos because we like to restore order - M.C. Escher

Pagina: 1