Langsam wird es mit den Generics echt interessant... Ich habe vier Packages, die alle samt mit
{$IMPLICITBUILD OFF}
compiliert werden sollen:
Code:
* ApLibCoreRun
* ApLibCoreDesign (requires: ApLibCoreRun)
* ApVclCtrlsRun (requires: ApLibCoreRun)
* ApVclCtrlsDesign (requires: ApVclCtrlsRun)
Im
Package ApLibCoreRun befinden sich unter Anderem die beiden Units
ApCore.Basics.pas und
ApCore.Collections.pas. In der ApCore.Collections habe ich einen generischen Record definiert:
Delphi-Quellcode:
TApArray<T> = record
{ ... }
end;
Und in der ApCore.Basics will ich diesen nutzen:
Delphi-Quellcode:
class function TApStrings.Explode(const AStr: String; const Separator: String; const MaxElements: Integer = -1): TArray<String>;
var
s : String;
p : Integer;
l : Integer;
n : Integer;
LSeparator : Integer;
begin
if (Length(AStr) = 0) then
Exit( TApArray<String>.EmptyArray() );
LSeparator := Length(Separator);
if (LSeparator = 0) then
Exit( TApArray<String>.Create([AStr]) );
{ etc... }
end;
Und jetzt wird es lustig
Erzeuge ich die beiden Pakcages
ApLibCoreRun und
ApLibCoreDesign klappt das wunderbar. Will ich dann aber
ApVclCtrlsRun erzeugen erhalte ich vom Compiler folgende Meldung:
Code:
[DCC Fataler Fehler] ApVcl.Controls.pas(37): E2225 'Never-build'
Package 'ApLibCoreRun' muss neu compiliert werden
Diese Meldung hat mit oben gezeigtem Code zu tun und zwar mit den Aufrufen von
Exit( TApArray<String>.EmptyArray() );
bzw.
Exit( TApArray<String>.Create([AStr]) );
. Wenn ich auf diese Aufrufe verzichte, dann kann ich das
Package ApVclCtrlsRun ohne Probleme erzeugen. Woran stört sich denn der Compiler hier? Liegt wahrscheinlich an den Internas der Generics, aber sowas ist doch Käse?!
Und noch was: Nein, ich will und werde diesen Code nicht ändern, denn sowas muss doch ohne Probleme möglich sein.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)