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 :

[d2006] [déclaration de TStrings] erreur de ma part ?


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 638
    Billets dans le blog
    65
    Par défaut [d2006] [déclaration de TStrings] erreur de ma part ?
    Comportement étrange du compilateur ou erreur de ma part

    dans une unité avec form j'utilise ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TForm.InventaireUsinePage(Sender: TObject);
    var  Script : TStrings;
    begin
     Script.Clear;
     Script.Add('SELECT * FROM TOTO');
    ........
    end;
    dans un datamodule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TData.Test;
    var  Script : TStrings;
    begin
     Script.Clear;
     Script.Add('SELECT * FROM TOTO');
    ........
    end;
    et là surprise à la compilation j'ai le droit à un avertissement pour le datamodule
    Citation Envoyé par Avertissement
    W1036 la variable 'script' n'est peut-être pas initialisée
    mais pas pour la form

    bon c'est pas grave , ça baigne, mais j'aimerais comprendre le pourquoi de cet avertissement dans l'un et pas dans l'autre . j'ai horreur d'avoir des variables non initialisées

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 093
    Par défaut
    je ne connais pas les subtilités du 2006 mais en delphi 7, c'est clair, c'est incomplet
    Pas de Soucis mais il manque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Script := TStringList.Create();
    Bien sur on prend une TStringList car TStrings est une classe abstraite, ensuite, le reste semble bon, et il faut bien sur faire un Free à la fin, ... sauf si il y a aussi un Garbage Collector en Delphi 2006, ce qui je considère comme la pire invention de tous les temps car elle habitue le developpeur à faire des new, open et create sans faire proprement ses dispose, close, et free, cela fait perdre de la RIGUEUR ! mais bon c'est mon avis de Troll !
    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
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 638
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par ShaiLeTroll
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Script := TStringList.Create();
    mais bon c'est mon avis de Troll !
    'Mais bon sang oui bien sur , c'était donc ça' aurait dit Bourrel , des fois je me demande si je ne frôle pas Alzheimer

    toutefois il est étonnant que le message n'apparaisse que pour le dataModule et pas pour la même chose en Form (je vais également corriger dans la form par précaution)

    Citation Envoyé par ShaiLeTroll
    ce qui je considère comme la pire invention de tous les temps car elle habitue le developpeur à faire des new, open et create sans faire proprement ses dispose, close, et free, cela fait perdre de la RIGUEUR !
    +1

    merci également @waskol , dont je viens de voir la réponse , pour cette explication + complete

  4. #4
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Alors, déjà, On ne déclare pas une variable de type TString mais plutôt l'un de ses descendants : TStringList ou THashedStringList.

    Le Type TString, on le réserve habituellement pour le passage de paramètres de procedure ou de fonction, par 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
    procedure MaProcedure(UneListe:TStrings);
    begin
    end;
    ...
    procedure Main;
    var UneListedeMot:TStringList;
         UneTabledeHachage:THashedStringList;
    begin
      ....
      //Exemple1
      MaProcedure(UneListedeMot);
      ....
      //Exemple2
      MaProcedure(THashedStringList);
      .... 
      //Exemple3
      MaProcedure(Memo1.Lines);
      ...
    end;
    Bref, c'est à peut près le même genre de comportement que le TStream : on utilise ses descendants (TMemoryStream, TFileStream) et dans les parametres des fonctions on utilise le type TStream.
    C'est aussi la même chose avec les composants visuels, on utilise les descendants (TPanel, TStaticLabel, TForm), et on utilise TWinControl dans les parametres.
    Pareil pour TPaintBox et TLabel, on utilise TGraphicControl.

    Ou si on veut une procedure qui utilise des propriétés communes aux TWinControl et TGraphicControl, on déclare les paramètres comme étant des TControl.

    Celà permet de traiter de façon générique des types d'objets différents ayant toutefois des points communs entre eux du au fait que leur classe parente est la même.

    Ces classe parentes comportent souvent des méthodes dites "virtuelles", qui ne sont pas implémentées mais qui le sont dans les classes descendantes.

    c'est pour ça que si on déclare un objet de type TString et qu'on utilise Add():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var Lignes:TStrings;
    begin
      ...
      Lignes.Add('TrucMuche'); //Plantage en vue
      ....
    end;
    ça plantera, tout bonnement parce que le code de la méthode n'existe pas (c'est une méthode virtuelle)

    Par contre, avec un TStringList, ce sera OK :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var Lignes:TStringList;
    begin
      ...
      Lignes.Add('TrucMuche'); //No problemo
      ....
    end;
    Si on lit bien l'aide Delphi à propos de la classe TStrings:
    Dérivez une classe de TStrings pour stocker et manipuler une liste de chaînes.TStrings contient des méthodes abstraites ou,dans la terminologie C++,virtuelles pures et ne doit pas être instanciée directement.
    Maintenant, si je reprend ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure MaProcedure(UneListe:TStrings);
    begin
       UneListe.Add('TrucMuche'); //va utiliser TStringList.Add et non pas TStrings.Add
                                             //Puisque UneListe est en fait un TStringList 
    end;
     
    var Lignes:TStringList;
    begin
      ...
      MaProcedure(Lignes); //On passe Un TStringList
      ....
    end;

    C'est bon ? tu suis ?


    Maintenant, dans ton code (corrigé en fonction de ce que je viens de dire) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var  Script : TStringList;
    begin
     Script.Clear;
     Script.Add('SELECT * FROM TOTO');
    ........
    end;
    Tu déclare un Objet (Script), de type TStringList. Bien, mais pour pouvoir l'utiliser :
    - il faut avant tout le creer en mémoire (ça ne marche pas comme un simple integer ce genre de chose)
    - Après l'avoir utilisé, il faut le détruire pour dire qu'on n'en a plus besoin et éviter de saturer la mémoire du PC
    Bref, ça marche un peu comme un pointeur (New/utilisation/Dispose)
    Autrement dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var  Script : TStringList;
    begin
     //1) Creation de l'objet :
     Script:=TStringList.Create;
     
     //2) Utilisation   
     Script.Clear;
     Script.Add('SELECT * FROM TOTO');
    ........
     //3) Libération de l'objet (destruction)
     Script.Free;
    end;
    Maintenant, pendant l'utilisation, il se peut que le code d'utilisation plante (erreur de programmation, etc...)
    Donc il faut "proteger le code" pour que, quoiqu'il arrive, l'objet soit détruit, c'est le rôle du célèbre try..finally..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
    var  Script : TStringList;
    begin
     //1) Creation de l'objet :
     Script:=TStringList.Create;
     try
       //2) Utilisation   
       Script.Clear;
       Script.Add('SELECT * FROM TOTO');
       ........
     finally 
       //3) Libération de l'objet (destruction)
       Script.Free;
     end;
    end;
    Même si le code entre le try et le finally "plante" et ne se déroule pas complêtement, le code situé entre le finally et le end le sera

    Je crois que c'est tout

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 093
    Par défaut
    Citation Envoyé par waskol
    Alors, déjà, On ne déclare pas une variable de type TString mais plutôt l'un de ses descendants : TStringList ou THashedStringList.
    Tu y vas un peu fort, on n'instancie pas un TStrings, TStream ou TCollection, mais déclarer on peut ! c'est justemet l'intêret sinon comment on ferait pour gérer nos méthodes génériques qui n'utilisent que le type de base sans se préoccuper de l'implémentation ....
    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

  6. #6
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Citation Envoyé par ShaiLeTroll
    Tu y vas un peu fort, on n'instancie pas un TStrings, TStream ou TCollection, mais déclarer on peut ! c'est justemet l'intêret sinon comment on ferait pour gérer nos méthodes génériques qui n'utilisent que le type de base sans se préoccuper de l'implémentation ....
    C'est vrai, tu as raison, mais avoue aussi que ça fait "stayïle-genre" ( ) de déclarer un objet d'un certain type (TStrings) et de l'instancier sous un autre type (...:=TStringList.Create).
    Faut savoir ce qu'on veut dans la vie !

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 638
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par waskol
    de déclarer un objet d'un certain type (TStrings) et de l'instancier sous un autre type (...:=TStringList.Create)
    c'est ce qui m'avait 'fourvoyer'

    et

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

Discussions similaires

  1. [Exim][réinstallation] Grossière erreur de ma part
    Par franqui34 dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 04/05/2015, 14h10
  2. [Débutant] [lsqnonlin] ne minimise pas ou erreur de ma part?
    Par membreComplexe12 dans le forum MATLAB
    Réponses: 13
    Dernier message: 09/06/2011, 15h16
  3. [E-03]Grosse erreur de ma part, impossible de fermer un UserForm
    Par moilou2 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/03/2009, 18h09
  4. Question sur UpdatePanel (erreur débutant qq part)
    Par postb99 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 23/01/2009, 13h37

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