+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Candidat au titre de 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 : 35
    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 : 14
    Points
    14

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

    J'ai créé une unité contenant ce code :
    Code :
    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 :
    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 Confirmé Sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : février 2006
    Messages : 4 878
    Points : 9 650
    Points
    9 650

    Par défaut

    Salut

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

    @+
    A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira.

  3. #3
    Membre Expert Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    août 2008
    Messages
    1 527
    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 527
    Points : 1 024
    Points
    1 024

    Par défaut

    Salut

    Un petit SetLength t'aiderai ?

    Code :
    SetLength(Flocalite, x);
    Où x est le nombre de record mettre en mémoire.

  4. #4
    Candidat au titre de 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 : 35
    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 : 14
    Points
    14

    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 Confirmé Sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : février 2006
    Messages : 4 878
    Points : 9 650
    Points
    9 650

    Par défaut

    Vi vi, je confirme.
    A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira.

  6. #6
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : septembre 2009
    Messages : 980
    Points : 1 299
    Points
    1 299

    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 :
    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 :
    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 actif

    Homme Profil pro
    ingénieur, retraité
    Inscrit en
    février 2007
    Messages
    180
    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é

    Informations forums :
    Inscription : février 2007
    Messages : 180
    Points : 184
    Points
    184

    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •