Ich musste ziemlich viel davon wegnehmen.
Was denn?
Was bei welcher Version genau war müsste ich schauen. Einfach nur ein Beispiel:
Delphi-Quellcode:
function TMtclDialogThread.Get<T>(const AControlID: Integer): T;
var
ResultControl: TMtclBaseControl;
begin
if FControlsByID.TryGetValue(AControlID, ResultControl) and (ResultControl is T) then
Result := T(ResultControl)
else
Result := nil;
end;
Das funktioniert ab XE problemlos. Unter Delphi 2010 jedoch nicht... Da muss man casten:
Delphi-Quellcode:
function TMtclDialogThread.Get<T>(const AControlID: Integer): T;
var
ResultControl: TMtclBaseControl;
begin
if FControlsByID.TryGetValue(AControlID, ResultControl) and (ResultControl is TClass(T)) then
Result := T(ResultControl)
else
Result := TValue.Empty.AsType<T>;
end;
// EDIT:
Oder (ich glaube das geht erst ab XE6 oder so):
Delphi-Quellcode:
function TMtclDialogThread.GetNew<T>: T;
var
ResultControl: T;
begin
TThread.Synchronize(Self, procedure
begin
ResultControl := T.Create(Self.Handle, Self.GetNewControlID);
end);
Result := ResultControl;
end;
Das musste ich dann so machen:
Delphi-Quellcode:
function TMtclDialogThread.GetNew<T>: T;
var
ResultControl: TMtclBaseControl;
begin
TThread.Synchronize(Self, procedure
begin
ResultControl := TMtclBaseControlClass(T).Create(Self.Handle, Self.GetNewControlID);
end);
Result := T(ResultControl);
end;