CORRECTIF : Appeler Cursor.setPosition cas de défaillance de NT à l’aide de la méthode showDialog

SYMPTÔMES

Lorsqu’une application appelle Cursor.setPosition dans le constructeur d’un formulaire avant la création du handle et le formulaire est affiché à l’aide de la méthode showDialog, WinNT/SP3 ou Windows 98 va verrouiller complètement, ce qui vous oblige à redémarrer le système.

Résolution

Vous pouvez contourner le problème de la manière suivante :


  • Au lieu d’utiliser ShowDialog() utiliser show() dans le code commenté dans l’exemple ci-dessous.
  • Ajouter un événement onCreateHandle() pour le formulaire et appelez Cursor.setPosition() dans le code d’événement createhandle comme indiqué dans le code commenté ci-dessous.

ÉTAT

Microsoft a confirmé qu’il s’agit d’un bogue dans les produits Microsoft répertoriés au début de cet article.

Ce bogue a été corrigé dans Visual Studio 6.0 Service Pack 3.

Pour plus d’informations sur les service packs de Visual Studio, consultez les articles suivants dans la Base de connaissances Microsoft :

194022 INFO : Service Packs de Visual Studio 6.0, quoi, où, pourquoi

194295 HOWTO : indiquer que les Service Packs de Visual Studio 6.0 sont installés.

Plus d'informations

Procédure pour reproduire le comportement

  1. Créer un nouveau projet d’Application Windows à l’aide de VJ ++ 6.0.
  2. Dans le constructeur du formulaire, sont les suivants :
    public Form1(){   super();   new Form2().showdlg(5000);   initForm();}
  3. Sélectionnez Project.AddForm et créer un autre formulaire appelé Form2.java et ajoutez le code suivant :
    import com.ms.wfc.app.*;import com.ms.wfc.core.*;import com.ms.wfc.ui.*;import com.ms.wfc.html.*;public class Form2 extends Form{   public Form2()   {      super();      initForm();          //WorkAround1:      //  uncomment the line below and comment out the next three lines      //addOnCreateHandle(new EventHandler(createHandle));      Rectangle r = getClientRect ();      Point p = new Point (r.x + r.width / 2, r.y + r.height / 2);      Cursor.setPosition (pointToScreen (p));   }   private void createHandle(Object source, Event e)   {      Rectangle r = getClientRect ();      Point p = new Point (r.x + r.width / 2, r.y + r.height / 2);      Cursor.setPosition (pointToScreen (p));   }   public void dispose()   {      super.dispose();      components.dispose();   }   public void showdlg(int time)   {      if(time>=0)         splashTimer.setInterval(time);      splashTimer.setEnabled(true);      //WORKAROUND2:      //   uncomment the line below and comment out the next line      //show();       this.showDialog();   }   private void splashTimer_timer(Object source, Event e)   {      splashTimer.setEnabled(false);      this.dispose();   }   /**    * NOTE: The following code is required by the Visual J++ form    * designer. It can be modified using the form editor. Do not    * modify it using the code editor.    */    Container components = new Container();   Timer splashTimer = new Timer(components);   private void initForm()   {      this.setText("SplashScreen");      this.setAutoScale(false);      this.setAutoScaleBaseSize(new Point(5, 13));      this.setBorderStyle(FormBorderStyle.NONE);      this.setClientSize(new Point(418, 298));      this.setControlBox(false);      this.setShowInTaskbar(false);      this.setStartPosition(FormStartPosition.CENTER_SCREEN);      this.setTopMost(true);      splashTimer.setInterval(2500);      splashTimer.addOnTimer(new EventHandler(this.splashTimer_timer));      /* @designTimeOnly splashTimer.setLocation(new Point(324, 200)); */       this.setNewControls(new Control[] {});   }   /**    * The main entry point for the application.     *    * @param args Array of parameters passed to the application    * via the command line.    */    public static void main(String args[])   {      Application.run(new Form2());   }}
  4. Générez et exécutez le projet. Vous remarquerez que l’application se bloque le système au point lorsque le formulaire est affiché lors de l’appel de la méthode showDialog.

RÉFÉRENCES

Pour des informations sur Visual J ++ et SDK pour Java, visitez le site Web de Microsoft à l’adresse suivante :
Propriétés

ID d'article : 223341 - Dernière mise à jour : 15 févr. 2017 - Révision : 1

Microsoft Visual J++ 6.0 Édition standard

Commentaires