Problème composant

Quinve Messages postés 4 Date d'inscription mardi 23 octobre 2001 Statut Membre Dernière intervention 25 décembre 2007 - 12 mars 2003 à 09:14
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Derniè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 ?

Si quelqu'un pouvait m'éclairer. Merci d'avance.

Cordialement. Raphael 8-)

1 réponse

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
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
0
Rejoignez-nous