Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Delphi > Langage
Langage Tout ce qui concerne le langage (POO, syntaxe, message d'erreur...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 01/12/2012, 15h27   #1
iznogoud_23
Candidat au titre de Membre du Club
 
Inscription : août 2005
Messages : 61
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 61
Points : 10
Points : 10
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.
iznogoud_23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2012, 15h31   #2
Cl@udius
Modérateur
 
Avatar de Cl@udius
 
Homme Claude Renouleaud
Développeur informatique
Inscription : février 2006
Messages : 4 860
Détails du profil
Informations personnelles :
Nom : Homme Claude Renouleaud
Âge : 50
Localisation : France, Hautes Pyrénées (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2006
Messages : 4 860
Points : 9 979
Points : 9 979
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.
Cl@udius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2012, 15h31   #3
BuzzLeclaire
Membre Expert
 
Avatar de BuzzLeclaire
 
Homme
Dev/For/Vte/Ass
Inscription : août 2008
Messages : 1 499
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 499
Points : 1 059
Points : 1 059
Salut

Un petit SetLength t'aiderai ?

Code :
SetLength(Flocalite, x);
Où x est le nombre de record mettre en mémoire.
BuzzLeclaire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2012, 15h41   #4
iznogoud_23
Candidat au titre de Membre du Club
 
Inscription : août 2005
Messages : 61
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 61
Points : 10
Points : 10
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
iznogoud_23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2012, 15h42   #5
Cl@udius
Modérateur
 
Avatar de Cl@udius
 
Homme Claude Renouleaud
Développeur informatique
Inscription : février 2006
Messages : 4 860
Détails du profil
Informations personnelles :
Nom : Homme Claude Renouleaud
Âge : 50
Localisation : France, Hautes Pyrénées (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2006
Messages : 4 860
Points : 9 979
Points : 9 979
Vi vi, je confirme.
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira.
Cl@udius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2012, 03h42   #6
Dr.Who
Membre Expert
 
Avatar de Dr.Who
 
Inscription : septembre 2009
Messages : 980
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : septembre 2009
Messages : 980
Points : 1 175
Points : 1 175
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!
Dr.Who est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2012, 19h54   #7
paulfr
Membre habitué
 
Homme Paul LAUTIER
ingénieur, retraité
Inscription : février 2007
Messages : 151
Détails du profil
Informations personnelles :
Nom : Homme Paul LAUTIER
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 : 151
Points : 147
Points : 147
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
Citation:
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
paulfr est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 15h25.


 
 
 
 
Partenaires

Hébergement Web