Bonjour,

Je vous soumets un cas de conscience ... peut-être aurez vous une idée que je n'ai pas envisagé.

actuellement FlashPascal déclare les évènements comme des propriétés de type "procedure of object.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
type
  MovieClip = external class
    property onPress: procedure of object;
  end;
 
var
  mc: MoveClip;
begin
  mc := MovieClip.Create(_root, '', 1);
  mc.onPress := ...
end;
c'est tout à fait fonctionnel...mais de par la conception de FlashPascal et la nature de Flash, il est possible de dériver MovieClip avec une méthode onPress

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
type
  MyMovie = class(MovieClip)
    procedure onPress;
  end;
cela donne deux approches et je trouve cela un peu confus, j'aimerai donc trouver une syntaxe qui permette de faire sauter cela.

J'ai pensé à ceci:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
type
  MovieClip = external class
    procedure onPress; virtual;
  end;
 
  MyMovie = class(MovieClip)
    procedure onpress; override; // n'a plus besoin d'être case sensitive
  end;
grâce au virtual/override, seule la méthode virtuelle a besoin d'avoir la bonne casse, la casse de la méthode surchargeant étant ignorée. Et on est assuré d'avoir correctement tapé le nom de la fonction.

mais on perd la possibilité d'attacher la méthode "mc.onPress := ...".

je me suis dit que je pouvais étendre la syntaxe pascal en autorisant d'affecter une méthode virtuelle et le tour est joué.


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
type
  MovieClip = external class
    procedure onPress; virtual;
  end;
 
  MyMovie = class(MovieClip)
    procedure onpress; override; // n'a plus besoin d'être case sensitive
    procedure autrepress;
  end;
 
var
  mc: MyMovie;
begin
   mc := MyMovie.Create(_root, '', 1);
   mc.onpress := autrepress;
end;
alors, ça fonctionne, mais c'est sémantiquement très discutable. En effet, la méthode avec override intervient au niveau de la classe, donc toutes les instances de MyMovie utilisent ce code...alors qu'en affectant "autrepress" à "onpress" on travaille au niveau de l'instance; les autres instances ne sont pas affectées.

c'est d'autant plus troublant que j'ai fait le test avec XML sous ActionScript, et ça fonctionne.

Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
//-- TXML.as
class TXML extends XML {
	function onData(src: String) {
		trace('class');
	}
}
//---
var x1 : TXML = new TXML();
var x2 : TXML = new TXML();
x2.onData = function(src: String) {
	trace('instance');
}
x1.load('TXML.as'); // class
x2.load('TXML.as'); // instance

Alors est-ce que cette syntaxe avec virtual/override vous choque ?
Avez vous une autre idée pour gérer cette dualité propriété/méthode ?

Notez qu'avec cette modification, il faudra ajouter un "override" à toutes les méthodes surchargée dans le code existant...à moins que je n'inclus des warning...