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

Delphi Discussion :

Ajouter un Evenement sur des composants appartenant à des form differentes


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut Ajouter un Evenement sur des composants appartenant à des form differentes
    Salut,

    Voici mon problème: En m'inspirant de la FAQ, je souhaitais autoriser uniquement la saisie des chiffres dans mes TEdit en utilisant ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Procedure SelectionNumeriqueOnEdit(Sender: TObject;var Key: char);
    Begin
      If not (Key in ['0'..'9', DecimalSeparator, Chr(VK_BACK), Chr(VK_DELETE)]) then
      Key := #0;
      if Key = DecimalSeparator then
        if Pos(DecimalSeparator, (Sender AS TEdit).Text) <> 0 then
          Key := #0;
    End;
    Qui fonctionne nickel si j'écris ma procédure dans l'unité qui contient mon TEdit.

    Mais en plaçant cette procédure (en public) dans une unité globale, et en tentant, pour chaque form, t'utiliser findcomponent (et IS TEDit) pour appliquer cette procédure à tous mes évènements OnKeyPress de mes Edits, ça ne passe pas.

    Même si j'execute ce code sur un seul de mes Edit (qui est sur Form1 par exemple):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Edit1.OnKeyPress:= TGlobale.SelectionNumeriqueOnEdit;
    j'ai un message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Erreur]E2009 Types incompatibles : 'pointeur de méthode et procédure normale'
    Quelqu'un saurait-il comment affecter ma procedure à tous mes Edits, quelque soit leurs form sur laquelle ils se situent?

    Merci pour tout,

    A+.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 001
    Par défaut
    Essaye

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class Procedure TStandardEvent.SelectionNumeriqueOnEdit(Sender: TObject;var Key: char);
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre émérite Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Par défaut
    Salut,

    Je vois pas trop l'interet de la manoeuvre mais bon moi je ferai un truc comme ca

    un singleton appele Global dans un unite pour lui tout seul

    voici l'interface

    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
     
    type
      TGlobal = class
      private
        FFormList: TList;
        procedure TraitementEditForm(AForm: TForm);
        procedure SetEventToEdit(const Edit: TEdit; const E: TKeyPressEvent);
        procedure KeyPress(Sender: TObject;var Key: char);
      public
        constructor Create;
        destructor destroy; override;
        procedure AddForm(AForm: TForm);
        procedure RemoveForm(AForm: TForm);
      end;
     
    function Global: TGlobal;
    et son implementation

    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
    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
     
    var
      GGlobal: TGlobal = nil;
     
    function Global: TGlobal;
    begin
      if not Assigned(GGlobal) then
        GGlobal := TGlobal.Create;
      Result := GGlobal;
    end;
     
     
    { TGlobal }
     
    procedure TGlobal.AddForm(AForm: TForm);
    begin
      FFormList.Add(AForm);
      TraitementEditForm(AForm);
    end;
     
    constructor TGlobal.Create;
    begin
      FFormList := TList.Create;
    end;
     
    destructor TGlobal.Destroy;
    begin
      FFormList.Free;
      inherited;
    end;
     
    procedure TGlobal.KeyPress(Sender: TObject; var Key: char);
    begin
       Showmessage('test'); //pour test
       //ta procedure ici
    end;
     
    procedure TGlobal.RemoveForm(AForm: TForm);
    begin
      FFormList.Remove(AForm);
    end;
     
    procedure TGlobal.SetEventToEdit(const Edit: TEdit; const E: TKeyPressEvent);
    begin
      Edit.OnKeyPress := E;
    end;
     
    procedure TGlobal.TraitementEditForm(AForm: TForm);
    var
      i: integer;
      c: TControl;
    begin
      for i := 0 to AForm.ControlCount - 1 do
      begin
        c := AForm.Controls[i];
        if c.InheritsFrom(TCustomEdit) then
          SetEventToEdit(c as TEdit, KeyPress);
      end;
    end;
    ensuite pour utiliser ca il suffit de faire sur la form que tu veux traiter :
    dans son evenement OnCreate il suffit de taper:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Global.AddForm(Self);
    end;
    ceci traite tous les Edit de la form et associe l'evenement KeyPress

    evidemment ce code peut être enrichi par exemple en traitant d'autre evenement

    voila jespere que c'est ce que tu veux

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Edit1.OnKeyPress:= TGlobale.SelectionNumeriqueOnEdit;
    Moi j'aurais essayé de faire de façon similaire à la gestion d'événements déclenchés par un Edit que l'on aurait créé de façon dynamique ce qui aurait abouti à la ligne de code Edit1.OnKeyPress:=TGlobale.EditBaseKeyPress; dans les unités autres que la globale. EditBase étant le nom d'un Edit de la fiche-globale, et EditBaseKeyPress celui de la procédure TFormeGlobale.EditBaseKeyPress(Sender: TObject; var Key: Char);
    Ensuite j'aurais essayé si cela marche :
    - d'abord en laissant la déclaration de cette procedure qui figure dans le type TFormeGlobale à la place que lui assigne automatiquement Delphi,
    - et ensuite en déplaçant cette déclaration dans la rubrique des Déclarations publiques.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #5
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Salut

    Citation Envoyé par padawan
    j'ai un message d'erreur:
    Code :

    [Erreur]E2009 Types incompatibles : 'pointeur de méthode et procédure normale'
    Bien que les procédures soit définie avec le même typage, une procédure hors classe, et une procédure dans une classe (donc une méthode) ne sont pas du même type. (le 'of object' précise qu'il attend une méthode et non une procédure indépendante).

    Il faut que ta procédure soit définie dans une classe.
    - soit dans une classe accessible depuis partout (l'exemple cité visiblement)
    - soit dans une form ancêtre à toutes tes formes
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  6. #6
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut
    Tout d'abord merci de vous être interesser à mon problème:

    @ShaiLeTroll:
    j'ai tester ta méthode, mais j'ai reçu un message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Le projet SimalimAC.exe a déclenché la classe d'exception EInvalidCast avec le message 'Transtypage de classe incorrect'.
    Apparamment il n'aime pas mon "sender as TEdit".... quand je veux entrer un séparateur décimal.

    @Kaféine:
    Je vois pas trop l'interet de la manoeuvre mais bon moi je ferai un truc comme ca
    Le but de la manoeuvre c'était de ne pas réécire pour mes 20 fiches la procédure OnKeyPress. Ton idée de créer une unité globale qui gère la création et la destruction des fiches du projet est intéressante, mais je crois que ça apporterait autant de changement (Show, ShowModal...), non ?

    @Gilbert Geyer:
    Désolé, si je déplace la déclaration, Delphi devient fou...

    @TicTacToe
    Effectivement, mon but était d'accéder à cette procédure depuis une class "commune", parceque reprendre tout l'héritage de mes formes c'était pas dans mes projets à court terme...
    Parceque si je devais repartir à zéro j'aurais creer un composant descendant de TEdit ayant cette fonctionnalité...Mais bon, le projet est trop avancé et trop en retard pour tout refaire.

    A+.

  7. #7
    Membre émérite Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Par défaut
    Le but de la manoeuvre c'était de ne pas réécire pour mes 20 fiches la procédure OnKeyPress
    Ok monsieur manque de courage

    Ton idée de créer une unité globale qui gère la création et la destruction des fiches du projet
    heu je gere pas la destruction et creation des fiches
    j'ajoute juste la fiche en cours a mon objet global et je le fais lors de la creation de la fiche en cours cest tout

  8. #8
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut
    Ok, j'avais pas compris le code...Je vais le tester de suite alors.

    Ok monsieur manque de courage
    Ouais, je voulais faire le fainéant (on approche du WE).

  9. #9
    Membre émérite Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Par défaut
    voici le code complet si tu veux

  10. #10
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Comme ça bouge vite ici, voir mon message de 14h47 : code simple et qui marche.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  11. #11
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    J'ai vite vérifié et cela marche.

    Dans l'unité Globale liée à une 1ère Form j'ai mis le code :
    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
     
    procedure TfrmTraceCourbe.edXKeyPress(Sender: TObject; var Key: Char);
    //Procedure SelectionNumeriqueOnEdit(Sender: TObject;var Key: char);
    Begin
      If not (Key in ['0'..'9', DecimalSeparator, Chr(VK_BACK), Chr(VK_DELETE)]) then
      Key := #0;
      if Key = DecimalSeparator then
        if Pos(DecimalSeparator, (Sender AS TEdit).Text) <> 0 then
          Key := #0;
    End;
     
    procedure TfrmTraceCourbe.Button1Click(Sender: TObject);
    begin     Form3.show;
     
    end;
    ... et dans une unité secondaire liée à ma Form3 le code :

    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
    26
    27
    28
    29
    30
    31
    32
    unit uSecondaire;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;
    
    type
      TForm3 = class(TForm)
        Edit1: TEdit;
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
    
    var
      Form3: TForm3;
    
    implementation
    
    {$R *.DFM}
    
    uses uTraceCourbe2;
    
    procedure TForm3.FormCreate(Sender: TObject);
    begin     Edit1.OnKeyPress:=frmTraceCourbe.edXKeyPress;
    
    end;
    end.
    ... suffit de remplacer les noms de mes gadgets par ceux des tiens et cela devrait également marcher ailleurs (si ça marche sous D5 ça doit marcher ailleurs)

    J'ai fait l'essai car je suis friands des trucs qui permettent d'économiser des lignes de code.

    P.S : Il n'a même pas été nécessaire de déplacer la déclarartion de ma procédure procedure edXKeyPress(Sender: TObject; var Key: Char); dans la rubrique des Déclarations publiques.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

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

Discussions similaires

  1. ajouter des composants "riches" à des pages JSF
    Par olivier57b dans le forum JSF
    Réponses: 2
    Dernier message: 03/03/2010, 17h11
  2. appel des composants appartenants à page dans une autre
    Par mariooma dans le forum Silverlight
    Réponses: 1
    Dernier message: 04/12/2008, 22h52
  3. Composant connectant des bloc avec des splines
    Par Jeff Nodrev dans le forum wxWidgets
    Réponses: 4
    Dernier message: 18/03/2008, 14h35
  4. For each sur Composant ? Initialiser des composants.
    Par 19cmos83 dans le forum Interfaces Graphiques en Java
    Réponses: 8
    Dernier message: 11/10/2007, 11h02
  5. Centrer des composants dans une form?
    Par alg_dev dans le forum Delphi
    Réponses: 1
    Dernier message: 10/06/2007, 10h24

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