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

Composants VCL Delphi Discussion :

A la recherche de l'adresse du With perdue (Delphi amusant)


Sujet :

Composants VCL Delphi

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 9
    Points : 5
    Points
    5
    Par défaut A la recherche de l'adresse du With perdue (Delphi amusant)
    Ce qui compte ici c'est de choisir une variable publique arbitraire de la classe qui soit accessible directement en tant que variable (style Sorted:boolean read FSorted ) et non en tant que fonction (style Count:Integer read GetCount) ; on choisit ici Sorted pour la classe TStringList.

    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
    procedure TForm1.Button7Click(Sender: TObject);
      procedure AfficheCount(List:TStringList);
      begin
        ShowMessage( IntToStr(List.Count) );
      end;
     
    begin
      with TStringList.Create do
        try
          Add('ESSAI');
          Add('ESSAI2');
          Add('ESSAI3');
     
          AfficheCount( TStringList( Integer(@Sorted) - Integer(@TStringList(nil).Sorted) ) ); // just for fun!!!
     
        finally
           Free;
        end;
    end;
    Mais que fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TStringList( Integer(@Sorted) - Integer(@TStringList(nil).Sorted) )
    @Sorted : calcule l'adresse absolue de la variable Sorted du TStringList

    @TStringList(nil).Sorted : calcule l'adresse absolue de la variable Sorted du TStringList pour un TStringList = nil donc calcule l'offset de Sorted dans le TStringList

    Le cast en Integer est là pour faciliter la soustraction des 2 adresses (adresse absolue de Sorted - offset de Sorted = adresse absolue du TStringList)
    et on caste ensuite en TStringList pour "retrouver" le type d'origine (et pour éviter l'erreur de compil').

    je sais ça ne sert à rien donc les râleurs.... et j'entends déjà les "il suffit de créer une variable locale"

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Fallait oser !
    J'ai parfois abusé de la structure with, et pour ne pas utiliser de variable temporaire, mes objets avaient une méthode ItSelf dont l'utilisation se devine !
    Je me suis même dit que ça pourrait être un Class Helper !

    Combien de fois, pour débogguer, j'ai transformé ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    with TStringList.Create do
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Tmp := TStringList.Create;
    with TStringList.Create do
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Tmp := TStringList.Create;
    with Tmp do
    combien de fois, cette petite boulette m'a fait pesté contre le déboggueur qui ne fonctionne pas en oubliant que l'erreur qui certe est toujours entre le clavier et l'écran peut emprunter plusieurs chemins dont l'humain
    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
    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
    en plus simple, ceci devrait passer aussi (en win32 et Delphi pas trop récent...) :
    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
    procedure TForm1.Button7Click(Sender: TObject);
      procedure AfficheCount(List:TStringList);
      begin
        ShowMessage( IntToStr(List.Count) );
      end;
     
    var
      MyListAddress: TStringList;
     
    begin
      with TStringList.Create do
        try
     
          asm 
            mov MyListAddress, eax
          end;
     
          Add('ESSAI');
          Add('ESSAI2');
          Add('ESSAI3');
     
          AfficheCount(MyListAddress);
     
        finally
           Free;
        end;
     
    end;
    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 !

  4. #4
    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 445
    Points
    28 445
    Par défaut
    Tant qu'à faire de l'assembleur ...

    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
     
    procedure TForm1.FormCreate(Sender: TObject);
     
      procedure AfficheCount(List: TStringList);
      begin
        ShowMessage(IntToStr(List.Count));
      end;
     
    begin
      with TStringList.Create do
      begin
        Add('Hello');
        Add('There');
        asm
          mov eax, ebx
          Call AfficheCount
        end
      end;
    end;
    et avec un Helper
    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
     
    type
      TStringListHelper = class helper for TStringList
        procedure AfficheCount;
      end;
     
    procedure TStringListHelper.AfficheCount;
    begin
      ShowMessage(IntToStr(Count));
    end;
     
    procedure TMainForm.FormCreate(Sender: TObject);
    begin
      with TStringList.Create do
      begin
        Add('Hello');
        AfficheCount;
      end;
    end;
    ou plus généralement

    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
     
    type
      TObjectHelper = class helper for TObject
        function This: TObject;
      end;
     
    function TObjectHelper.This: TObject;
    begin
     Result := Self;
    end;
     
    procedure TMainForm.FormCreate(Sender: TObject);
      procedure AfficheCount(List: TStringList);
      begin
        ShowMessage(IntToStr(List.Count));
      end;
    begin
      with TStringList.Create do
      begin
        Add('Hello');
        AfficheCount(This as TStringList);
      end;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Je ne connaissais pas ces helper.
    (class helper for T...)

    J'ai jeté un oeil à l'aide Delphi, mais c'est assez succinct.
    Ca sutilise dans quels cas ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  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 445
    Points
    28 445
    Par défaut
    Citation Envoyé par Lung Voir le message
    Je ne connaissais pas ces helper.
    (class helper for T...)

    J'ai jeté un oeil à l'aide Delphi, mais c'est assez succinct.
    Ca sutilise dans quels cas ?
    "officiellement" ça ne s'utilise pas

    c'est un ajout au langage pour la plateforme .Net

    le principe est très simple (et la syntaxe douteuse), tu as un objet existant que tu ne peux pas dériver, mais tu voudrais tout de même lui ajouter des méthodes statiques (j'insiste sur le "statiques"), et bien le Helper et là pour ça.

    une méthode objet statique n'est rien d'autre qu'une procédure ayant un paramètre implicite SELF, elle ne change pas l'objet, sa VMT ou quoi que ce soit, l'appel se fait directement sur la méthode.

    d'où l'idée de pouvoir greffer ce genre de méthodes à un objet existant sans le modifier.

    personnellement j'aurais préféré une syntaxe plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    static procedure TStringList.AfficheCount;
    begin
      ShowMessage(IntToStr(count));
    end;
     
    -- ou ---
    method TStringList.AfficheCount;
    begin
      ShowMessage(IntToStr(count));
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Quand tu parle de "statique" ou "static", tu l'oppose au "dynamic" ou "virtual" du Delphi et la résolution du type à la compilation ?

    non, je dis ça parcque "static" en C++, c'est le "class" du Delphi !
    Vu que je fais les deux, la confusion est rapide !
    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

  8. #8
    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 445
    Points
    28 445
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Quand tu parle de "statique" ou "static", tu l'oppose au "dynamic" ou "virtual" du Delphi et la résolution du type à la compilation ?

    non, je dis ça parcque "static" en C++, c'est le "class" du Delphi !
    Vu que je fais les deux, la confusion est rapide !
    tout à fait c'est le contraire de "virtual" puisqu'une méthode virtuelle est un pointeur dans la VMT.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. recherche d'une adresse d'un tableau multidimensionnel
    Par tamara6 dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 06/01/2007, 00h29
  2. Bouton de recherche d'une adresse de dossier
    Par crashyear dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 20/10/2006, 08h12
  3. Recherche d'une adresse MAC
    Par Stilobic dans le forum Administration
    Réponses: 5
    Dernier message: 19/01/2006, 18h13
  4. Recherche de l'adresse du port série
    Par StephCal dans le forum Langage
    Réponses: 8
    Dernier message: 07/01/2004, 11h23
  5. Clé matérielle - A la recherche d'une adresse ...
    Par B-Pascal dans le forum Ordinateurs
    Réponses: 6
    Dernier message: 09/11/2003, 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