seddik_saber
Messages postés3Date d'inscriptionlundi 3 mai 2004StatutMembreDernière intervention 7 mai 2004
-
6 mai 2004 à 15:24
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDerniè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.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 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).
seddik_saber
Messages postés3Date d'inscriptionlundi 3 mai 2004StatutMembreDerniè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:
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 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;