Pointeur sur une instance d'objet

Résolu
Hnimsgern Messages postés 48 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 4 mars 2005 - 23 févr. 2005 à 20:16
Hnimsgern Messages postés 48 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 4 mars 2005 - 4 mars 2005 à 10:01
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

roud59 Messages postés 99 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 26 juillet 2007 2
3 mars 2005 à 10:37
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
3
roud59 Messages postés 99 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 26 juillet 2007 2
23 févr. 2005 à 22:11
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
0
cs_neko Messages postés 135 Date d'inscription jeudi 14 août 2003 Statut Membre Dernière intervention 12 octobre 2006 1
24 févr. 2005 à 08:22
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
0
Hnimsgern Messages postés 48 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 4 mars 2005
27 févr. 2005 à 18:09
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
roud59 Messages postés 99 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 26 juillet 2007 2
28 févr. 2005 à 09:37
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
0
Hnimsgern Messages postés 48 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 4 mars 2005
1 mars 2005 à 20:03
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
0
Hnimsgern Messages postés 48 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 4 mars 2005
4 mars 2005 à 10:01
Merçi !

HN
0
Rejoignez-nous