Migration du code Delphi en mobile depuis le bureau
Remonter à Considérations Delphi pour les applications multi-périphériques
Sommaire
Cette rubrique décrit comment migrer du code Delphi existant pour utiliser les compilateurs mobiles Delphi :
- DCCIOSARM64.EXE, le compilateur Delphi pour le périphérique iOS 64 bits
- DCCAARM.EXE, le compilateur Delphi pour Android
- DCCAARM64.EXE, le compilateur Delphi pour Android 64 bits
Mise à jour des types tableau
Effectuez la mise à jour de toutes les déclarations de tableaux afin de les rendre dynamiques.
Utilisez l'une des syntaxes suivantes :
var x: array of Integer;
x: TArray<Integer>;
Il arrive qu'une structure (un enregistrement) doive être transmise à une fonction externe et que cette structure contienne un tableau déclaré avec une longueur spécifique. C'est notamment le cas des tableaux de caractères déclarés "in-situ" à l'intérieur de la structure. Dans ce cas, et seulement dans ce cas, ce qui suit est autorisé :
type
rec = record
Flags: Integer;
Chars: array[MAX_PATH] of Char;
end;
Dans les cas où une fonction externe prend un tableau directement, utilisez à la place un tableau dynamique. Pour les tableaux de caractères UTF8 :
- Pour convertir depuis UTF8, utilisez TBytes avec System.SysUtils.TEncoding.GetString(Bytes).
- Pour convertir en UTF8, utilisez TBytes avec System.SysUtils.TEncoding.GetBytes(S).
Utiliser un appel de fonction dans un bloc try-except pour empêcher les exceptions matérielles non interceptées
Avec le compilateur pour le périphérique iOS, les blocs except
peuvent intercepter une exception matérielle uniquement si le bloc try
contient un appel de méthode ou de fonction. Cette particularité est liée au backend LLVM du compilateur qui ne peut pas renvoyer d'exception si aucune méthode/fonction n'est appelée dans le bloc try
.
Ainsi, voici comment structurer un bloc try-except
capable d'intercepter une exception matérielle :
var
P: ^Integer = nil;
procedure G1;
begin
P^ := 42;
end;
begin
try
G1;
except
writeln('Catch:G1 - pass');
end;
end.
Même si un bloc de code source semble contenir un appel de fonction, cela ne peut pas se produire si la fonction est une fonction inline. La raison principale est qu'au moment où le LLVM génère des instructions machine, le processus inline a déjà eu lieu et il n'y a plus d'appel de fonction dans le bloc try.
Utiliser les intrinsèques atomiques au lieu du langage assembleur
Les compilateurs Delphi mobiles ne prenant pas en charge d'assembleur intégré, vous pouvez utiliser les nouvelles fonctions intrinsèques atomiques pour échanger, comparer et échanger, incrémenter et décrémenter des valeurs en mémoire.
Les opérations atomiques sont utilisées pour implémenter des primitives de verrouillage multithreads et fournir les primitives nécessaires à l'implémentation de structures "exemptes de verrou". Les types d'opérations nécessaires sont implémentés en tant que fonctions standard ou fonctions "intrinsèques".
Dans une application multiplate-forme, les intrinsèques atomiques peuvent être utilisés dans {$IFDEF} selon la plate-forme cible.
Fonctions intrinsèques atomiques
Voici les fonctions intrinsèques atomiques supportées par les compilateurs mobiles Delphi :
Voir aussi
- DCCIOSARM64.EXE, le compilateur Delphi pour le périphérique iOS 64 bits
- DCCAARM.EXE, le compilateur Delphi pour Android
- DCCAARM64.EXE, le compilateur Delphi pour Android 64 bits
- Tutoriels mobiles : Développement d'applications mobiles (iOS et Android)
- Extraits de code mobile
- System.SysUtils.TStringHelper
- System.SysUtils.TStringBuilder
- Chaînes basées sur zéro (directive du compilateur Delphi)
- Migration du code C++ en mobile depuis le bureau