Utiliser un pointer dans une autre classe

cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 - 21 juin 2008 à 19:38
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 22 juin 2008 à 05:21
Bonsoir,

Voila, dans mon programme j'ai besoin d'un pointeur sur un TRichEdit pour m'en servir dans une classe que je suis entrain de créer.
Cela me permettrait de pouvoir modifier le TRichEdit du programme avec cette classe.

Le soucis étant que je ne sais pas comment passer un pointeur à une fonction et encore moins à une classe.

Voila le code qui le concerne :
function TSyntaxColor.ColorText(Text: String; RichEdit: TRichEdit):String;
var
SearchText: PChar;
RichEdit1: ^TRichEdit;
begin
SearchText := AnsiStrPos(PChar(Text), 'unit');
RichEdit1.Font.Color := clBlack;
RichEdit1.Font.Style := [fsBold];

RichEdit ^:= RichEdit1;
end;

Ne trouvant pas comment faire, j'ai donc pensé à créer un pointeur interne à la fonction et ensuite de m'en servir pour affecter le contenu au TRichEdit passé en paramètres, mais il me renvoi l'erreur :
Type pointer requis

Merci d'avance à ceux qui pourront m'aider.

4 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 34
21 juin 2008 à 20:55
function TSyntaxColor.ColorText(const Text: String; RichEdit: TRichEdit): String;
var
SearchText: PChar;
begin
  SearchText := AnsiStrPos(PChar(Text), 'unit');
  RichEdit.Font.Color := clBlack;
  RichEdit.Font.Style := [fsBold];
end;






sinon :

var
  obj : TRichEdit;
begin
  obj := RichEdit1;
  obj.Text := 'Hello';
end;

ou

var
  obj : TObject;
begin
  obj := RichEdit1;
  (obj as TRichEdit).Text := 'Hello';
end;

var
  ptr : pointer;
begin
  ptr := pointer(RichEdit1);
  TRichEdit(ptr).Text := 'Hello';
end;

<hr size="2" width="100%" />
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 33
21 juin 2008 à 23:35
A la rubrique "Classes et objets" du guide de référence du langage Delphi, on peut lire ceci :
"Une variable de type classe est en fait un pointeur qui référence un objet. Plusieurs variables peuvent donc désigner le même objet. Comme les autres pointeurs, les variables de type classe peuvent contenir la valeur nil. Cependant, il n'est pas nécessaire de déréférencer explicitement une variable de type classe pour accéder à l'objet qu'elle désigne. Par exemple, UnObjet.Taille := 100 affecte la valeur 100 à la propriété Taille de l'objet référencé, UnObjet ; vous ne devez pas l'écrire sous la forme UnObjet^.Taille := 100."

@christophedlr : il semble que tu ne fasses pas la distinction entre une référence et un pointeur.

May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 5
22 juin 2008 à 00:28
C'est bon, j'ai résolu mon problème avec l'aide de mon frangin.
Il fallait juste avant mon paramètre dans la fonction, que je rajoute le mot-clé var.
Ce qui me fait donc la déclaration suivante :
function TSyntaxColor.ColorText(Text: String; varRichEdit: TRichEdit): String;
à la place de : function TSyntaxColor.ColorText(Text: String; RichEdit: TRichEdit): String;

D'après ce que j'ai compris, cela me permet d'accéder au TRichEdit passé en paramètre, comme un pointeur et effectivement cela fonctionne bien.
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 34
22 juin 2008 à 05:21
attention, mieux vaux eviter de passer les objets en parametre VAR!

la syntaxe que je t'ai donner est la bonne, c'est juste que tu modifiais RichEdit1 et non le parametre nomé "RichEdit"

en gros :

RichEdit1 est contenus dans TForm1

procedure Mafonction(RichEdit: TRichEdit);
begin
  RichEdit.Width := 320;
  RichEdit.Height := 240;
end;

et ailleur :

MaFonction(RichEdit1);

et en aucuns cas tu ne devrais avoir :

procedure Quelconque(var IdentifiantObjet: TClasseObjet);

const = lecture seule, variables ou constante ou valeur directe, on evite de passer les classes en parametre "const"
utilisé pour les parametres utilisés uniquement en lecture (la plupart des cas)

var = doit etre une variable accessible en lecture/ecriture, ne peut etre une classe ou une valeur directe.
utilisé pour les parametres utilisés en ecriture/lecture (retour en fonction des valeurs transmises)

out = doit etre une variable accessible en ecriture. ne peut etre une classe ou une valeur directe.
utilisé pour les parametres utilisés en ecriture (retour multiple de valeur)

"sans rien" = reference, peut etre n'importe quoi, a préféré pour les classes.
utilisé pour les parametres en references (classes particulierement) accés en lecture/ecriture.

exemple :

var Pointeur: pointer ==> exemple :
New(Pointeur);
Pointeur^ := valeur;
Dispose(Pointeur);

out Pointeur: pointer ==> exemple :
Pointeur^ := valeur;

const Pointeur: pointer ==> exemple :
if Pointeur <> nil then ...

var Entier: Integer ==> exemple :
if Entier > 1 then  Entier := Entier div 2;

out Entier: integer ==> exemple :
Entier := AutreEntier div 2;

const Entier: integer ==> exemple :
AutreEntier := Entier div 2;
var Classe : TObject a eviter dans la plupart des cas> exemple :
Classe := TClass.Create;
if Classe.Propriété <> 50 then Classe.Propriété := 50;
FreeAndNil(Classe);
out Classe: TObject a eviter dans la plupart des cas> exemple :
Classe := TClass.Create;
Classe.Propriété := 50;
const Classe: TObjet a eviter dans la plupart des cas> exemple :
if Classe.Propriété = 50 then faire quelque chose;

Classe: TObject ==> exemple :
if not Assigned(Classe) then
  Classe := TClass.Create;
if Classe.Propriété <> 50 then
  Classe.Propriété := 50;
Self.MonAutreObjet.Assign(Classe);

<hr size="2" width="100%" />
0
Rejoignez-nous