Firemonkey byla výrazně rozšířena. Trial verze je nově dostupná i jako Instant Trial, tj. via AppWave.
Pro zajímavost nově TOSVersion obsahuje nové platformy.
TOSVersion = record
public type
TArchitecture = (arIntelX86, arIntelX64, arARM32);
TPlatform = (pfWindows, pfMacOS, pfiOS, pfAndroid, pfWinRT, pfLinux);
public const
AllArchitectures = [arIntelX86, arIntelX64, arARM32];
AllPlatforms = [pfWindows, pfMacOS, pfiOS, pfAndroid, pfWinRT, pfLinux];
Hmm, pfWinRT?
Několik nových překladových konstant
AUTOREFCOUNT - ARC je dostupné (dcciosarm, dccios32)
CPUARM - CPU je ARM (dcciosarm)
EXTERNAL_LINKER - externí linker (dcciosarm, dccios32)
IOS - target platform je iOS (dcciosarm, dccios32)
NEXTGEN - Next Generation Delphi compiler (dcciosarm, dccios32)
UNDERSCOREIMPORTNAME - podtržítko při importu knihoven (dccosx, dccios32, v helpu je i u dcc32, ale pochybuji)
WEAKREF - kompilátor s weak references (ARC) - (dcciosarm, dccios32)
WEAKINSTREF - weak reference pro instance - (dcciosarm, dccios32)
WEAKINTFREF - weak reference pro interfaces - (dcciosarm, dccios32)
Kompletní přehled Conditional definic.
Nové atributy
[volatile] indikátor, že položka může být měněna jiným vláknem
[weak] weak reference (nezvyšuje počet referencí pro ARC)
[Ref] to ensure constant parameters are passed by reference rather than by value.
(posledním si nejsem jistý)
NEXTGEN a pointer
Obecný Pointer je doporučován nepoužívat (pro NextGen - kvůli ARC). Navíc jelikož pro NextGen je jen Unicode řetezec, je nutno využít TPtrWrapper a TMarshal.
Tohle je můj kousek ze Synapse pro NextGen (aspoň ta druhá polovina).
function GetSinIP(Sin: TVarSin): string;
var
p: PAnsiChar;
hostlen, servlen: integer;
r: integer;
sa:sockaddr absolute Sin;
byHost, byServ: TBytes;
HostWrapper, ServWrapper: TPtrWrapper;
begin
Result := '';
if not IsNewApi(Sin.AddressFamily) then
begin
p := inet_ntoa(Sin.sin_addr);
if p <> nil then
Result := string(p);
end
else
begin
// NEXTGEN compatible
hostlen := NI_MAXHOST;
servlen := NI_MAXSERV;
Setlength(byHost, hostLen);
Setlength(byServ, hostLen);
HostWrapper := TPtrWrapper.Create(@byHost[0]);
ServWrapper := TPtrWrapper.Create(@byServ[0]);
r := getnameinfo(sa, SizeOfVarSin(sin), HostWrapper.ToPointer, hostlen,
ServWrapper.ToPointer, servlen, NI_NUMERICHOST + NI_NUMERICSERV);
if r = 0 then
Result := TMarshal.ReadStringAsAnsi(HostWrapper{, NI_MAXHOST});
end;
end;