IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Sortie de la version 13.03.16 du compilateur FlashPascal 2
Qui voit apparaître les Variant et les objets dynamiques

Le , par Paul TOTH

21PARTAGES

3  0 
Sortie de la version 13.03.16 de FlashPascal 2
Avec, comme nouveautés, l'apparition des Variant et des objets dynamiques



http://flashpascal.execute.re/

Au menu, une correction de bogue :
- la fonction Pos() retourne une position basée sur 1 et non 0.

Deux nouveautés :
- les Variant, qui permettent de jouer plus facilement avec les propriétés des objets ;

- les objets dynamiques, qui permettent de déclarer un objet de façon très compacte ; la déclaration pouvant être utilisée directement en paramètre de fonction au besoin (Matrice, etc).

Ces fonctions ont été peu testées, n'hésitez pas à me remonter des bogues.

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de Paul TOTH
Expert éminent sénior https://www.developpez.com
Le 17/03/2013 à 8:42
Alors pour SetTextFormat, c'est une fonction de Flash, autant je peux rendre la fonction Pos() du Pascal conforme à ce qu'on attends - c'est en fait un String.IndexOf() + 1, autant la méthode Flash restera 0 basée

pour le type Variant, tu peux forcer
r.i := Integer(v.i);, par contre ça ne fonctionne pas avec un record...mais je ne suis pas certain que ce soit souhaitable non plus. Si le variant ne possède pas les membres du record la variable sera inconsistante.

En fait j'ai ajouté les variants et les objets dynamiques pour faciliter l'appel à certaines méthodes de Flash, notamment les matrices. Ou pour récupérer des noeuds XML sans passer par la déclaration d'un type spécifique.

les objets sont plus souples aussi maintenant :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
type
  obj = class
    x : Integer;
  end;
var
  o: obj;
  i: Integer;
begin
  o := [x : 5]; // initialisation de l'objet
  o.y := 2; // ne compile pas
  o['y'] := 2; // fonctionne !
  i := Integer(o['y']); // NB o['y'] est un Variant

 o := [z : 8]; // fonctionne également...mais o.x est indéfini et o['z'] retourne le variant 8
end;
2  0 
Avatar de Paul TOTH
Expert éminent sénior https://www.developpez.com
Le 20/03/2013 à 7:45
les deux

le plantage n'est pas normal, mais ton code est invalide, tu affectes un objet dynamique à "Matrix" qui est une définition de classe, et non ta variable "Matrice"
1  0 
Avatar de Roland Chastain
Rédacteur/Modérateur https://www.developpez.com
Le 16/03/2013 à 17:44
Très intéressant, ce type variant.

Merci également pour la correction sur la fonction Pos.

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
program Chaine;

uses
  Flash8;

{$FRAME_WIDTH 420}
{$FRAME_HEIGHT 594}
{$BACKGROUND $F5F5DC}
{Beige}

const
  ch = 'abcdefg';

var
  t: TextField;
  f: TextFormat;
  s: string;  
  
begin
  t := TextField.Create(nil, 't', 0, 10, 10, 400, 574);
  f := TextFormat.Create('Courier', 24);
  t.SetNewTextFormat(f);

  s := ch                     + #13 // abcdefg
     + IntToStr(Length(ch))   + #13 // 7
     + Copy(ch, 1, 3)         + #13 // abc
     + IntToStr(Pos('a', ch)) + #13 // 1 (v13.03.16)
     + 'fin';
     
  t.text := s;
  
  f.color := clBlue;
  t.SetTextFormat(Pos('7', s), Pos('1', s), f); // le 7 reste en noir
end.
Il reste un petit défaut dans la procédure SetTextFormat.

Bon, je vais essayer d'écrire un exemple avec un objet dynamique, pour voir si j'ai vraiment compris la chose. D'après l'exemple ça paraît plutôt simple.
0  0 
Avatar de Roland Chastain
Rédacteur/Modérateur https://www.developpez.com
Le 16/03/2013 à 18:40
J'ai essayé un truc tout bête (mais qui n'est peut-être pas correct) :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
program variant1;

{$FRAME_WIDTH 420}
{$FRAME_HEIGHT 594}
{$BACKGROUND $F5F5DC}

uses
  Flash8;

type
  rec = record
          s: string;
          i: integer;
        end;
        
var
  r: rec;
  v: variant;
  t: textField;
  f: textFormat;
  
begin
  t := TextField.Create(nil, 't', 0, 20, 20, 380, 554);
  f := TextFormat.Create('Courier', 24);
  t.SetNewTextFormat(f);
  
  v := [s: 'samedi'; i: 16];
  
  //r := v;
  
  r.s := v.s;
  //r.i := v.i;
  
  t.text := r.s + ' ' + IntToStr(r.i);
end.
Les lignes que j'ai changées en commentaires ne passent pas.
0  0 
Avatar de Roland Chastain
Rédacteur/Modérateur https://www.developpez.com
Le 20/03/2013 à 1:18
J'ai essayé d'utiliser le type variant pour une matrice, d'après la page sur les objets dynamiques. J'obtiens une erreur, mais je ne sais pas si c'est mon code ou un bug.

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
program matrice02;

{$FRAME_WIDTH 400}
{$FRAME_HEIGHT 400}

uses
  Flash8;

type
  tImage = class(movieClip)
    constructor Create(name: string; x, y: integer);
    procedure Carre(taille: integer);
    procedure Remplissage(couleur: integer);
  end;
{
  tMatrice = class
    matrixType: string;
    x,y,w,h   : double;
    r         : double;
    constructor Create;
  end;
}
constructor tImage.Create(name: string; x, y: integer);
begin
  inherited Create(nil, name, _root.GetNextHighestDepth());
  _x := x;
  _y := y;
end;

procedure tImage.Carre(taille: integer);
begin
  taille := taille div 2;
  MoveTo(-taille, +taille);
  LineTo(-taille, -taille);
  LineTo(+taille, -taille);
  LineTo(+taille, +taille);
  LineTo(-taille, +taille);
end;

var
 {matrice: tMatrice;}
  matrice: variant;
  
procedure tImage.Remplissage(couleur: integer);
begin
  Clear;
  LineStyle(0, couleur);
  BeginGradientFill('radial', [$ffffff,couleur], [100,100], [0,255], matrice);
  Carre(300);
  EndFill;
end;
{
constructor tMatrice.Create;
begin
  matrixType := 'box';
  x := -75;
  y := -75;
  w := 150;
  h := 150;
  r := 0;
end;
}
var
  i: tImage;

begin
 {matrice := tMatrice.Create;}
  matrix := [matrixType: 'box'; x:-75; y:-75; w:150; h:150; r:0];
  i := tImage.Create('', 200, 200);
  i.Remplissage($6600FF); { PersianBlue }
end.
Violation d'accès à l'adresse 00403FA0 dans le module 'FlashPascal2.exe'. Lecture de l'adresse FFFFFFDC.
0  0 
Avatar de Roland Chastain
Rédacteur/Modérateur https://www.developpez.com
Le 20/03/2013 à 10:47
Citation Envoyé par Paul TOTH Voir le message
ton code est invalide, tu affectes un objet dynamique à "Matrix" qui est une définition de classe, et non ta variable "Matrice"
Oh, l'étourdi ! Voilà ce que c'est que de travailler quand on a sommeil.

Correction faite, le programme fonctionne parfaitement.

Code : Sélectionner tout
1
2
  //matrix := [matrixType: 'box'; x:-75; y:-75; w:150; h:150; r:0];
  matrice := [matrixType: 'box'; x:-75; y:-75; w:150; h:150; r:0];
Merci pour ta réponse, Paul, et pour ta patience.
0  0