Ma question est la suivante :
comment en flashpascal implanter et récupérer les méthodes de l'objet string exemple (de méthode) :
?Code:function substring(start:Number, length:Number) : String
Merci
Version imprimable
Ma question est la suivante :
comment en flashpascal implanter et récupérer les méthodes de l'objet string exemple (de méthode) :
?Code:function substring(start:Number, length:Number) : String
Merci
pour cela il faut déclarer un objet TString
note cependant que FlashPascal utilise la méthode String.substr quand tu écris Copy(str, 1, 2) par exemple :)Code:
1
2
3
4
5
6
7
8
9
10
11
12 type TString = external class(String) property Length: Number; constructor Create(Value: String = ''); function charAt(Index: Number): TString; charCodeAt(Index: Number): Number; concat(value: TObject): TString; class function fromCharCode(code: Number): TString; ... function substr(start, end: Number): TString; end;
j'ai prévu une mise à jour mais je manque de temps pour la tester...éventuellement je peux faire une release et vous laisser me remonter les bugs :)
1) les variants : un type générique qui peut contenir n'importe quoi, comme les OleVariant de Delphi, on peut donc invoquer une méthode de variant sans avoir à déclarer la classe correspondante (cf les exemples de pilotage de Word ou Excel depuis Delphi). Les membres sont accessibles de deux façons : variant.nom ou variant['nom'].
2) les objets dynamique, un peu comme les open array mais sur des objets [x : 5; y = 6], pratique pour déclarer une matrice de transformation par exemple.
exemple (notez l’absence de l'unité Flash8 !):
Pièce jointe 113725Code:
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 program VariantDemo; {$FRAME_WIDTH 550} {$FRAME_HEIGHT 400} {$FRAME_RATE 12} {$BACKGROUND $FFFFFF} (* Le type Variant est très similaire au type OleVariant de Delphi attention, les méthodes d'un variant sont sensibles à la case ! les parenthèses sont obligatoires pour invoquer une méthode, même si elle ne possède pas de paramètres. *) var _root: Variant external; Clip : Variant; Str : string; org : Variant; begin Clip := _root.createEmptyMovieClip('test', 1); // accès par nom Clip['color'] := $ff0000; // accès par nom plus complexe Str := 'co'; Clip['col' + 'or'] := Clip[Str + 'lor'] or $FF; // accès par membre Clip.beginFill(Clip.color); Clip.lineTo(100, 0); Clip.lineTo(100,100); Clip.lineTo( 0,100); Clip.endFill(); // avec parenthèses, sinon c'est un membre ! // création dynamique d'un objet org := [x: 100; y: 100]; { // équivalent au code ci-dessous ! type TOrg = class x, y: Integer; end; var org: TOrg; begin org := TOrg.Create; org.x := 100; org.y := 100; end; } Clip._x := org.x; Clip._y := org['y']; Clip._rotation := 30; end.
Pour l'instant, je n'ai regardé que la première partie de ta réponse...
En effet, j'avais fait comme toi mais j'avais oublié de faire :
monTstring:=TString.create('') donc ça plantait... un oubli hier soir.
petite démo :
UButton ...Code:
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 program PTString; {$FRAME_WIDTH 550} {$FRAME_HEIGHT 400} {$BACKGROUND $FFFFFF} uses Flash8,UButton; type TString = external class(String) property Length: Number; constructor Create(Value: String = ''); function charAt(Index: Number): String; function charCodeAt(Index: Number): Number; function concat(value: TObject): String; class function fromCharCode(code: Number): String; function substring(start, length: Number): String; end; TButton1=class(TButton) procedure onClick;override; end; TEssaiSTring=class(movieclip) button1:TButton1; myFont:TextFormat; Label:TextField; constructor create; end; var monString:TString; resultat:TextField; Constructor TEssaiString.Create; begin inherited Create(_Root,'essai',0); Button1:=TButton1.Create(self,10,10,150); Button1.caption:='essai substring'; MyFont:=TextFormat.Create('Papyrus',20, 0, True, True); Label :=TextField.Create(self,'etiquette',self.getNextHighestDepth(),10,100,370,40); //pour l'affichage de la chaîne complète with Label do begin setNewTextFormat(MyFont); text:="Peut-être que ça marche correctement !"; end; resultat:=TextField.Create(self,'resultat',self.getNextHighestDepth(),10,180,150,40); resultat.setNewTextFormat(MyFont); monstring:=TString.Create(label.text); end; procedure TButton1.onClick; begin resultat.text:=monstring.substring(14,23);//je prends les 23 premiers caractères de la chaîne et je démarre au 14 ème end; begin TEssaiString.Create; end.
Code:
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116 unit UButton; interface uses Flash8; Type TButton=class(movieclip) private click:Boolean; skin1,skin2:movieclip; w,h:number; FText : TextField; font:TextFormat; procedure skin; procedure SetCaption(value:string); procedure onPress;override; procedure onMouseUp;override; public procedure onClick;virtual; constructor create(parent:movieclip;left,top,width:number); property Caption:string read FText write SetCaption; end; implementation constructor TButton.Create(parent:movieclip;left,top,width:number); begin inherited Create(parent,'button',movieclip(parent).getNextHighestDepth()); w:=width; h:=w/3; skin1:=movieclip.create(self,'',1); skin2:=movieclip.create(self,'',2); with skin1 do begin linestyle(1,$646464); BeginFill($F0F0F0); moveto(0,h); lineto(0,0); lineto(w,0); linestyle(3,$646464); lineto(w,h); lineto(0,h); end; with skin2 do begin linestyle(2,$808080); BeginFill($F0F0F0); moveto(0,h); lineto(0,0); lineto(w,0); lineto(w,h); lineto(0,h); end; font := TextFormat.Create('arial', 14); with font do begin color := clBlack; align:='center'; end; click:=false; skin; FText:=TextField.Create(self,'caption',3,0,0,w,h/2); FText.setNewTextFormat(font); _x:=left; _y:=Top; end; procedure TButton.skin; begin if not click then begin skin1._visible:=true; skin2._visible:=false; end else begin skin1._visible:=false; skin2._visible:=true; end; end; procedure TButton.SetCaption(Value: string); begin with FText do begin Text := Value; autosize:='center'; _y:=(h-_Height)/2; _x:=(w-_width)/2; end; end; procedure TButton.onClick; begin end; procedure TButton.onPress; begin click:=true; skin; onClick; end; procedure TButton.onMouseUp; begin click:=false; skin; end; end.
C'est bon...
Merci pour tes lumières :D
je regarde la seconde partie de ta réponse...
vu mais c'était tout de même intéressant de récupérer toutes les méthodes de string...Citation:
note cependant que FlashPascal utilise la méthode String.substr quand tu écris Copy(str, 1, 2) par exemple
Pour ta démo sur les variants, en effet c'est une découverte...
Tu fais comme tu le sens, ceci dit on veut bien tester si tu en as besoin...
Bon WE
Très intéressante discussion !
Anthony, je ne sais pas si c'est dans tes projets, mais en rassemblant toutes tes unités tu pourrais faire une librairie de composants visuels, un projet concurrent à FlashCL. :P
Sinon moi aussi je veux bien tester la nouvelle version, même si je dois avouer que les "variants" me dépassent un peu : ce sera l'occasion d'apprendre. :)
J'ai réuni tous les exemples postés sur le forum depuis le début, y compris ceux que Paul a inclus dans certaines archives sans les reprendre ensuite. Eh bien je peux vous dire qu'il y en a un certain nombre. :)
J'avais pensé à faire une petite application Delphi qui lirait dans ces fichiers comme dans une base de données, par exemple à partir d'un mot-clé entré par l'utilisateur. Qu'est-ce que vous en pensez ?
En effet, mais il faudrait les reprendre... Par exemple, le bouton...maintemant, j'ai le bizeau...le trackbar, il faut le revoir...en progressant, je me rends compte de certaines imperfections...je dois avoir fait aussi une statusbar, toolbar...il faut que je fouille.
mais le terme :un projet concurrent à FlashCL, loin de moi cette idée. Je n'ai pas cette prétention...
C'est vrai qu'il commence à y avoir pas mal d'informations à dépoussièrer sur le forum. Très bonne idée une espèce de Faq pour Flashpascal...
Si le coeur t'en dit...:ccool:
D'après vos exemples et la documentation ActionScript, j'ai écrit ce code.
Pourquoi ai-je un "undefined" pour la propriété Length ?
Code:
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 program TString1; uses Flash8; {$FRAME_WIDTH 320} {$FRAME_HEIGHT 200} {$BACKGROUND 0} //////////////////////////////////////////////////////////////////////////////// const LARGEUR = 320; HAUTEUR = 200; VER = 'Compilateur FlashPascal 2 v13.04.29'#13; var t : TextField; f : TextFormat; s : string; //////////////////////////////////////////////////////////////////////////////// type TString = external class(String) property length: Number; constructor Create(Value: String = ''); function charAt(Index: Number): String; function charCodeAt(Index: Number): Number; function concat(value: TObject): String; class function fromCharCode(code: Number): String; function substring(start, length: Number): String; function substr(start, end: Number): String; function valueOf(): String; end; var chaine: TString; begin //////////////////////////////////////////////////////////////////////////////// f := TextFormat.Create('Tahoma', 16); f.color := clWhite; f.leftMargin := 5; t := TextField.Create(_root, 't', 0, 0, 0, LARGEUR, HAUTEUR); t.SetNewTextFormat(f); //////////////////////////////////////////////////////////////////////////////// chaine := TString.Create('ABCDE'); s := chaine.CharAt(0) // A + #13 + FloatToStr(chaine.CharCodeAt(0)) // 65 + #13 + FloatToStr(chaine.length) // 5 + #13 + chaine.substr(1, 3) // BCD + #13 + chaine.valueOf(); // ABCDE //////////////////////////////////////////////////////////////////////////////// t.text := VER + s; f.size := 12; f.color := clLime; t.SetTextFormat(0, Length(VER)-1, f); //////////////////////////////////////////////////////////////////////////////// end.
parce que ActionScript est case sensitive :)
dans la déclaration de TString il faut mettre un l minuscule à length.
Dans le reste du code tu peux faire ce que tu veux; avec FlashPascal, c'est uniquement dans la déclaration qu'elle est case sensitive.
Merci, Paul, ça marche maintenant. :)
J'ai apporté la correction dans le code ci-dessus.
Cet objet String, je crois qu'on n'en a pas vraiment besoin ; mais pour voir le rapport entre FlashPascal et ActionScript, c'est un bon exemple.