Appelle a tous le monde problem!!!!!!!!!!!!!

seddik_saber Messages postés 3 Date d'inscription lundi 3 mai 2004 Statut Membre Dernière intervention 7 mai 2004 - 6 mai 2004 à 15:24
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 7 mai 2004 à 21:42
salut je suis un developpeur java desirant me convertir en delphio pour cree les app win32
voici mon probleme j'ai implimente une classe implimentant des pointeurs mais mon app se bloque veuillez m'aider merci.
voici le code de l'unite qui ci=ontient ma S.D.

unit sabreg;

interface

type
RegKey = class(TObject)

private
parent : ^RegKey;
adresse: String;
public
constructor Creer();overload;
procedure setParent(parent_p: RegKey);
function getParent():RegKey;
procedure setAdresse(adresse_p:String);
function getAdresse():String;
destructor Liberer;
end;
implementation
procedure RegKey.setParent(parent_p: RegKey);
begin
parent:=@parent_p;
end;
function RegKey.getParent():RegKey;
begin
result:=parent^;
end;
procedure RegKey.setAdresse(adresse_p:String);
begin
adresse:=adresse_p;
end;
function RegKey.getAdresse():String;
begin
result:=adresse;
end;
destructor RegKey.Liberer;
begin
parent:=nil;
end;
constructor RegKey.Creer();
begin
parent:=nil;
end;
end.

et voici le code du form l'utilisant

unit wallpaper;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Sabreg;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
x:regkey;
y:regkey;
begin
x.setAdresse('saber');
y.setAdresse('keko');
x.setParent(y);
showmessage(x.getParent.getAdresse);
y.setAdresse('sasi');
showmessage(x.getParent..getAdresse);

end;

end.

je note que le blocage se fait lors du 2eme appelle de showmessage(x.getParent..getAdresse);

3 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
7 mai 2004 à 08:11
Bienvenue dans le monde de Delphi ! 8-)

Mais, hélas, autant te le dire tout de suite : tu es complètement dans les choux !!!!

Reprenons le code à zéro tout en respectant les conventions d'écritures proposées par Bortland et qui ont fait leurs preuves. Commençons par la déclaration de la classe TRegKey :
unit sabreg;

interface

type

  TRegKey = class(TObject)
  private
    FAdresse: string;
    FParent: TRegKey;
  public
    property Adresse: string read FAdresse write FAdresse;
    property Parent: TRegKey read FParent write FParent;
  end;

implementation

end.

Il n'y a rien de plus à écrire dans ce cas. La classe TRegKey possède 2 propriétés (Adresse et Parent) auxquelles nous accèderons directement sans passer par des accesseurs (aussi appelés accesseur et mutateurs en Java), vu que nous n'en avons pas la nécessité et celà ne nous apporterait rien de plus.
Je précise que, dans ton cas, il n'est pas nécessaire de redéclarer un constructeur ni un destructeur pour la classe TRegKey, nous n'avons pas de traitement particulier à faire (initialisation, instanciation ou destructions).

Passons maintenant à l'utilisation de cette classe fraichement créée :
procedure TForm1.FormCreate(Sender: TObject);
var
  X, Y : TRegKey;
begin
  //Equivalent de TRegKey X = new TRegKey; en Java
  X := TRegKey.Create;
  X.Adresse := 'saber';

  Y := TRegKey.Create;
  Y.Adresse := 'keko';
  //Affectation du membre Parent de X à Y
  X.Parent := Y;
  
  //Adresse du parent de X
  ShowMessage(X.Parent.Adresse);

  Y.Adresse := 'sasi';
  //Adresse du parent (après modification) de X
  ShowMessage(X.Parent.Adresse);
  
  //Ici, pas de garbage collector comme en Java !
  //Il faut donc penser à détruire les objets qui n'ont 
  //pas de  parent
  X.Free;
  Y.Free;
end;

Le commentaire dans le code doit te faire penser que, tout comme en Java, une instance d'une classe doit être créée avant de pouvoir être utilisée.

ATTENTION : Delphi, comme beaucoup de langages, ne comporte pas de mécanisme de ramasse-miettes automatique. Il faut donc gérer sa mémoir proprement en pensant à détruire les objets ne possédant pas de parent (qui, en général, se charge de la destruction de tout ce qui leur appartient).

Bienvenue dans le monde de Delphi !
May Delphi be with you
0
seddik_saber Messages postés 3 Date d'inscription lundi 3 mai 2004 Statut Membre Dernière intervention 7 mai 2004
7 mai 2004 à 12:45
merci Delphiprog de votre aide
ce que je desire moi c'est cree c'est la ,structure de donnée d'un graph
j'ai modifier l'unite sabreg comme vous m'avez donnez est ca marche.
mais aussi ca plante quand je fais un appelle comme ca:
ShowMessage(X.Parent.Parent.Parent.Adresse);
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
7 mai 2004 à 21:42
C'est sur que, si à un moment donné, la propriété Parent des objets n'est pas assignée, ça plante !

Pour remonter jusqu'à l'ancêtre dans le graphe, il suffit de parcourir l'arbre jusqu'à atteindre un membre qui n'ait pas de parent.
Code ci-dessus légèrement modifié (pour les besoins de la démo) :
procedure TForm1.Button1Click(Sender: TObject);
var
  X, Y, Z, TempX : TRegKey;
  Generation: integer;
begin
  //Equivalent de TRegKey X = new TRegKey; en Java
  X := TRegKey.Create;
  X.Adresse := 'X';

  Y := TRegKey.Create;
  Y.Adresse := 'Y';
  //Affectation du membre Parent de X à Y
  X.Parent := Y;

  Z := TRegKey.Create;
  Z.Adresse := 'Z';
  Y.Parent := Z;

  //Affichage du parent immédiat de X
  ShowMessage(X.Parent.Adresse);

  Y.Adresse := 'sasi';
  //Affichage du parent immédiat après sa modification
  ShowMessage(X.Parent.Adresse);

  //Affichage du "grand-père" de X
  ShowMessage(X.Parent.Parent.Adresse);

  //-----------------------------------------------------
  //Atteindre le parent 2 générations avant X:
  Generation := 0;
  TempX := X;
  while Assigned(TempX.Parent) and (Generation <= 2) do
  begin
    inc(Generation);
    //On pointe sur l'ancêtre
    TempX := TempX.Parent;
  end;
  if Generation = 2 then
    ShowMessageFmt('Adresse du %de parent = %s', [Generation, TempX.Adresse])
  else
    ShowMessageFmt('Depuis seulement %d générations !', [Generation ]);

  //---------------------------------------------------------
  //recherche de l'ancêtre le plus ancien 
  TempX := X;
  //Retour aux origines ;o)
  while TempX.Parent <> nil do
    TempX := TempX.Parent;

  ShowMessage('Le plus ancien de la famille : ' + TempX.Adresse);

  //Ici pas de garbage collector comme en Java !
  //Il faut donc penser à détruire les objets qui n'ont
  //pas de propriétaire.
  X.Free;
  Y.Free;
  Z.Free;
end;

May Delphi be with you
0
Rejoignez-nous