IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Vote des utilisateurs
2 
0 
Détails
Éditeur : Execute
Licence : Libre
Mise en ligne le 25 juin 2012
Plate-formes : Linux, Mac, Windows
Langue : Français
Référencé dans
Navigation

Jeu des points à relier

Thèmes abordés :

Chargement d'un fichier xml
Ajout et suppression dynamique d'événements souris
Dessin

cf version Flash
Avatar de Paul TOTH
Expert éminent sénior https://www.developpez.com
Le 27/06/2012 à 7:00
Flash n'est pas prévu pour...mais il plus ou moins possible de le faire

le programme ci-dessous affiche son propre source dans un TextField.
cependant, les accents sont interprétés comme de l'UTF8 et les #13#10 provoquent deux passages à la ligne.

Maintenant, si le fichier texte est en UTF8 avec des retours à la ligne Unix ça fonctionnera.

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 LoadText;

uses
  Flash8;

var
  t: TextField;
  
type
  TLoadVars = class(LoadVars)
    constructor Create;
    procedure onData(src: string);
  end;
  
constructor TLoadVars.Create;
begin
  inherited Create();
// lire son propre source
  if not load('loadText.fpr') then
    t.Text := "erreur générale"
  else
    t.Text := '';
end;

procedure TLoadVars.onData(src: string);
begin
  t.Text := t.Text + src;
end;

begin
  t := TextField.Create(_root, '', 1, 0, 0, Stage.Width, Stage.Height);
  t.SetNewTextFormat(TextFormat.Create('Courier New', 12));
  TLoadVars.Create;
end.
Note que LoadVars est normalement utilisé pour lire des données formatées comme une URL "var1=data1&var2=data2", j'utilise "onData" qui permet d'avoir les données lues avant traitement.
Avatar de Paul TOTH
Expert éminent sénior https://www.developpez.com
Le 28/06/2012 à 14:30
ok

personnellement je déteste les fichiers XML

ok, donc l'objet XML est le point de départ, il est lui-même un XMLNode et en possède les méthodes et propriétés.

chaque élément entre <> du fichier XML sera un XMLNode

XMLNode.nodeName te permet d'avoir le texte entre les <> justement.
XMLNode.firstChild est le premier élément entre <node> et </node>
XMLNode.childNodes.length te donne le nombre de ces éléments
XMLNode.childNodes[i] est le ième élément

donc si on reprend le fichier
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
 
<game> 
 <lines> 
   <line x1="..." y1="..." x2="..." y2="..."/> 
 </lines> 
 <points> 
  <point x="..." y="..." type=".."/> 
 </points> 
</game>
on a un premier noeud (XML.firstChild) dont le nodeName est 'game'
il possède deux enfants (childNodes.length = 2)
XML.firstChild.childNodes[0] est le noeud 'lines'
XML.firstchild.childNodes[1] est le noeud points

ces deux noeuds possèdent une série d'enfants qui sont sous la forme abrégée <node/> qui correspond à <node></node> quand il n'y a rien entre les deux.

ces noeuds ont par contre des attributs. Sous ActionScript2 qui n'est pas fortement typé, on peut écrire "childNodes[i].attributes.x1" pour lire l'attribut x1 du noeud.

En flash Pascal "attributes" est un TObject qui ne possède donc aucune propriété...d'où le transtypage en TXMLLigne qui n'est jamais instancié mais qui donne les membres attendus.

Attention cependant, je vois que pour TXMLLigne j'ai déclaré des Integer, en fait c'est faux, ce sont des string...sauf que ça ne pose pas de problème à flash dans ce cas particulier car on les utilise directement dans des paramètres de type Number et flash fait tout seule la conversion.

pour TXMLPoint j'ai par contre déclaré des string et j'utilise StrToInt (qui est un alias de parseInt) pour les convertir en nombre, sinon l'opération "x + 18" concatène "18" au nombre placé dans x. 10 devient dont "1018" et non 28.

Pourquoi ce comportement ? tout simplement parce que Flash considère que l'attribut est un string; et un string + un entier (ce qui n'est pas autorisé en FlashPascal) se traduit par une concaténation de chaînes.

En indiquant dans FlashPascal que x est un string, on est obligé de passer par StrToInt qui forcera la conversion, sinon - peu importe ce que considère FlashPascal - Flash estime que c'est un string.

je ne sais pas si j'ai été clair, mais quoi qu'il en soit, il faut déclarer les classes permettant de lire "attributes" uniquement avec des string.
Avatar de Roland Chastain
Rédacteur/Modérateur https://www.developpez.com
Le 04/07/2012 à 19:17
Avec nodeValue en effet, et avec cette explication trouvée dans un tutoriel :

Code : Sélectionner tout
1
2
3
4
  WriteLn(PassNode.NodeValue); // ce sera vide
  // Le texte du nœud est réellement  un nœud enfant distinct
  WriteLn(PassNode.FirstChild.NodeValue); // affiche correctement "abc"
Maintenant mon exemple est à peu près complet.

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
procedure TXML.initialisation;
begin
  t := TextField.Create(nil, 't', 0, 10, 10, 380, 280);
  
  t.text := '1) ' + Self.firstChild.nodeName + #13;
  t.text := t.text + '2) ' + Self.firstChild.childNodes[0].nodeName + #13;
  t.text := t.text + '3) ' + Self.firstChild.childNodes[1].nodeName + #13;
  t.text := t.text + '4) ' + Self.firstChild.childNodes[0].childNodes[0].nodeName + #13;
  t.text := t.text + '5) ' + Self.firstChild.childNodes[0].childNodes[0].nodeValue + #13;
  t.text := t.text + '6) ' + Self.firstChild.childNodes[0].childNodes[0].localName + #13;
  t.text := t.text + '7) ' + IntToStr(Self.firstChild.childNodes.length) + #13;
  t.text := t.text + '8) ' + Self.firstChild.childNodes[0].childNodes[0].firstChild.nodeValue;
  
  // 1) developpez
  // 2) membre
  // 3) membre
  // 4) pseudo
  // 5) null
  // 6) pseudo
  // 7) 2
  // 8) darrylsite
  
  t.background := True;
  t.backgroundColor := $EBEBEB;
end;
Avatar de Paul TOTH
Expert éminent sénior https://www.developpez.com
Le 27/06/2012 à 13:48
les deux mon capitaine

alors t.Text[i] := ... n'est pas acceptable, tu peux modifier la propriété "Text" mais pas un caractère de celle-ci. ça reviendrait à lire, modifier puis réécrire la propriété Text: string en une seule opération...remarque pourquoi pas...mais non

Sous Delphi tu ne peux pas non plus écrire Edit1.Text[1] := 'z'...mais tu peux faire un if Edit1.Text[1] = 'z' tu extrais un caractère de la chaîne lue...ça marche.

d'autre part, tu peux ne pas affecter une chaîne vide à un caractère pour le supprimer. la syntaxe Pascal serait Delete(s, i, 1)...mais elle n'est pas supportée par FlashPascal pour l'instant.
Avatar de Roland Chastain
Rédacteur/Modérateur https://www.developpez.com
Le 27/06/2012 à 15:46
Citation Envoyé par Paul TOTH  Voir le message
alors t.Text[i] := ... n'est pas acceptable, tu peux modifier la propriété "Text" mais pas un caractère de celle-ci. ça reviendrait à lire, modifier puis réécrire la propriété Text: string en une seule opération...remarque pourquoi pas...mais non

Sous Delphi tu ne peux pas non plus écrire Edit1.Text[1] := 'z'...mais tu peux faire un if Edit1.Text[1] = 'z' tu extrais un caractère de la chaîne lue...ça marche.

C'est compris. Voici mon code pour éliminer les sauts de lignes indésirables :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TLoadVars.onData(src: string); 
var 
  temp: string; 
  i: Integer; 
begin 
  temp := ''; 
  for i := 1 to Length(src) do 
  begin 
    if ord(src[i])=10 then 
      temp := temp 
    else 
      temp := temp + src[i]; 
  end; 
  t.text := temp; 
end;
J'ai chargé un fichier texte assez long et j'ai eu la bonne surprise de pouvoir faire défiler le texte de haut en bas avec la roulette de la souris.

Citation Envoyé par Paul TOTH  Voir le message
d'autre part, tu peux ne pas affecter une chaîne vide à un caractère pour le supprimer. la syntaxe Pascal serait Delete(s, i, 1)...mais elle n'est pas supportée par FlashPascal pour l'instant.

Celle-là je la fais à chaque fois ! C'est pourtant logique : un tableau peut être vide, un caractère ne peut pas être... rien.

J'imagine que la procedure Delete() fait à peu près la même chose que le code ci-dessus : elle refait toute la chaîne en déplaçant les éléments. Cette fois je crois que c'est rentré.
Avatar de Paul TOTH
Expert éminent sénior https://www.developpez.com
Le 27/06/2012 à 16:04
t'as tout compris

et j'aime beaucoup ton temp := temp, on sait jamais
Avatar de Paul TOTH
Expert éminent sénior https://www.developpez.com
Le 04/07/2012 à 14:21
avec nodeValue peut-être ?
Avatar de Roland Chastain
Rédacteur/Modérateur https://www.developpez.com
Le 26/06/2012 à 23:35
Excellent exemple, très pédagogique. On peut imaginer une multitude de variations sur la base de ce code.

Je trouve particulièrement intéressante l'utilisation du fichier XML. J'ai découvert à cette occasion ce format que je ne connaissais que de nom : ça m'a tout de suite plu. Merci aux auteurs !

A propos de fichiers, qu'en est-il des fichiers .txt ? Actuellement a-t-on la possibilité de les utiliser ?
Avatar de Roland Chastain
Rédacteur/Modérateur https://www.developpez.com
Le 27/06/2012 à 9:56
Merci pour le code et les explications.
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.