Pointeur sur une instance d'objet

Résolu
Signaler
Messages postés
48
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
4 mars 2005
-
Messages postés
48
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
4 mars 2005
-
Bonjour,
J'ai besoin d'un tel pointeur pour avoir accés aux variables et aux fonctions d'un objet.

L'objet instancié (partiel) est le suivant :

type TRecordSet=class(Tobject)
public
Fields:array of string;
Rows:array of array of string;
Constructor Create(Owner: TComponent);
Destructor Destroy;
function Value(Field:string;Row:integer=-1):string;overload;
function Next(Field:string=''):string;
private
end;

je voudrai pouvoir faire quelque chose comme : p.Rows[x][y]:='texte' et p.Value(etc)

HN

7 réponses

Messages postés
99
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
26 juillet 2007
2
Salut

Ne mets qu'UNE clause type. Quand je mets tous tes type j'ai les mêmes erreurs.

J'ai compilé ce qui suit avec D7 entreprise sans soucis :

uses ....
type //Un seul dans interface ...


TDb = class; //Déclaration avancée.
TRecordSet = class;


TRecordSet = class(TObject)
p : TDB;
end;


TDb = class(TObject)
r : TRecordSet;
end;


TForm1 = class(TForm)
private
{ Déclarations privées }
X : TRecordSet;
Y : TDB;
public
{ Déclarations publiques }
end;


var
Form1: TForm1;


implementation


{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
X := TRecordSet.Create;
Y := TDB.Create;;
end;

end.

Bonne prog

Roud59
Messages postés
99
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
26 juillet 2007
2
Salut

Si j'ai bien compris ta question, c'est tout simple :

var p : TRecordSet // p est en fait un pointeur
...
p := TRecordSet.Create(Form1);
p.Row[x][y] := 'texte';
...
p.Free;

J'espère avoir pu t'aider.
Bonne prog

Roud59
Messages postés
135
Date d'inscription
jeudi 14 août 2003
Statut
Membre
Dernière intervention
12 octobre 2006
1
p := TRecordSet.Create(Form1);
p.Row[x][y] := 'texte';

Tu peux pas faire ça directement, il faut dabord définir la longueur du tableau via SetLength() par exemple

bouh
Messages postés
48
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
4 mars 2005

Merci roud59 et neko pour vos réponses mais en fait le problème est un peu plus compliqué car j’ai deux objets déclarés chacun faisant référence à l'autre:


<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />


type TRecordSet=class(Tobject)
public


p:TDb; //Message TDb inconnu (c’est normal).
Fields:array of string;


etc…


end;





type TDb=class(Tobject)
public


function TDb.OpenRecordset(Selectstring:Pansichar;var RecordSet:TRecordSet):boolean;
etc…


end;





Si je déclare le type TDb en premier j’aurai un message d’erreur sur la fonction :





function TDb.OpenRecordset(Selectstring:Pansichar;var RecordSet:TRecordSet):boolean;





En attendant de trouver une solution, je met la déclaration de p:TDb en global.

HN
Messages postés
99
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
26 juillet 2007
2
Bonjour Hnimsgern

Avant la déclaration de TRecordSet, ajoute une pré-declaration de TDb :
TDb = class;
Je ferais la même chose pour TRecordSet pour être tranquille, ce qui donne :


type

TDb=class;
TRecordSet=class;

TRecordSet=class(Tobject) public<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />


p:TDb; //Message TDb inconnu (c’est normal).
Fields:array of string;


etc…


end;





TDb=class(Tobject)
public


function TDb.OpenRecordset(Selectstring:Pansichar;var RecordSet:TRecordSet):boolean;
etc…


end;

Roud59
Messages postés
48
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
4 mars 2005

Bonjour Roud59,

Effectivement cela devrait fonctionner . D'après la doc, c'est une déclaration
avancée dont le type n'est pas encore défini. Malheurement mon compilateur
(Delpi 7 personnel) ne l'acepte pas (message TDb n'est pas encore
complètement défini) .
Je ne vois d'options compilateur qui puissent bloquer la déclaration.

Avec des objets simplifiés le résultat est identique :

type TDb = class; //Déclaration avancée.


type
TRecordSet = class(TObject)
p:TDB;
end;


type
TDb = class(TObject)
end;

Je vais essayer de répartir les déclarations dans deux modules.

HN
Messages postés
48
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
4 mars 2005

Merçi !

HN