cs_christophedlr
Messages postés267Date d'inscriptionsamedi 3 janvier 2004StatutMembreDernière intervention23 août 2023
-
21 juin 2008 à 19:38
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 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
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201333 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.
cs_christophedlr
Messages postés267Date d'inscriptionsamedi 3 janvier 2004StatutMembreDernière intervention23 août 20235 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.
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);