Traquer les bugs

Classe d'affichage de traces

Suite à une discussion avec Xuxu, j’ai décidé de poster un petit article sur une classe que j’avais développé pour me permettre de récupérer des traces que j’avais disséminé dans mon code.

La propriété trace() Flash est certes pratique mais elle ne nous permet pas d’effectuer un suivis des traces lorsque l’animation est publiée sur le web ou au sein d’un exécutable, pour mes besoins personnels j’avais donc sorti ce petit afficheur de traces.

Après un dépoussiérage en règle (merci à Néolao en passant) je vous la communique :

  1. /**

  2. * Visual tracer VisualTracers

  3. * @author lcharpentier (onblogevent.com)

  4. *

  5. * Events registered :

  6. * onAlert : by displaying an alert

  7. * onClose : by closing the VisualTracer’s window

  8. */

  9. import com.tekool.utils.Relegate;

  10. import mx.events.EventDispatcher;

  11. class com.loctar.utils.VisualTracer {

  12. private var _loaded:Boolean;

  13. private static var _support:MovieClip;

  14. private static var _depth:Number;

  15. private static var dispatchEvent:Function;

  16. public static var addEventListener:Function;

  17. public static var removeEventListener:Function;

  18. private static var _clip:MovieClip;

  19. private static var _arrMsg:Array;

  20. private static var _hWindow:Number;

  21. private static var _wWindow:Number;

  22. /**

  23. * Constructor

  24. */

  25. public static function init(mc:MovieClip) {

  26. if ( _support==undefined) {

  27. _support = mc;

  28. }

  29. _arrMsg = new Array();

  30. EventDispatcher.initialize(VisualTracer);

  31. }

  32. /**

  33. * Show the tracking tool

  34. */

  35. public static function show() {

  36. if(_clip!=undefined)

  37. _clip._visible = true;

  38. }

  39. /**

  40. * Hide the tracking tool

  41. */

  42. public static function hide() {

  43. if(_clip!=undefined)

  44. _clip._visible = false;

  45. }

  46. /**

  47. * Show the message in a Window and dispatch an alert

  48. * @param s String

  49. */

  50. public static function alert(s:String) {

  51. if (_clip == undefined) {

  52. buildWindow();

  53. }

  54. _arrMsg.push(s);

  55. var x:Number = 20;

  56. var y:Number = clip.height/2;

  57. var w:Number = 300;

  58. var h:Number = 20;

  59. _clip.strMsg.text = “”;

  60. for (var i:Number = 0; i<_arrMsg.length; i++) {

  61. _clip.strMsg.text += “[“i“.] < “_arrMsg[i]” >n;

  62. }

  63. dispatchEvent({type:“onAlert”, target:VisualTracer});

  64. }

  65. /**

  66. * Build the VisualTracer’s window

  67. */

  68. private static function buildWindow() {

  69. _clip = support.createEmptyMovieClip(“VisualTracerWindow”, support.getNextHighestDepth());

  70. var fond:MovieClip = _clip.createEmptyMovieClip(“fond”, 1);

  71. var barre:MovieClip = _clip.createEmptyMovieClip(“barre”, 2);

  72. var close:MovieClip = _clip.createEmptyMovieClip(“close”, 3);

  73. var bouton:MovieClip = _clip.createEmptyMovieClip(“bouton”, 4);

  74. _wWindow = 400;

  75. _hWindow = 250;

  76. drawRectangle(fond, 0xEBEBEB, 0×999999, 0, 0, wWindow, hWindow);

  77. drawRectangle(barre, 0xCCCCCC, 0×999999, 0, 0, _wWindow, 20);

  78. drawRectangle(close, 0xCC0000, 0xFFFFFF, _wWindow-16, 4, 12, 12);

  79. var strFt1:TextFormat = new TextFormat();

  80. strFt1.font = “Arial”;

  81. strFt1.color = 0xDC241F;

  82. strFt1.size = 18;

  83. strFt1.bold = true;

  84. var strFt2:TextFormat = new TextFormat();

  85. strFt2.font = “Arial”;

  86. strFt2.color = 0×000000;

  87. strFt2.size = 12;

  88. strFt2.bold = true;

  89. var strFt3:TextFormat = new TextFormat();

  90. strFt3.font = “Arial”;

  91. strFt3.color = 0×000000;

  92. strFt3.italic = true;

  93. strFt3.size = 12;

  94. _clip.createTextField(“strVisualTracer1”, _clip.getNextHighestDepth(), 10, 30, 10, 10);

  95. var strVisualTracer1:TextField = _clip.strVisualTracer1;

  96. strVisualTracer1.selectable = false;

  97. strVisualTracer1.autoSize = “left”;

  98. strVisualTracer1.text = “WARNING : An error occured”;

  99. strVisualTracer1._height = strVisualTracer1.textHeight;

  100. strVisualTracer1.setTextFormat(strFt1);

  101. _clip.createTextField(“strVisualTracer2”, _clip.getNextHighestDepth(), 10, 50, 10, 10);

  102. var strVisualTracer2:TextField = _clip.strVisualTracer2;

  103. strVisualTracer2.selectable = false;

  104. strVisualTracer2.autoSize = “left”;

  105. strVisualTracer2.text = “Please report this error to technical support :”;

  106. strVisualTracer2.setTextFormat(strFt2);

  107. _clip.createTextField(“strMsg”, clip.getNextHighestDepth(), 30, 90, wWindow-60, _hWindow-110);

  108. var strMsg:TextField = _clip[“strMsg”];

  109. strMsg.border = true;

  110. strMsg.borderColor = 0×000000;

  111. strMsg.background = true;

  112. strMsg.backgroundColor = 0xFFFFFF;

  113. strMsg.selectable = true;

  114. strMsg.wordWrap = true;

  115. strMsg.mouseWheelEnabled = true;

  116. strMsg.setTextFormat(strFt3);

  117. strMsg.type = “dynamic”;

  118. _clip.close.onPress = Relegate.create(VisualTracer, closeWindow);

  119. drag = true;

  120. }

  121. private static function drawRectangle(mc:MovieClip, color:Number, lineColor:Number, x:Number, y:Number, w:Number, h:Number) {

  122. mc.beginFill(color, 100);

  123. mc.lineStyle(1, lineColor, 100);

  124. mc.moveTo(x, y);

  125. mc.lineTo(x+w, y);

  126. mc.lineTo(x+w, y+h);

  127. mc.lineTo(x, y+h);

  128. mc.lineTo(x, y);

  129. mc.endFill();

  130. }

  131. /**

  132. * Allow the user to move the window

  133. * @param w Number represents the window’s width

  134. * @param w Number represents the window’s height

  135. */

  136. private static function moveWindow(w:Number, h:Number) {

  137. _clip.startDrag(false, 0, 0, Stage.widthw, Stage.heighth);

  138. _clip._alpha = 50;

  139. }

  140. private static function releaseWindow() {

  141. _clip.stopDrag();

  142. _clip._alpha = 100;

  143. }

  144. private static function closeWindow() {

  145. dispatchEvent({type:“onClose”, target:VisualTracer});

  146. }

  147. /**

  148. * Getters & Setters

  149. */

  150. public static function set drag(b:Boolean) {

  151. _clip.barre.onPress = (b) ? Relegate.create(VisualTracer, moveWindow, wWindow, hWindow) : undefined;

  152. _clip.barre.onRelease = (b) ? Relegate.create(VisualTracer, releaseWindow) : undefined;

  153. _clip.barre.onReleaseOutside = (b) ? Relegate.create(VisualTracer, releaseWindow) : undefined;

  154. }

  155. public static function get cible():MovieClip {

  156. return _support;

  157. }

  158. /**

  159. * Destructor

  160. */

  161. public static function destroy():Void {

  162. delete (_support);

  163. delete (_arrMsg);

  164. }

  165. /**

  166. * Display the class name

  167. */

  168. public static function toString(Void):String {

  169. return “lib.tool.VisualTracer”;

  170. }

  171. }

Que l’on peut utiliser à loisir de cette facon :

  1. import com.loctar.utils.VisualTracer;

  2.  

  3. VisualTracer.init(this);

  4.  

  5. /**

  6. * Optional : VisualTracer allows you to track two kinds of events

  7. */

  8. VisualTracer.addEventListener(“onAlert”, alertMsg);

  9. VisualTracer.addEventListener(“onClose”, alertMsg2);

  10.  

  11. function alertMsg() {

  12. trace(“my first alert”);

  13. }

  14. function alertMsg2() {

  15. VisualTracer.closed = true;

  16. }

  17.  

  18. var i:Number = 2

  19. VisualTracer.alert(“my value : “+i);

Aperçu :

Illustration du VisualTracer

Pour une utilisation optimale de cette classe je vous conseille de l’utiliser conjointement à la classe Debug créée par Lalex (depuis un certain temps déjà) qui vous permettra de faire un dump de vos données.

Il faudra cependant faire une petite modification en rendant publique la méthode statique : dumpToString() ...

  1. import com.loctar.utils.VisualTracer;

  2. import com.lalex.utils.Debug;

  3. VisualTracer.init(this);

  4. VisualTracer.addEventListener(“onAlert”, alertMsg);

  5. VisualTracer.addEventListener(“onClose”, alertMsg2);

  6. function alertMsg() {

  7. trace(“my first alert”);

  8. }

  9. function alertMsg2() {

  10. VisualTracer.hide();

  11. }

  12.  

  13. var obj:Object = new Object()

  14. obj.a = new Array(1,2,3,4,5);

  15. obj.b=“test”;

  16.  

  17. VisualTracer.alert(Debug.dumpToString(obj));

Bref, une petite classe toute simple qui peut toutefois en dépanner certains !

Télécharger VisualTracer-1.zip

Note : Utilisation de la classe Relegate de Tekool (Delegation avec passage de paramètres)

Si vous avez apprécié cet article, s'il vous plait, prenez le temps de laisser un commentaire ou de souscrire au flux afin de recevoir les futurs articles directement dans votre lecteur de flux.

Commentaires

Je crois que t’as fait une faute d’orthographe, ligne 79.
Trop fort ce Loic …
moi j’y comprends rien du tout …

Moi aussi Xhan. :)

Laisser un commentaire

(requis)

(requis)