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 :

Explication de texte à propos d'une déclaration


Sujet :

Langage Delphi

  1. #21
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 447
    Points : 24 849
    Points
    24 849
    Par défaut
    TComboBox = class(FMX.ListView.TComboBox) contre TComboBox = class(TCombobox).

    Autant la première forme que l'on désigne pour "Hack"/"Jacking" est un grand classique que l'on pratiquait déjà avec la VCL
    Autant la seconde forme est clairement un bug du compilateur si il laisse passer cela, comme le dit ALWEBER et Andnotor c'est un incorrect car c'est le même identificateur TComboBox


    Je ne sais pas comment le gestionnaire de flux arrivent à trouver via un truc genre FindClass la TComboBox local à la place de la Namespace.Unit.TComboBox
    Cela reste pour moi un mystère
    Par contre, on sait que cela fonctionne très bien et l'on peut hériter de "Namespace.Unit.TComboBox" car le nom complet est bien un identifiant différent du TComboBox local que l'on est en train de définir

    Un petit QC pour dénoncer le TComboBox = class(TCombobox) serait bienvenu !
    Et ce n'est pas que pour les controles,
    On pourrait très bien définir par manque d'originalité définir une classe technique hérité de la RTL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type
      TObjectList<T: class> = class(System.Generics.Collections.TObjectList<T>)
      public
        function MethodeSuperSympaQuiManque(): T;
      end;
    Et évidemment TObjectList<T: class> = class(TObjectList<T>) doit absolument pas pouvoir être compileé car TObjectList est le dernier déclaré (donc la classe en cours de définition et pas celle que l'on choperais via System.Generics.Collections)



    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    [Rio, FMX]

    Quelqu'un pourrait-il m'expliquer pourquoi en passant par TCombobox = class(FMX.ListBox.TComboBox) j'accéde directement aux propriétés Count, Items, ItemIndex ?
    Je pense que tu as la réponse à ta question
    TCombobox = class(FMX.ListBox.TComboBox) grâce à la portée d'unité on peut accéder à tout membre protégé de FMX.ListBox.TComboBox (ça évidemment tu le savais)
    TCombobox = class(TComboBox) est un code incorrect que le compilateur devrait refuser (ça c'est le piège dans lequel il t'a fait tomber et qui est finalement la cause de tout ce sujet à rallonge)
    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
      1  0

  2. #22
    Membre confirmé Avatar de blonde
    Femme Profil pro
    Développeur Delphi
    Inscrit en
    Septembre 2003
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Septembre 2003
    Messages : 278
    Points : 477
    Points
    477
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    la sauce Patrick Prémartin
    Ca y est, il a son nom de marque en propre, bravo Patrick


    Autrement, je suis ce topic avec beaucoup d'intérêt.
      0  0

  3. #23
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 685
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 102
    Points
    13 102
    Par défaut
    C'est vraiment une question de compilateur, la façon dont il traite le script. En soit, TComboBox = class(TCombobox) ne paraît pas illogique du fait de la clause uses. Mais il semble pour une fois que la partie gauche est traitée avant la droite

    Il y a d'autres cas qui pourraient être tout aussi litigieux à l'instar de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    type
      PTruc = ^TTruc;
      TTrunc = record
      end;
    puisqu'on défini un pointeur typé sur un type pas encore déclaré. Mais ça passe !

    Soit le compilateur FMX suit le comportement de celui VCL et il génère une erreur (dans ce cas, c'est une erreur dans le compilateur) ou il y a évolution et il devrait effectivement prendre en compte la clause uses (ce serait une lacune dans le compilateur qui devrait être corrigée).
      0  0

  4. #24
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par blonde Voir le message
    ça y est, il a son nom de marque en propre, bravo Patrick
    J'ai hésité sur le nom de la sauce, ça fait grand chef mais sauce pprem n'aurait pas été mal non plus

    Citation Envoyé par ShailLeTroll
    Autant la seconde forme est clairement un bug du compilateur s’il laisse passer cela, comme le dit ALWEBER et Andnotor c'est un incorrect car c'est le même identificateur TComboBox
    Tout d'abord, je tiens à signaler que j'utilisai la forme TComboBox = class(FMX.ListView.TComboBox), c'est lors d'une relecture technique que la question s'est posé du pourquoi cette forme et non TComboBox = class(TCombobox).. Suite à cette remarque j'avais donc testé la seconde forme qui, fait beaucoup couler d'encre numérique, est acceptée par le compilateur (s'il s'agit de FMX).
    En tout cas, ce qui me rassure c'est que, d'après tes dires, la première forme utilisée au départ n'est pas si iconoclaste que ce que je le croyais (ouf)

    Merci Shai

    Un petit QC pour dénoncer le TComboBox = class(TCombobox) serait bienvenu !
    Oserai-je ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd
      0  0

  5. #25
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 491
    Points : 2 756
    Points
    2 756
    Billets dans le blog
    10
    Par défaut
    1) Le fait de déclarer TCombobox = class(TCombobox) est une anomalie de programmation qui ne devrait pas exister. De ce fait Delphi ne pouvant résoudre cette egalité le traduit par TCombobox = class(Tobject) donc l'ancêtre primordial. Donc dans la complétion du code on ne voit que les éléments du TObject et pas les counts, items et autres.
    2) J'ai refait les tests le comportement est bien le même en VCL et FMX. Donc ne pas accuser à tord FMX puisque le compilateur est le même pour les deux univers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      TComboBox = class(TCombobox) ;
    var
      Form1: TForm1;
      v1 : TComboBox ;
    implementation
    {$R *.dfm}
      v1.
    3) Delphi n'accepte pas que deux composants aient le même nom. Donc si on veux quand même le faire il faut retirer le composant du même nom du package de base de Delphi et mettre le sien à la place. Mais dans ce cas le programme sera peu portable. Il est possible aussi une déclaration au début de chaque programme du type : TComboBox = class(Vcl.StdCtrls.TCombobox)... En forme de surcharge . Dans ce cas ce type local au programme est prioritaire et un class helper fonctionne bien.
    4) Les visibilités Private, Protected, Strict private et Strict Protected sont sans effet au sein d'une même unité, ce qui explique certains comportement

    Un autre exemple
    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
     
    unit ex05f_accesPrivate1;
    interface
    uses  Classes ;
    type
      TMaClasse = class
      private
        fv1: integer;
      public
        property v1: integer read fv1 write fv1;
        function fRetourneValeurPlusUn: integer;
      end;
    implementation
    function TMaClasse.fRetourneValeurPlusUn: integer;
    begin
      result := fv1 + 1;
    end;
    end.
    //--------------------------------------------------
    program ex05f_accesPrivate;
    {$APPTYPE CONSOLE}
    {$R *.res}
    uses
      System.SysUtils,
      ex05f_accesPrivate1 in 'ex05f_accesPrivate1.pas';
    type
      TAccesPrive = class(TObject)
      private
        fv1: integer;
      end;
      TMaClasseDescendante = class(TMaClasse)
      public
        procedure IncrementeValeurPlusUn;
      end;
     
    procedure TMaClasseDescendante.IncrementeValeurPlusUn;
    begin
      TAccesPrive(TMaClasse(self)).fv1 :=
      TAccesPrive(TMaClasse(self)).fv1 + 1;
    end;
     
    var
      aClass1X: TMaClasseDescendante;
     
    begin
      aClass1X := TMaClasseDescendante.Create;
      aClass1X.v1 := 3;
      aClass1X.IncrementeValeurPlusUn;
      writeln(aClass1X.fRetourneValeurPlusUn.ToString);
      aClass1X.Free;
      readln
    end.
      0  0

  6. #26
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Il y a d'autres cas qui pourraient être tout aussi litigieux à l'instar de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    type
      PTruc = ^TTruc;
      TTruc = record
      end;
    puisqu'on défini un pointeur typé sur un type pas encore déclaré. Mais ça passe !
    Oui, c'est une bonne grosse exception à la règle le coup de pointeur avant
    D'ailleurs en D6, je me souviens de Crash de l'EDI quand je saisissais, oui je faisais l'erreur de mettre un T au lieu du P (ou cas d'un copier coller)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    type
      TTruc = ^TTruc;
      TTruc = record
    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
      0  0

  7. #27
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 491
    Points : 2 756
    Points
    2 756
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Oui, c'est une bonne grosse exception à la règle le coup de pointeur avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    type
      TTruc = ^TTruc;
      TTruc = record
    end;
    Non ce n'est pas une exception. Il fait partie de la définition d'origine du langage Pascal donnée par Niklaus Wirth au même titre que la définition de type "Forward"
      0  0

  8. #28
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bon, je crois que l'on en a fait le tour, je ferme la discussion (j'ai découvert cette possibilité) avec un résolu en prime
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd
      0  0

Discussion fermée
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/12/2017, 09h39
  2. Explication de texte à propos du code en C de l'outil sync
    Par Jipété dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 01/08/2016, 00h38
  3. Explication d'une déclaration (function )()
    Par macumba dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 06/01/2012, 22h08
  4. Réponses: 1
    Dernier message: 05/04/2008, 16h13
  5. Réponses: 4
    Dernier message: 26/07/2005, 13h38

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