IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Erreur avec Application.OnMessage


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut Erreur avec Application.OnMessage
    Bonjour à toutes et à tous,

    J'ai enfin trouvé d'où venai une erreur mais je ne sais pas la corriger.

    Dans une form en showmodal je déclare cela :

    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
    procedure TFFicheClient.FormCreate(Sender: TObject);
    begin
    //...
      Application.OnMessage := ApplicationMessage;
    //...
    end;
     
    procedure TFFicheClient.ApplicationMessage(var msg: TMsg; var Handled: boolean);
    begin
      if Msg.message = WM_KEYDOWN then
      begin
        if Msg.wParam = VK_TAB then
        begin
          if Msg.hwnd = DBEdit3.Handle then TabsheetCoordonnees.SetFocus;
        end;
      end;
    end;
    Sur chaque composant DBEDIT je gere la passage de zone en zone comme ceci
    (toujours la même form)

    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
    18
    19
    20
    21
    22
    23
    24
    procedure TFFicheClient.DBEditKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if (ActiveControl is TCustomEdit) or (ActiveControl is TCustomComboBox) then
      Begin
        case Key of
          VK_DOWN, VK_NEXT, VK_RETURN, VK_TAB: SetFocusNextEdit;
          VK_UP, VK_PRIOR: SetFocusPreviousEdit;
        end;
      end;
    end;
    procedure TFFicheClient.SetFocusNextEdit;
    begin
      repeat
        Perform(WM_NEXTDLGCTL, 0, 0);
      until (ActiveControl is TDBEdit) or (ActiveControl is TsCustomComboBox) ;
    end;
     
    procedure TFFicheClient.SetFocusPreviousEdit;
    begin
      repeat
        Perform(WM_NEXTDLGCTL, -1, 0);
      until (ActiveControl is TDBEdit) or (ActiveControl is TsCustomComboBox);
    end;
    Tous ce passe trés bien dans cette form, je ferme cette form et j'en ouvre une autre qui ne comporte pas de OnMessage

    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
    18
    19
    20
    21
    22
    23
    24
    25
    procedure TFFicheEquipe.DBEditKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if ActiveControl is TCustomEdit  then
      Begin
        case Key of
          VK_DOWN, VK_NEXT, VK_RETURN, VK_Tab: SetFocusNextEdit;
          VK_UP, VK_PRIOR: SetFocusPreviousEdit;
        end;
      end;
    end;
     
    procedure TFFicheEquipe.SetFocusNextEdit;
    begin
      repeat
        Perform(WM_NEXTDLGCTL, 0, 0);
      until ActiveControl is TDBEdit;
    end;
     
    procedure TFFicheEquipe.SetFocusPreviousEdit;
    begin
      repeat
        Perform(WM_NEXTDLGCTL, -1, 0);
      until ActiveControl is TDBEdit;
    end;
    Déclaration totalement classique.
    Mais si j'utilise pa exemple la touche TAB pour passer d'une zone à l'autre BOOM un excpetion est levée :

    Violation d'accès à l'adresse 004A5217 dans le module 'xxxxxxxx.exe'. Lecture de l'adresse 0000024C

    Lorsque sur la première form au dessus je retire tout le systeme de OnMessage je n'ai aucune erreur !!!
    Si j'utilise la deuxième form sans jamais utilisé la première aucun problème.
    Mais dés que je rentre dans cette form Boom.

    Avez-vous une idée du problème ?
    Peux-t-on stopper un Onmessage ? où isolé celui-ci sur une form ?

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    J'ai très bien compris ton problème, je ne sais pas si mes explications seront claires, mais je vais essayer.

    procedure TFFicheClient.FormCreate(Sender: TObject);
    begin
    //...
    Application.OnMessage := ApplicationMessage;
    //...
    end;
    Quand tu affectes ton message ci-dessus, il concerne ton application dans sa totalité.

    Il faut donc, à la fermeture de ta fiche ShowModal, mettre Application.onMessage à nil.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
      CanClose := True
      Application.OnMessage := nil;
    end;
    J'ai eu le même souci que toi, il y a quelques jours pour une application ayant une série de fiches fonctionnant en simultanées. Donc, je m'y suis collé pour trouver la cause. Après cette correction, je n'ai plus aucun souci

    @+

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Après pas mal de recherche j'ai vue qu'il fallait placer un

    Handled := True;

    Mais cela ne change rien...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TFFicheClient.ApplicationMessage(var msg: TMsg; var Handled: boolean);
    begin
      if Msg.message = WM_KEYDOWN then
      begin
        if Msg.wParam = VK_TAB then
        begin
          if Msg.hwnd = DBEdit3.Handle then TabsheetCoordonnees.SetFocus;
          Handled := True;
        end;
      end;
    end;
    Cela ne change rien même si je le met dans le if then

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TFFicheClient.ApplicationMessage(var msg: TMsg; var Handled: boolean);
    begin
      if Msg.message = WM_KEYDOWN then
      begin
        if Msg.wParam = VK_TAB then
        begin
          if Msg.hwnd = DBEdit3.Handle then 
          begin
            TabsheetCoordonnees.SetFocus;
            Handled := True;
          end;
        end;
      end;
    end;

  4. #4
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par seabs Voir le message
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
      CanClose := True
      Application.OnMessage := nil;
    end;
    @+
    Parfait, cela corrige mon problème.
    Je l'ai placé dans mon OnClose car le Mon OnCloseQuery s'execute avant.

    Merci à toi.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur de type avec Application.Run(new Form1());
    Par tipa42 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 23/03/2010, 13h51
  2. Réponses: 12
    Dernier message: 02/07/2009, 07h46
  3. Réponses: 3
    Dernier message: 19/06/2009, 12h09
  4. Erreur "L'application n'est pas installée" avec ClickOnce
    Par Ishizaki dans le forum Windows Forms
    Réponses: 1
    Dernier message: 21/05/2008, 15h15
  5. [VBA][EXCEL]Erreur '1004' avec "Application.Run"
    Par Ania dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/01/2006, 10h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo