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 :

Lancer une méthode d'une classe Owner


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 28
    Points : 25
    Points
    25
    Par défaut Lancer une méthode d'une classe Owner
    Bonjour,

    Voici mon problème en version simplifié : j'ai une unité principale de la forme suivante :

    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
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Unit2;
     
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure Refresh;
      private
        Object1: TMyClass;
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Object1 := TMyClass.Create(self);
    end;
     
    procedure TForm1.Refresh;
    begin
      // instruction de la méthode
    end;
     
    end.
    qui utilise une autre unité suivante :

    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
     
    unit Unit2;
     
    interface
     
    uses Classes;
     
    type
      TMyClass = class(TComponent)
    private
      procedure Methode1(s: string);
    end;
     
    implementation
     
    procedure Methode1(s: string);
    begin
      // Ici je voudrais lancer la méthode Refresh de ma Form1, mais comment ?
    end;
     
    end.

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    A la louche, tu aurais ceci:
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs,
    Unit2, StdCtrls;

    type
    TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Refresh(s: string);
    procedure Button1Click(Sender: TObject);
    private
    { Déclarations privées }
    Object1: TMyClass;
    public
    { Déclarations publiques }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    Object1 := TMyClass.Create(self);
    end;

    procedure TForm1.Refresh(s: string);
    begin
    ShowMessage(s);
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    Object1.GoRefresh;
    end;

    end.
    et cela :
    unit Unit2;

    interface

    uses Classes;

    type
    TMyClass = class(TComponent)
    private
    procedure Methode1(s: string);
    public
    procedure GoRefresh;
    end;

    implementation

    uses
    Unit1;

    procedure TMyClass.GoRefresh;
    begin
    self.Methode1('Refresh !');
    end;

    procedure TMyClass.Methode1(s: string);
    begin
    // Attention, Il faudrait rajouter des tests:
    // Owner <> nil
    // Owner is TForm1
    // etc, etc
    (self.Owner as TForm1).Refresh(s);
    end;

    end.
    A adapter selon tes besoins...

    Philippe.
    Philippe.

  3. #3
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    sauf erreur, l'astuce c'est de mettre une clause uses dans la partie implementation (et non dans 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
    17
    18
    19
     unit Unit2;
    interface
    uses Classes;
     
    type
      TMyClass = class(TComponent)
    private
      procedure Methode1(s: string);
    end;
     
    implementation
    uses Unit1 ;
    procedure Methode1(s: string);
    begin
     // Ici je voudrais lancer la méthode Refresh de ma Form1,
    Form1.refresh.
    end;
     
    end.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  4. #4
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Ce genre de comportement peut aussi dans certains cas être résolu en créant un événement. Cette solution peut parfois s'avérer très pratique voire simplifier l'utilisation du code quand celui-ci commence à devenir important.

    Un autre avantage c'est que l'unité qui accueille TMyClass reste bien indépendante de toute autre unité cela favorise encore la réutilisation.

    Donc voilà comment cela fonctionne:

    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
    interface
    uses classes;
    type
      TMyClass = class(TComponent)
      private
        FonRefresh: TNotifyEvent;
    public
        property onRefresh:TNotifyEvent read FonRefresh write FonRefresh;
        procedure refresh;
      procedure maProc;
    end;
    implementation
     
    { TMyClass }
     
    procedure TMyClass.refresh;
    begin
      // On execute l'événement si est assigné
      if assigned(FonRefresh)
        then FonRefresh(Self);
    end;
     
    procedure TMyClass.maProc;
    begin
      refresh;
    end;
     
    end.
    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
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, unit2, StdCtrls;
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button2Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        object1 : TMyClass;
        procedure doRefresh(Sender: TObject);
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    { TForm1 }
     
    procedure TForm1.doRefresh(Sender: TObject);
    begin
      //On définit ici la ce que doit faire refresh et une seule fois pour toute
      showMessage('refresh');
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      object1 := TMyClass.Create(Self);
    //L'événement Refresh pour TMyObject
      object1.onRefresh := doRefresh;
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      object1.onRefresh := nil;
      object1.Free;
    end;
     
    // POUR EXEMPLE
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      doRefresh(Sender);
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      object1.refresh;
    end;
    Cordialement
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 28
    Points : 25
    Points
    25
    Par défaut
    Merci pour vos réponses. J'ai adopté la méthode avec les événements car elle me parrait la plus élégante (indépendance).

    Je rajouterais juste pour mémoire que si nôtre événement prends des paramètres, il faut définir un type de cet façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    type
      TRefreshEvent = procedure(Sender: TObject; a: int) of object;
    et ensuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    property onRefresh: TRefreshEvent read FonRefresh write FonRefresh;
    procedure Refresh(Sender: TObject; a: int);

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/09/2009, 18h42
  2. modifier un élément d'une form dans une méthode d'une autre form
    Par baldebaran dans le forum Windows Forms
    Réponses: 9
    Dernier message: 14/08/2009, 13h59
  3. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  4. Réponses: 6
    Dernier message: 20/04/2007, 15h24
  5. "ajouter une méthode dans une méthode"
    Par Zorgloub dans le forum Langage
    Réponses: 1
    Dernier message: 09/04/2006, 12h53

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