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 :

Pourquoi ce code ne marche-t-il pas? (composant/record/propriété)


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chercheur - Programmeur amateur
    Inscrit en
    Août 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur - Programmeur amateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2005
    Messages : 65
    Points : 39
    Points
    39
    Par défaut Pourquoi ce code ne marche-t-il pas? (composant/record/propriété)
    J'ai créé une unité contenant 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
    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
    unit Weathers;
     
    interface
     
    uses
      Classes;
     
    type
      TLocalite = record    // Structure décrivant le lieu choisi
        Id, Name, Time, Latitude, Longitude, Sunrise, Sunset, Zone : string;
      end;
     
      TWeather = class(TComponent)
      private
        FLocalite : TLocalite;
      public
        property Localite : TLocalite read FLocalite;
        constructor Create(Owner : TComponent); override;
        destructor Destroy;
        function MettreAJour : boolean;
      end;
     
    implementation
    uses
      Forms;
     
    constructor TWeather.Create(Owner: TComponent);
    begin
      inherited;
    end;
     
    destructor TWeather.Destroy;
    begin
      inherited;
    end;
     
    function TWeather.MettreAJour : boolean;
    begin
       FLocalite.ID := 'test';
    end;
     
    end.
    Sur une Form, j'ai posé un bouton dont l'evenement OnClick appelle la procedure MettreAJour :
    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Weathers;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      UnWeather : TWeather;  
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      UnWeather.MettreAJour;
    end;
     
    end.
    Lorsque je clique sur le bouton, j'ai une violation d'acces memoire. Pourquoi?
    Comment écrire des valeurs dans le record "Localite" ?

    Merci d'avance et désolé pour cette question de Débutant.

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Ta variable UnWeather de Unit1 n'est pas initialisée. Il manque l'appel au constructeur de la classe.

    @+

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut

    Un petit SetLength t'aiderai ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetLength(Flocalite, x);
    Où x est le nombre de record mettre en mémoire.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Chercheur - Programmeur amateur
    Inscrit en
    Août 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur - Programmeur amateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2005
    Messages : 65
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Salut

    Ta variable UnWeather de Unit1 n'est pas initialisée. Il manque l'appel au constructeur de la classe.

    @+
    Et Merde... quelle nouille....
    C'est les conneries les plus grosses les plus invisibles

  5. #5
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Vi vi, je confirme.

  6. #6
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    héhé

    et n'oublis pas de mettre Weather dans la section publique de la TForm

    de mettre

    Weather := TWeather.Create;

    dans le OnCreate de TForm

    et

    Weather.Free

    dans le OnDestroy de TForm.


    comme ceci donc :

    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
     
    Unit Main;
     
    interface
     
    uses ...;
     
    type
      TForm1 = class(TForm)
        procedure Form1Create(Sender:TObject);
        procedure Form1Destroy(Sender:TObject);
      private
      public
        Weather : TWeather;
      end;
     
     
    var
      Form1 : TForm1;
     
    implementation
     
    procedure TForm1.Form1Create(...);
    begin
      Weather := TWeather.Create;
    end;
     
    procedure TForm1.FormDestroy(...);
    begin
      Weather.Free;
    end;
     
    end.

    Si tu déclare Weather dans les Var d'interface/implementation de l'unit il faut le créer et libérer comme cela (ou le metter dans une unité WeatherWidget.pas avec un objet déjà définit) :

    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
     
    Unit Main;
     
    interface
     
    uses ...;
     
    type
      TForm1 = class(TForm)
      private
      public
      end;
     
     
    var
      Form1 : TForm1;
      Weather: TWeather;
     
    implementation
     
     
    initialization
      Weather := TWeather.Create;
     
    finalization
      Weather.Free;
     
    end.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  7. #7
    Membre averti

    Homme Profil pro
    ingénieur, retraité
    Inscrit en
    Février 2007
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur, retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 230
    Points : 332
    Points
    332
    Par défaut
    Bonjour,

    A premiere vue il me semblerait que la dcl record du type TLocalite ne soit pas correcte, String ne définissant pas la longueur des champs.
    Sous D3 j'aurai défini les champs à String[x].
    Les exemples trouvés dans D4 et D2006 indiquent un record avec un String uniquement dans le cas d'une dcl de variable.

    D2006 / Reference.pdf
    Par exemple, la déclaration suivante crée un type enregistrement nommé TDateRec.

    type
    TDateRec = record
    Year: Integer;
    Month: (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
    Day: 1..31;
    end;

    ...

    Au lieu de définir des types d'enregistrement, vous pouvez utiliser directement la construction record ... dans des déclarations de variable :

    var S: record
    Nom : string;
    Age : Integer;
    end;
    PL

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/05/2014, 15h28
  2. [AC-2007] pourquoi mon code ne marche pas
    Par erebios dans le forum VBA Access
    Réponses: 16
    Dernier message: 04/05/2010, 23h43
  3. je ne sais pas pourquoi ce code ne marche pas!
    Par hindou90 dans le forum C
    Réponses: 3
    Dernier message: 15/01/2010, 10h59
  4. diaporama: pourquoi mon code ne marche pas
    Par secondechance dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/05/2009, 02h04
  5. je ne sais pas pourquoi ce code ca marche pas
    Par debutantasp dans le forum ASP
    Réponses: 14
    Dernier message: 23/11/2007, 17h10

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