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 :

Heritage Interface - Surcharge


Sujet :

Delphi

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 53
    Points : 40
    Points
    40
    Par défaut Heritage Interface - Surcharge
    Bonjour,

    Comment heritier une Interface avec des methodes Overload?

    Heritier cette 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
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    [JavaSignature('android/telephony/PhoneStateListener')]
      JPhoneStateListener = interface(JObject)
        ['{50CE10E1-C584-4145-BC72-65BFA48BB281}']
        procedure onCallForwardingIndicatorChanged(cfi: Boolean); cdecl;
        procedure onCallStateChanged(state: Integer; incomingNumber: JString); cdecl;
        procedure onCellInfoChanged(cellInfo: JList); cdecl;
        procedure onCellLocationChanged(location: JCellLocation); cdecl;
        procedure onDataActivity(direction: Integer); cdecl;
        procedure onDataConnectionStateChanged(state: Integer); cdecl; overload;
        procedure onDataConnectionStateChanged(state: Integer; networkType: Integer); cdecl; overload;
        procedure onMessageWaitingIndicatorChanged(mwi: Boolean); cdecl;
        procedure onServiceStateChanged(serviceState: JServiceState); cdecl;
        procedure onSignalStrengthChanged(asu: Integer); cdecl;//Deprecated
        procedure onSignalStrengthsChanged(signalStrength: JSignalStrength); cdecl;
      end;
     
      TPL = Class(TJavaLocal, JPhoneStateListener)
        Public
          Constructor Create;
          Destructor Destroy; Override;
          procedure onCallForwardingIndicatorChanged(cfi: Boolean); cdecl;
          procedure onCallStateChanged(state: Integer; incomingNumber: JString); cdecl;
          procedure onCellInfoChanged(cellInfo: JList); cdecl;
          procedure onCellLocationChanged(location: JCellLocation); cdecl;
          procedure onDataActivity(direction: Integer); cdecl;
          procedure onDataConnectionStateChanged(state: Integer); cdecl; Overload;
          procedure onDataConnectionStateChanged(state: Integer; networkType: Integer);  cdecl; Overload;
          procedure onMessageWaitingIndicatorChanged(mwi: Boolean); cdecl;
          procedure onServiceStateChanged(serviceState: JServiceState); cdecl;
          procedure onSignalStrengthChanged(asu: Integer); cdecl;
          procedure onSignalStrengthsChanged(signalStrength: JSignalStrength); cdecl;
      End;
     
    Implementation
     
    Constructor TPL.Create;
    Begin
     
    End;
    Destructor TPL.Destroy;
    Begin
      Inherited Destroy;
    End;
    procedure TPL.onCallForwardingIndicatorChanged(cfi: Boolean);
    Begin
     
    End;
    procedure TPL.onCallStateChanged(state: Integer; incomingNumber: JString);
    Begin
     
    End;
    procedure TPL.onCellInfoChanged(cellInfo: JList);
    Begin
     
    End;
    procedure TPL.onCellLocationChanged(location: JCellLocation);
    Begin
     
    End;
    procedure TPL.onDataActivity(direction: Integer);
    Begin
     
    End;
    procedure TPL.onDataConnectionStateChanged(state: Integer);
    Begin
     
    End;
    procedure TPL.onDataConnectionStateChanged(state: Integer; networkType: Integer);
    Begin
     
    End;
    procedure TPL.onMessageWaitingIndicatorChanged(mwi: Boolean);
    Begin
     
    End;
    procedure TPL.onServiceStateChanged(serviceState: JServiceState);
    Begin
     
    End;
    procedure TPL.onSignalStrengthChanged(asu: Integer);
    Begin
     
    End;
    procedure TPL.onSignalStrengthsChanged(signalStrength: JSignalStrength);
    Begin
     
    End;
    La compilation donne des erreurs suivants:
    [DCC Erreur] Unit31.pas(33): E2211 La déclaration de 'equals' diffère de la déclaration dans l'interface 'JPhoneStateListener'
    J'ai déjà essaié avec DELPHI XE6, Delphi XE7 et XE8.

    J'ai déjà esaie de rajouter sur le methode overload (Reintroduce, virtual, .....), ça ne marche pas encore.

    Pouvez vous m'aider SVP?

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    comme indiqué dans le message d'erreur, le problème est dans JObject.equals(). TJavaLocal n'implémente pas JObject et il contient une méthode equals() qui n'a pas la même signature que celle de JObject

    à priori il faut partir de JObjectClass et non de JObject

    https://github.com/FMXExpress/androi...teListener.pas
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 53
    Points : 40
    Points
    40
    Par défaut
    Merci pour la réponse,

    J'ai pas trop compris
    à priori il faut partir de JObjectClass et non de JObject
    Un peu d’exemple pour que je puisse comprendre.

    Merci.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 13 429
    Points : 24 794
    Points
    24 794
    Par défaut
    Paul, dans l'extrait de code fourni en lien, c'est bien à base de
    JObject pour l'interface JPhoneStateListener
    et JObjectClass pour JPhoneStateListenerClass

    c'est le TJavaLocal qui ne semble pas correct pour la déclaration du listener TPL

    ton code devrait plutôt être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TPL  = class(TJavaGenericImport<JPhoneStateListenerClass, JPhoneStateListener>) 
    Public
          Constructor Create;
          Destructor Destroy; Override;
    ...
    end;
    Sinon, il faudrait passer par une Clause de résolution de méthode

    en supposant que JObject c'est le Object du Java Android
    Je n'ai pas Android dans mon XE7 ! dommage !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      TPL = Class(TJavaLocal, JPhoneStateListener )
      public
          Constructor Create;
          Destructor Destroy; Override;
     
          //... tes autres méthodes
     
          // la méthode Equals du JPhoneStateListener
          function AutreEquals(o: JObject): Boolean;
      public
        // Clause de résolution de méthode
        function JPhoneStateListener.Equals = AutreEquals;
    end;
    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

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 53
    Points : 40
    Points
    40
    Par défaut
    Merci pour la réponse de ShaiLeTroll.

    J'ai essayé le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TPL  = class(TJavaGenericImport<JPhoneStateListenerClass, JPhoneStateListener>) 
    Public
          Constructor Create;
          Destructor Destroy; Override;
    ...
    end;
    La compilation passe très bien, il n'y a plus d'erreur. Sauf ça ne marche pas.

    Voila mon code pour l'utilisation du classe TPL ci-dessus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm31.Button1Click(Sender: TObject);
    Var obj: JObject; identifier: String;
        tm: JTelephonyManager; Tj: TPL;
    begin
      obj:= SharedActivityContext.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);
      if obj <> nil then begin
         tm:= TJTelephonyManager.Wrap((obj as ILocalObject).GetObjectID);
         if tm <> nil then begin
            Tj:= TPL.Create;
            Tm.listen(Tj, TJPhoneStateListener.JavaClass.LISTEN_CALL_STATE);
         End;
      End;
    end;
    En fait je voulais traduire ce code java http://www.truiton.com/2014/08/andro...tener-example/ en delphi mais ça ne marche pas.

    Mon but est de détecter si le téléphone reçoit un appel et identifiant le numéro de téléphone.
    Avec ce code ça marche le status de l'appel mais pas le numéro de l'appelant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    obj:= SharedActivityContext.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);
      if obj <> nil then begin
         tm:= TJTelephonyManager.Wrap((obj as ILocalObject).GetObjectID);
         if tm <> nil then begin
            CASE tm.getCallState OF
                CALL_STATE_IDLE: Label1.Text:= 'StandBy';
                CALL_STATE_OFFHOOK: Label1.Text:= 'Appel Sortant...';
                CALL_STATE_RINGING: Label1.Text:= 'Appel entrant...';
            END;
         End;
      End;
    C'est pour ça que je cherche la solution à partir de déclenchement de l'événement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JPhoneStateListener.onCallStateChanged(state: Integer; incomingNumber: JString);
    pour trouver aussi en même temps le numéro de l'appelant en cours.

    Si quelqu'un a une idée l'utilisation LISTENER en delphi.

    J'ai déjà essayé aussi en BroadCast aussi mais c'est ça ne marche et j'arrive pas aussi encore à implémenter en delphi.

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    as-tu ajouté les droits ?

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Heritage et surcharge : comment faire ?
    Par electroremy dans le forum VB.NET
    Réponses: 8
    Dernier message: 23/11/2012, 17h56
  2. POO: syntaxe heritage + interface
    Par masbaye_noubadoum dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2010, 14h21
  3. [XSD] Heritage et surcharge d'element
    Par flagadda dans le forum Valider
    Réponses: 1
    Dernier message: 24/05/2007, 11h24
  4. Comment faire - Interface, surcharge
    Par arouche dans le forum C#
    Réponses: 3
    Dernier message: 30/01/2007, 19h41
  5. Réponses: 2
    Dernier message: 11/01/2007, 16h39

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