Developpement:Modèle et langage -1
Modification dans le langage.
Le contrôle de type.
Le contrôle de type a été ajouté au langage pour permettre un contrôle plus rigoureux du code source. Il devient ainsi possible de détecter certaine erreur lors de la compilation.
Toutefois pour rester compatible avec le code existant les erreurs signalées par le contrôle de type sont des avertissements.
Les types de données
Type | Alias de | Forme générique | Post fixe | Remarques |
string | ||||
normalizedString | string | soap | ||
anyURI | string | soap | ||
tokenString | string | soap | ||
byte | ||||
char | Type ordinal | |||
integer | ||||
int | integer | soap | ||
unsigned | integer | soap | ||
short | integer | soap | ||
unsignedShort | integer | soap | ||
long | integer | soap | ||
unsignedLong | integer | soap | ||
longint | longint | Type entier long | ||
double | ||||
float | double | soap | ||
currency | soap as decimal | |||
decimal | currency | soap | ||
TDatetime | soap as datetime | |||
date | ||||
time | ||||
boolean | ||||
variant | Type générique | |||
base64Binary | Type binaire soap | |||
hexBinary | Type binaire soap | |||
Enumération | ||||
TObject | Classes techniques | |||
TStringList | ||||
TQuery | ||||
TDeleteObjectList | ||||
TDateBaseInfo | ||||
TBinaryContent | ||||
Objet métier | TitObject | Classes de base des stéréotypes | ||
TdbObject | ||||
TObjectNode | ||||
List de d’objets métiers | TObjectList | LIST | ||
Curseur d’objet métier | TdbCursor | CURSOR | ||
Type de données du framework | ||||
TEnum | ||||
TNumeric | ||||
TQuantity | ||||
TQuantityWithRef | ||||
TQuotation | ||||
TMoney | ||||
TMoneyDT | ||||
TSCurrency | ||||
TSDouble | ||||
TSInteger | ||||
TSQuantity | ||||
TCounter | ||||
TFlag | ||||
TIdentity | ||||
TSQLIdentity | ||||
TDateList | ||||
TIntegerList | ||||
TController | ||||
TMemo | ||||
TBinary | ||||
TPicture
TxmlDataType |
||||
TxslDataType | ||||
Paramétrage des messages du compilateur
Les messages d’avertissement du contrôle de type peuvent être désactivé ou transformé en message d’erreur.
Les opérateurs et les méthodes de classe.
Les méthodes de classe.
Les méthodes de classe sont des méthodes portées par le type.
Constructeur de classe :
var inst2:MaClasse2;
begin
inst2 := MaClasse3.Create;
end;
Cette syntaxe est équivalent à
var inst2:MaClasse2;
begin
inst2 := ClassManager.CreateInstance(‘MaClasse3’);
end;
Toutefois :
Dans le premier cas une erreur est déclenchée si la classe MaClasse3 n’existe pas lors de la compilation.
Dans le second cas un avertissement est déclenché si la classe « MaClasse3 » n’existe pas lors de la compilation.
Méthode de classe | Equivalence |
Class.Create | ClassManager.CreateInstance(‘ClasseName’) |
Class.CreateList | ClassManager.CreateObjectList(‘ClasseName’) |
Class.CreateCursor | ClassManager.CreateCursor(‘ClasseName’) |
class.Find(const iWhere,iOrderBy :string ; iDescendant :boolean ; const iArgs :Array of variant]):TitObject ; | ClassManager.Find(const iClassName :string ; const iWhere,iOrderBy :string ; iDescendant :boolean ; const iArgs :Array of variant]):TitObject ; |
Exemples :
var x: TMaClasseP1;
begin
ShowMessage(TMaClasseP1.Find('uneChaine=%1',,FALSE,['Code1']).uneChaine);
//
x := TMaClasseP1.Find('uneChaine=%1',,FALSE,['Code2']);
if Assigned(x) then showMessage('ok') else showMessage('failed');
end;
var vcursor:TCursor;
begin
vCursor := TMaClasseP1.CreateCursor;
vcursor.Open;
while not vcursor.EOI do
begin
showMessage(vCursor.Instance.uneChaine);
vcursor.Next;
end;
vcursor.Close;
end;
Les opérateurs de classe.
Les opérateurs de classes opèrent sur des instances de classe.
Opérateur « is »
IS réalise un test d’héritage d’une instance par rapport à une classe.
Opérateur « as »
AS réalise un transtypage de type d’une instance de classe vers une autre, la validé du transtypage est contrôlé lors de l’exécution.
var inst2:MaClasse2; inst3:MaClasse3;
begin
inst2 := MaClasse3.Create;
if inst2 is MaClasse3 then
begin
inst3 := (inst2 as MaClasse3);
inst3.code3 := 'code3';
showMessage(inst3.code3);
showmessage((inst2 as MaClasse3).code3);
end
else showMessage('Is is FALSE');
end;
Tableaux ouverts
Les tableaux ouverts à une dimension sont supportés dans les variables locales et les paramètres de méthode.
Différences entre tableaux ouverts et tableaux statiques.
Un tableau statique réserve autant de place qu’il comporte d’éléments dans la pile d’exécution.
Un tableau statique peut être multi-dimensions.
Un tableau statique est toujours passé par valeurs.
Un tableau ouvert ne réserve qu’une entrée dans la pile d’exécution, cette entrée référençant un tableau d’éléments agrandit au fur et à mesure des affectations.
Un tableau ouvert ne peut être que mono-dimension.
Un tableau ouvert est toujours passé par adresse.
Il existe cependant des limitations sur l’usage des tableaux ouverts :
Leur dimension doit être un ; les tableaux ouverts multi-dimension ne sont pas supportés.
Ils ne peuvent contenir que des types simples ; les types objets ne peuvent pas être utilisés dans des tableaux ouverts.
Les indices de tableau ouvert commencent toujours à zéro.
Pour définir une variable locale de type tableau ouvert :
var v:Array of string; s:string; idx:Integer;
begin
v[0] := 'A';
v[1] := 'B';
//
s := ;
for idx:=0 to length(v)-1 do
s := s+v[idx];
//
showMessage(s);
Result := FALSE;
end ;
Utilisation des tableaux ouverts dans les paramètres de méthode.
Il est possible de définir des paramètres de méthode sous forme de tableau ouvert ; par exemple :
function MethodName(p2:Array of string):string;
var idx:Integer; stag:string;
begin
Result := ; stag := ;
for idx:=0 to length(p2)-1 do
begin
Result := Result+stag+p2[idx];
stag := ' ';
end;
end;
Un paramètre ouvert peut être appelé à partir d’un tableau constant, d’une variable locale de type tableau statique ou d’une variable locale de type tableau ouvert.
Pour appeler une méthode ayant des paramètres ouverts à partir d’un tableau constant:
var s:string;
begin
s := MethodName(['ah','que','coucou']);
showmessage(s);
end;
Pour appeler une méthode ayant des paramètres ouverts à partir d’une variable locale de type tableau statique :
var s:string; v:Array[0..2] of string;
begin
v[0] := 'ah';
v[1] := 'que';
v[2] := 'coucou';
s := MethodName(v);
showmessage(s);
end;
Rappelez-vous que les tableaux statiques sont passés par valeurs, la méthode ne peut pas modifier le contenu du tableau.
Pour appeler une méthode ayant des paramètres ouverts à partir d’une variable locale de type tableau ouvert :
var s:string; v:Array of string;
begin
v[0] := 'ah';
v[1] := 'que';
v[2] := 'coucou';
s := MethodName(v);
showmessage(s);
end;
Rappelez-vous que les tableaux ouverts sont passés par adresse, la méthode peut modifier le contenu du tableau.
A l’intérieur de la méthode il est possible d’affecter des valeurs aux tableaux :
function MethodName(p2:Array of string):string;
var idx:Integer; stag:string;
begin
Result := ; stag := ;
p2[length(p2)] := ‘ !’ ;
for idx:=0 to length(p2)-1 do
begin
Result := Result+stag+p2[idx];
stag := ' ';
end;
end;
Si l’indice d’affectation est supérieur à la taille du tableau celui-ci est agrandit et ses valeurs courantes sont conservées.
Dimensionnement des tableaux ouverts
L’agrandissement des tableaux ouverts est automatique, toutefois si vous ajoutez une grande quantité d’éléments à un tableau ouvert vous avez intérêt à utilisez la fonction setLength(tableau,taille) pour agrandir en une fois le tableau.
Les éléments non affectés d’un tableau ouvert sont non défini, par exemple :
var v:Array of string; s:string; idx:Integer;
begin
v[0] := 'A'; // initialise le tableau
v[2] := 'B'; // agrandi le tableau à 3 élements
//
s := ;
for idx:=0 to length(v)-1 do
s := s+v[idx];
//
showMessage(s);
Result := FALSE;
end ;
Provoquera une erreur car l’élément d’indice 1 du tableau est non défini.
Fonctions associés aux tableaux ouverts
Sur un paramètre tableau ouvert les fonctions suivantes sont utilisables :
fonction | Description | Exemple |
function length(x) :Integer | Retourne le nombre d’éléments du tableau | if length(p)=3 then
begin // 3 éléments de 0..2 dans le // tableau end ; |
procedure setlength(x ;l :integer) | Ajuste la taille du tableau | // Positionne la taille du
// tableau à 10 éléments. setLength(x,10) ; |
Les nouveaux objets techniques.
Envoi de Mail
Le support de MapiExt a été ajouté pour permettre l’envoi de mail à partir du code métier sans ouvrir de message d’avertissement.
Procedure MailTo(const iDestinataire, iSubject, iBody : string);
TBinaryContent
Le type TBinaryContent permet de manipuler des données binaires chargé à partir de fichier ou de chaîne encodées en base64.
Les propriétés suivantes sont disponibles sur les types binaires :
AsBase64Binary
Lecture ou écriture des données encodées au format base64.
AsString
Lecture ou écriture des données contenues dans une chaine de caractère.
Hash
Retourne une chaine de caractère correspondant au sceau du contenu. Le sceau du contenu est le résultat en format hexadécimale (16 caractères) d’une compression du contenu par une clé DES.
Les fonctions suivantes sont disponibles
Tb64Compression = (b64Auto, b64ZlibSig, b64ZlibNoSig, b64None);
Function getAsBase64Binary(iCompression:Tb64Compression) :string ;
Procedure setAsBase64Binary(const value:string; iCompression:Tb64Compression);
Lecture et écriture des données en contrôlant le mode de compression
TStringList
Les propriétés suivantes sont disponibles sur les types binaires :
AsBase64Binary
Lecture ou écriture des données encodées au format base64.
Les fonctions suivantes sont disponibles
' 'Tb64Compression = (b64Auto, b64ZlibSig, b64ZlibNoSig, b64None);
Function getAsBase64Binary(iCompression:Tb64Compression) :string ;
Procedure setAsBase64Binary(const value:string; iCompression:Tb64Compression);
TxmlDocument
Ce type a été amélioré de nouvelles méthodes et propriétés.
Compression :
var xml:TxmlDocument; aString:string;
begin
xml := TxmlDocument.Create(nil);
//...
xml.Compression := cpxZLibNoSig;
xml.isCompressed := TRUE;
aString := xml.SaveToBase64;
end;
TxslDocument
Un composant TxslDocument pouvant contenir une feuille de style XSL et appliquer une transformation à un document source XML. Le résultat d’une transformation XSL peut être un autre document XML, un document HTML ou bien un document texte.
Les méthodes disponibles sur un TxslDocument :
Procedure TransformToXML(const source : TxmlDocument; dest :TxmlDocument) ;
Applique la transformation pour produire un nouveau document XML. La feuille de style doit être de type xMethodXML ou xMethodHtml
Procedure TransformToStream(const source : TxmlDocument; dest :TStream) ;
Applique la transformation pour produire un nouveau document XML. La feuille de style doit être du type xMethodText
Function TransformToString(const source : TxmlDocument) :string ;
Applique la transformation et retourne le résultat comme chaîne de caractère. La feuille de style peut être de tout type ; si le résultat est un document XML c’est sa représentation en chaîne de caractère qui est retournée.