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 :

Combiner des procédures et des méthodes [Tutoriel]


Sujet :

Delphi

  1. #1
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut Combiner des procédures et des méthodes
    Salut,
    au travers de ce tutoriel vous verrez comment manipuler indistinctement des procédures et/ou des méthodes afin de partager certains traitements.
    A l'origine nous comptions placer cette astuce dans la FAQ mais nous avons jugé bon d'approndir le sujet au sein d'un texte un peu plus long.

    Si vous avez des retours à nous faire n'hésitez pas.
    Merci.

  2. #2
    Membre confirmé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Points : 546
    Points
    546
    Par défaut
    Bonjour,
    tout d'abord merci pour cet excellent tutoriel .

    Comme il est également destiné à des débutants, peut-être serait il intéressant de mettre en plus en évidence certains points (évidents peut-être pour les grands gourous du Delphi que sont les Rédacteur/Modérateur ).

    Une procedure of object conserve l'adresse de la méthode et de l'instance (cela est suggéré dans les exemples du fait des champs Code et Data de TMethod) et si la méthode utilise des éléments propres à l'instance, cette dernière doit être valide.
    Notez qu'on peut affecter à la propriété Traitement n'importe quelle méthode de toutes classes, elle doit juste respecter la signature déclarée dans le type.
    Et conserver l'instance valide aussi longtemps que nécessaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      UnObjet:= TUneClasse.Create;
     
      UnAutreObject := TUneAutreClasse.Create;
      UnObjet.Traitement:=UnAutreObject.UneMethodeCompatible; 
      UnAutreObject.Free; // Je n'en ai plus besoin ? 
      // -> Si UneMethodeCompatible utilise des variables propres à l'instance il ne fallait pas détruire l'objet  
     
      UnObjet.Iteration(tabNom); // aïe aïe aïe
    Partie : Le grand mixe

    Notez qu'à partir du moment on utilise ce type de construction, les propriétés de l'objet ne sont plus accessibles
    Il ne faut pas non plus appeler dans cette méthode d'autres méthodes y accédant (ça semble évident), ni aucune méthode virtuelle (ou dynamique), quelle qu'elle soit(car résolue en lisant la vt porté par l'instance - invalide ici).
    Point que j'oublie parfois moi-même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var MaMethode : procedure of object; AObjet : TMonObjet;
    begin
      AObjet := nil; // Je veux juste la méthode (la partie Code de TMethod)
      // alors je crée pas d'instance
      MaMethode := AObjet.Faire; // si Faire virtuelle : BOUM ici même
    C'est aussi valable pour les méthodes de classes (qui peuvent appeler des méthodes de classes virtuelles grâce au Self, pointeur sur une métaclasse).

    Enfin à partir de Delphi 2006, des méthode de classes statiques ont fait leur apparition. Elles ne passent plus de paramètre Self (métaclasse) et ne peuvent donc appeler de méthodes de classe classiques.
    On peut donc les utiliser comme des procédures classiques pour des callbacks
    qui ne prennent pas de paramètre Self.

    Mais elles sont incompatibles avec les types procédure (ça je sais pas pourquoi) et sont compatibles avec les types procedure of object (bug ?).
    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
    program Project1;
     {$APPTYPE CONSOLE}
    uses
      SysUtils;
     
    type
      TMonObjet = class
        class procedure Faire( I : integer ); static;
      end;
     
    { TMonObject }
    class procedure TMonObjet.Faire( I : integer );
    begin
       Writeln(I);
    end;
     
    var Methode    : procedure( I : Integer ) of object;
        AProcedure : procedure( I : Integer ) ;
    begin
      Methode := TMonObjet.Faire; // Compatible !?!
      Methode(25); // Affiche le Self de la métaclasse de TMonObjet
     
      AProcedure := @TMonObjet.Faire; // incompatible,
      // on force en mettant @
      AProcedure(25); // Correcte !!!
     
      Readln;
    end.
    Résultat
    4231240
    25
    edit : déjà remonté dans QC, fixé dans Highlander

  3. #3
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    merci pour ta réponse. Il y a au moins une personne qui décide à donner son avis. Osez comme disez l'autre ;-)
    Citation Envoyé par gb_68
    évidents peut-être pour les grands gourous du Delphi que sont les Rédacteur/Modérateur
    Avant tout je tiens à préciser, et nombreux le pense, qu'être modérateur c'est avant tout une fonction et pas une compétence.
    Tout un chacun peut être modérateur à partir du moment où il sait déjà modérer ces propos, bon comme nous sommes humain quelque fois la nature reprend le dessus.
    De nombreuses personnes fréquentant ce forum sont tout autant compétentes, si ce n'est plus que la majorité de l'équipe.
    Donc ne nous faîtes pas plus beau que nous sommes, nous ne sommes pas non plus des bras cassé mais on ne connait pas tout.
    Enfin je tiens à le préciser que c'est mon avis et pas celui de l'équipe.

    Citation Envoyé par gb_68
    Comme il est également destiné à des débutants, peut-être serait il intéressant de mettre en plus en évidence certains points
    Là on n'est plus dans une évidence mais dans l'énoncé d'un effet de bord, bravo !
    J'ajoute ta pertinente remarque :-)

    Dans mon prochain tutoriel/astuce, publié lundi, je précise qu'il nous est parfois difficile de tout tester. Je ne pense pas que ce tutoriel fasse partie des nombreuses idées lumineuses qu'on peut tous avoir et qui tournent souvent en eau de boudin mais il reste du domaine de la "bricole". C'était juste une occasion d'aborder les TMethod et leurs comportements.

    Idem pour la seconde remarque, je l'ajoute.
    Quant au Static je n'y ai tout simplement pas pensé et n'ai pas encore compris toute sa finesse d'utilisation. Sous .NET ça me parle un peu plus.

    Finalisant un tuto sur les opérateurs et les records avancés, j'ai découvert que les méthodes de classe, qui y sont déclarées, doivent l'être avec la directive Static. Mais je n'ai pas eu le temps de creuser le sujet.

    En tout cas je te remercie pour ton retour, d'autres en profiteront :-)

    ps :
    Es-tu beta-testeur sur Highlander ?

  4. #4
    Membre confirmé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Points : 546
    Points
    546
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    Salut,
    merci pour ta réponse. Il y a au moins une personne qui décide à donner son avis. Osez comme disez l'autre ;-)
    De rien . Je me suis dit que pour une fois il fallait que je me lance .
    Citation Envoyé par Laurent Dardenne Voir le message
    Dans mon prochain tutoriel/astuce, publié lundi
    Vivement Lundi .
    Citation Envoyé par Laurent Dardenne Voir le message
    Es-tu beta-testeur sur Highlander ?
    Non pas vraiment (je m'étais inscrit dans un premier temps, mais je n'ai plus eu trop le temps après , alors je l'ai pas testé). C'est en voulant remonter sur QC les compatibilités/incompatibilités des types procedure/procedure of object/méthode de classe static pas très logiques que j'ai vu quelles y étaient déjà et que le problème était résolu sous Highlander (QC 38866 et QC 38861).

    ps :ce tutoriel m'a même poussé à faire un petit 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
    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
    program Project1;
     
    {$APPTYPE CONSOLE}
     
    uses
      SysUtils;
     
    type
     
      TProcedure  = procedure;
      TMethodeObj = procedure of object;
     
      TThunkCode = packed record
        MovEAX   : Byte ;
        AObject  : Cardinal  ;
        Call     : Byte ;
        CallCode : Cardinal ;
      end;
     
      TCallBack = class
      private
         ThunkCode : TThunkCode;
      public
        constructor Create( Methode : TMethodeObj );
        function GetProcAdresse : Pointer;
      end;
     
      TSimpleObject = class
      public
        I : integer;
        procedure Dit;
      end;
     
    { TCallBack }
    constructor TCallBack.Create( Methode : TMethodeObj );
    var Decalage : Cardinal;
    begin
      ThunkCode.MovEax   := $B8; // mov eax
      ThunkCode.AObject  := Cardinal(TMethod(Methode).Data);
      ThunkCode.Call     := $E9; // jump
      Decalage := Cardinal(TMethod(Methode).Code) -(Cardinal(@ThunkCode.CallCode) + SizeOf(ThunkCode.CallCode) ) ;
      ThunkCode.CallCode := Decalage;
    end;
     
    function TCallBack.GetProcAdresse : Pointer;
    begin
      Result := @ThunkCode;
    end;
     
    { TSimpleObject }
    procedure TSimpleObject.Dit;
    begin
       Write(I);
    end;
     
    var ACallBack : TCallBack; SimpleObject : TSimpleObject;
        AProcedure : TProcedure;
    begin
      SimpleObject := TSimpleObject.Create;
      ACallBack := TCallBack.Create(SimpleObject.Dit); // Créer un callback sur SimpleObject.Dit
     
      @AProcedure := ACallBack.GetProcAdresse;
     
      SimpleObject.I := 20;
     
      AProcedure; // Appel du callback
     
      SimpleObject.I := 50;
     
      AProcedure; // Appel du callback
     
      ACallBack.Free;
      SimpleObject.Free;
     
      ReadLn;
    end.

  5. #5
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Je fais juste un petit post d'encouragement car sur ce genre de tuto j'ai l'habitude de regarder et de profiter mais pas obligatoirement de commenter.

    J'en profite pour encourager touts ceux qui font ce genre de choses (oui, oui, je m'y mets bientôt...).

    Petite remarque qui n'a rien à voir : ne serait il pas temps de relancer un petit sondage pour remplacer/mettre à jour http://delphi.developpez.com/freewares/elections2004/ ? Les choses ayant évoluées depuis.

    Je veux bien participer à l'organisation ou autre...

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gb_68
    ce tutoriel m'a même poussé à faire un petit code
    Merci je regarde ça. En même temps il faut se fixer un périmètre mais c'est peut être un début de tutoriel , si cela te tente.

    Citation Envoyé par philnext
    Je fais juste un petit post d'encouragement car sur ce genre de tuto j'ai l'habitude de regarder et de profiter mais pas obligatoirement de commenter.
    Pourtant vos commentaires seraient utiles pour améliorer les choses. Nous savons que le Défi vous intéresse énormément mais pour le reste on ne sait pas trop.
    Citation Envoyé par philnext
    J'en profite pour encourager tous ceux qui font ce genre de choses (oui, oui, je m'y mets bientôt...).
    Merci
    Citation Envoyé par philnext
    ne serait il pas temps de relancer un petit sondage pour remplacer/mettre à jour http://delphi.developpez.com/freewares/elections2004/ ?
    Oui nous l'avions prévu, la mise à jour de la page composants est en cours de finalisation.
    Citation Envoyé par philnext
    Je veux bien participer à l'organisation ou autre...
    Je soumet ta proposition à l'équipe Delphi on te tiens informé.

    Si parmis vous certains souhaitent nous soummettre des tutoriels même orienté débutant, ils sont nombreux à fréquenter le forum, n'hésitez pas. Il faut juste avoir du temps à y consacrer. Si cela vous tente, poster dans le forum Contribuez de la rubrique Delphi.

    Developpez.com peut aussi vous proposer un hébergement gratuit pour vos contributions, voir un blog si vous préférez ce média. Je tiens à préciser que ce possible hébergement prend désormais effet dés la réception d'un tutoriel abouti, car de nombreux demandeurs ne nous ont jamais rien fournis (toute rubrique confondues) si ce n'est une surcharge de travail inutile .

    Encore fois je vous remercie pour vos retours.

  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Hello,

    comme philnext, j'ai lu et apprécié, en silence !

    sinon, je profite de ton appel précédent : acceptez-vous des tutoriels déjà publiés ailleurs ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  8. #8
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tourlourou
    comme philnext, j'ai lu et apprécié, en silence !
    Content que ça puisse vous apportez qq chose.
    A l'origine j'avais proposé une nouvelle rubrique pour la FAQ : Bricolage
    Citation Envoyé par tourlourou
    sinon, je profite de ton appel précédent : acceptez-vous des tutoriels déjà publiés ailleurs ?
    Nous avons besoin d'un peu plus d'information à ce sujet.
    Sous réserve, sur le principe je dirais oui, ensuite on se doit de respecter les droits d'auteurs et ceux des sites. On peut voir ça par MP c'est préférable, je suis à ta disposition.

  9. #9
    Membre habitué
    Inscrit en
    Mai 2005
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 258
    Points : 156
    Points
    156
    Par défaut
    Merci pour ce tutoriel. Fort intéressant mais....je suis encore confus...

    Il me semble qu'il tombe à point mais j'aurais besoin de votre aide.

    Voici mon cas:

    J'ai une form qui appelle une classe pour charger la db avec des données venant d'une autre db.

    Donc ma form a une séries de procédure comme celle-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TMyForm.doChargeData1;
    var
      aChargeForm: TChargeDonnee;
    begin
      aChargeForm:= TChargeDonnee.Create;
      try
        aChargeForm.LoadData1;
      finally
        aChargeForm.Free;
      end;
    end;
    Comme j'ai cela une bonne demi-douzaine de fois, je me suis dit, suite à la lecture du tutoriel, que je pourrais faire une méthode générale pour tous mes chargements et juste mettre ma méthode loadData1, loaddata2,... en paramètre.

    Pouvez-vous m'aider?

    Je pourrais créer l'objet aChargeForm une fois pour toute mais comme le chargement de ces données ne se fait que rarement, cela ne sert à rien d'avoir cette objet ouvert pour rien (enfin...)

    Est-ce que cela est possible?

    Merci d'avance

  10. #10
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par eponette
    je pourrais faire une méthode générale pour tous mes chargements et
    Difficile de répondre je n'ai pas les autres méthodes sous les yeux et ne connait pas le contexte.
    Citation Envoyé par eponette
    et juste mettre ma méthode loadData1, loaddata2,...
    Je me pose la question de savoir si c'est un pb de conception apparaîssant tardivement ou si c'est une optimisation de code ?
    TChargeDonnee est-elle dérivée ou contient-elle n méthodes LoadDataxx ?
    Si c'est le second cas est-ce que cette approche suffit pour régler le pb ?
    Citation Envoyé par eponette
    Est-ce que cela est possible ?
    L'avenir nous le dira
    Le mieux serait d'ouvrir un fil de discussion dédié ainsi on ne mélange les discussions et d'autres membres pourront t'apporter leur aide, je n'ai pas la science infuse...

  11. #11
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par gb_68 Voir le message
    ps :ce tutoriel m'a même poussé à faire un petit 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
    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
    program Project1;
     
    {$APPTYPE CONSOLE}
     
    uses
      SysUtils;
     
    type
     
      TProcedure  = procedure;
      TMethodeObj = procedure of object;
     
      TThunkCode = packed record
        MovEAX   : Byte ;
        AObject  : Cardinal  ;
        Call     : Byte ;
        CallCode : Cardinal ;
      end;
     
      TCallBack = class
      private
         ThunkCode : TThunkCode;
      public
        constructor Create( Methode : TMethodeObj );
        function GetProcAdresse : Pointer;
      end;
     
      TSimpleObject = class
      public
        I : integer;
        procedure Dit;
      end;
     
    { TCallBack }
    constructor TCallBack.Create( Methode : TMethodeObj );
    var Decalage : Cardinal;
    begin
      ThunkCode.MovEax   := $B8; // mov eax
      ThunkCode.AObject  := Cardinal(TMethod(Methode).Data);
      ThunkCode.Call     := $E9; // jump
      Decalage := Cardinal(TMethod(Methode).Code) -(Cardinal(@ThunkCode.CallCode) + SizeOf(ThunkCode.CallCode) ) ;
      ThunkCode.CallCode := Decalage;
    end;
     
    function TCallBack.GetProcAdresse : Pointer;
    begin
      Result := @ThunkCode;
    end;
     
    { TSimpleObject }
    procedure TSimpleObject.Dit;
    begin
       Write(I);
    end;
     
    var ACallBack : TCallBack; SimpleObject : TSimpleObject;
        AProcedure : TProcedure;
    begin
      SimpleObject := TSimpleObject.Create;
      ACallBack := TCallBack.Create(SimpleObject.Dit); // Créer un callback sur SimpleObject.Dit
     
      @AProcedure := ACallBack.GetProcAdresse;
     
      SimpleObject.I := 20;
     
      AProcedure; // Appel du callback
     
      SimpleObject.I := 50;
     
      AProcedure; // Appel du callback
     
      ACallBack.Free;
      SimpleObject.Free;
     
      ReadLn;
    end.
    Je crains d'avoir été plus rapide que toi
    Quatre routines assez suprenantes mais drôlement utiles ^^
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  12. #12
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sjrd Voir le message
    Je crains d'avoir été plus rapide que toi
    Oui mais toi t'es tombé dans la marmite de Delphi quand tu étais petit

    J'ai pas osé citer ton code, car il nécessite pas mal d'explications pour comprendre comment ça marche. Mais Je peux l'ajouter si tu veux.

  13. #13
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    C'est comme tu veux : c'est ton tutoriel, après tout

    Si tu veux je peux même rédiger l'explication du fonctionnement, avec un renvoi vers l'explication de Nono sur les conventions d'appel.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  14. #14
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sjrd
    Si tu veux je peux même rédiger l'explication du fonctionnement
    ça roule !

  15. #15
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    ça roule !
    OK je te fais ça demain
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

Discussions similaires

  1. [WD15] Surcharge des procédures héritées des modèles
    Par L.nico dans le forum WinDev
    Réponses: 3
    Dernier message: 13/05/2010, 12h24
  2. Utilité des view et des procédures
    Par Greesize dans le forum Débuter
    Réponses: 4
    Dernier message: 12/04/2009, 21h54
  3. Réponses: 3
    Dernier message: 23/01/2007, 08h14
  4. Réponses: 7
    Dernier message: 11/08/2006, 15h03

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