Quinve
Messages postés4Date d'inscriptionmardi 23 octobre 2001StatutMembreDernière intervention25 décembre 2007
-
12 mars 2003 à 09:14
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 2013
-
12 mars 2003 à 20:23
Bonjour, j'essais de voir la conception d'un composant qui imprime les réultats d'une requète.
J'ai insérer 2 propriétés et les résultats ne sont pas là. Voici le code :
type TOrientPage = (Portrait, Paysage);
type
TImpRequete = class(TComponent)
private
{ Déclarations privées }
FOrientPage: TOrientPage;
FPolice: TFont;
procedure SetOrientPage(Value: TOrientPage);
procedure SetPolice(Value: TFont);
protected
{ Déclarations protégées }
public
{ Déclarations publiques }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{ Déclarations publiées }
property OrientPage: TOrientPage read FOrientPage write SetOrientPage default Portrait;
property Police: TFont read FPolice write SetPolice;
end;
constructor TImpRequete.Create(AOwner: TComponent);
begin
Inherited Create(AOwner);
FPolice := TFont.Create;
FPolice.Name := 'ARIAL';
FPolice.Size := 10;
FOrientPage := Portrait;
end;
destructor TImpRequete.Destroy;
begin
FPolice.Free;
inherited Destroy;
end;
procedure TImpRequete.SetPolice(Value: TFont);
begin
if Printer.Canvas.Font <> Value then
begin
Printer.Canvas.Font := Value;
FPolice := Value;
end;
Printer.BeginDoc;
Printer.Abort;
end;
procedure TImpRequete.SetOrientPage(Value: TOrientPage);
begin
if Value = Portrait then
Printer.Orientation := poPortrait
else
Printer.Orientation := poLandscape;
FOrientPage := Value;
Printer.BeginDoc;
Printer.Abort;
end;
Voilà le problème :
lorsque je modifie la propriété OrientPage, dans la form où se trouve le composant, la valeur du champ FOrientPage
est bien modifié et l'orientation de l'imprimante aussi
mais lorsque je modifie la propriété Police dans la form, seulement la valeur du champ FPolice change mais pas
la police de l'imprimante.
En fait, en mode debug, je ne rentre jamais dans la procedure SetPolice alors que je rentre bien dans SetOrientPage.
Ai-je fait une erreur où bien il existe une fonctionnalité que je ne connais pas ?
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 12 mars 2003 à 20:23
Les propriétés possèdent ce que l'on appelle des accesseurs, c'est à dire des méthodes auxquels on passe des paramètres qui serviront à modifier les "champs".
En affectant directement une valeur à un champ, en l'occurence FPolice, tu ne passes pas par la méthode destinée à écrire la nouvelle valeur dans le champ FPolice.
Pour y parvenir, tu dois affecter la nouvelle valeur à la propriété :
ImpRequête.Police := Form1.Font;
Alors, pourquoi celà est-il possible ?
Eh bien, si tu avais déclaré la classe TImpRequete dans une autre unité, Delphi t'aurait refusé l'accès à un champ déclaré dans une section Private (ou protected).
Revois les règles de portée des sections : de n'importe quelle partie du code figurant dans une unité, tu peux accèder aux membres de n'importe quelle section d'une autre classe déclarée dans la même unité.
De manière générale, il ne faut JAMAIS tenter d'accéder aux membres d'une classe dont la portée a été restreinte par le concepteur de la classe.
De plus, j'ajouterai que c'est contraire à l'esprit de la programmation orientée objet.
May Delphi be with you