[Delphi 6] creation de composants, pb avec 1 propriété.

creation de composants, pb avec 1 propriété. [Delphi 6] - Programmation

Marsh Posté le 18-01-2002 à 12:05:12    

slut,
j'écrit un composant dérivant de TPanel contenant 5 panneau dérivant aussi de TPanel et contenant chacun 2 labels. J'aimerais au final pouvoir à partir du composant parent (le premier donc) modifier le font du groupe de label.
je vais essayer de faire un schéma pour mieux me faire comprendre :
il ya donc 5 panneau avec 2 TLabel chacun :
lab1    lab1     lab1     lab1       lab1
  lab2     lab2    lab2     lab2       lab2
 
ça ressemble un peu à ça...
 
donc, j'aimerais créer des propriétés fontLab1 et fontLab2 qui modifierais respectivement la police de tous les lab1 et de tous les lab2.
 
 
LE PB EST INDIQUE EN BAS...
 
passons au code, maintenant :
j'ai défini l'interface de cette façon :
 
 
 
// Le "grand-papa", le conteneur de tout les contenant, le pére des pére, 'fin bref, c'est lui qui contient tout quoi... :)
 
TIndexDisplayer = class(TPanel, IIndexDisplayer)
[...]
 private
    panels : array [0..4] of TIndexValuePanel;
[...]
    idxNFont, idxVFont: TFont;
[...]
    procedure setNFont(font: TFont);
    procedure setVFont(font: TFont);
    function getNFont(font: TFont);
    function getVFont(font: TFont);
[...]
  published
    property idxNameFont: TFont read getNFont write setNFont stored true;
    property idxValueFont: TFont read getVFont write setVfont stored true;
[...]
end;
 
// ceci est bien entendu défini avant la classe précédente :
TIndexValuePanel = class(TPanel)
public
  constructor Create(AOwner: TComponent); override;
[...]
      protected
       labName: TLabel;   // intitulé de l'index
       labValue: TLabel;   // valeur de l'index.
[...]
   end;
 
 
 
 
au niveau de l'implantation :  
 
constructor TIndexDisplayer.create(AOwner: TComponent);
var
i: SmallInt;
begin
   inherited create(AOwner);
 [...]
   for i := 0 to 4 do
   begin
      panels[i] := TIndexValuePanel.Create(self);
      self.insertControl(panels[i]);   // ils sont ainsi censés se "tuer" tout seul !
      [...]
      panels[i].labName.ParentFont := false;
      panels[i].labValue.ParentFont := false;
   end;
   idxNFont := panels[0].labName.Font;
   idxVFont := panels[0].labValue.Font;
[...]
end;
 
procedure TIndexDisplayer.setNFont(font: TFont);
var
 i: SmallInt;
begin
 if font <> nil then
   begin
    idxNFont := font;
      for i := 0 to 4 do
       panels[i].labName.Font := font;
   end;
end;
 
procedure TIndexDisplayer.setVFont(font: TFont);
var
 i: SmallInt;
begin
 if font <> nil then
   begin
    idxVFont := font;
      for i := 0 to 4 do
       panels[i].labValue.Font := font;
   end;
end;
 
 
function TIndexDisplayer.getVFont: TFont;
begin
 result := idxVFont;
end;
 
function TIndexDisplayer.getNFont: TFont;
begin
 result := idxNFont ;
end;
 
 
 
 
 
 
constructor TIndexValuePanel.Create(AOwner: TComponent);
begin
   inherited create(AOwner);
   labName := TLabel.Create(self);
   labValue := TLabel.create(Self);
   [...]
   InsertControl(labName);
   InsertControl(labValue);
   [...]
end;
 
 
 
 
LE PROBLEME :
compilation ok.
insertion du composant dans une fiche: pas de pb.
mais lorsque je modifie la propriété idxNameFont ou idxValueFont, j'obtient parfois une erreur du type : "Violation d'accès à l'adresse 4001D0A2 dans le module RTL60.BPL. lecture de l'adresse FFFFFFFF." ensuite j'obtient systèmatiquement ce message si j'essaye de compiler. parfois, je n'ai pas d'erreur mais la police ne se modifie que sur le premier groupe de label (que dans le premier TIndexValuePanel).
j'ai essayé de l'utiliser manuellement (insertion "manuelle" dans la fiche) et de modifier manuellement les propriétés et tout marche nickel : pas d'erreurs et tous les labels se retrouve avec la police spécifiée. :ouch:  
 
 
alors, ma question est : quelle connerie ai-je fais pour que l'éditeur de propriétés de delphi m'en veuille autant ? quelle subtilité n'ai-je pas saisie ? quels sont les erreurs d'algo qui entraine ceci ?  
si le code ne parait pas à l'origine de cette erreur, comment y faire face ??

 

[edtdd]--Message édité par Moustaaki--[/edtdd]

Reply

Marsh Posté le 18-01-2002 à 12:05:12   

Reply

Marsh Posté le 18-01-2002 à 12:38:08    

up !

Reply

Marsh Posté le 18-01-2002 à 13:07:45    

après une première lecture je ne vois pas de vraie erreur, sauf une que j'ai commise moi-même avec des TStringList donc je me dis que c'est peut-être le même problème :
 
panels[i].labValue.Font := font;
 
change ça en  
 
panels[i].labValue.Font.Assign(font);
 
et l'autre ligne similaire de même, avec labName, de manière à ce qu'il copie les données du font passé en param au lieu de pointer simplement sur ce nouveau font (sans le savoir on manipule plein de pointeurs)

 

[edtdd]--Message édité par antp--[/edtdd]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 18-01-2002 à 13:54:56    

bin non, ça fait pareil : si je change le idxNameFont ou idxValueFont, on voit bien le changement de la police sur la fiche mais impossible de compiler (violation d'accès) et impossible de développer la propriété (en cliquant sur +)...
 
une autre possibilité ?

Reply

Marsh Posté le 18-01-2002 à 14:13:17    

bon, j'ai utiliser la méthode assign à chaque fois que j'attribuais font à une valeur et ya plus d'erreur !
sur la fiche à la conception, tous les labels ont la même police, ça a l'air nickel !
 
MAIS si je compile, seul le premier panneau de label utilise la police de caractère spécifiée, les autres panneau concervent la police de base.... POURQUOI ????  :cry:  
 
bref, je pensais que ça marchait, j'étais comme un fou mais en fait : ça marche po du tout....  
et pourtant, si j'attribut manuellement les valeurs, tout est nickel.
 
c'est pas à cause de mon TIndexDisplayer.create ? au niveau de l'initialisation des propriétés....

Reply

Marsh Posté le 18-01-2002 à 14:36:52    

essaie d'ajouter dans le debut du create:
idxNFont := TFont.Create;
idxVFont := TFont.Create;
 
et de faire un assign pour ceux la aussi (juste avant le for, là où y a un simple := que j'avais pas vu)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 18-01-2002 à 14:46:53    

bin, non... maintenant, il ne change plus aucune font à part à la conception...
j'ai l'impression qu'il ne concerve pas les valeurs des propriétés des labels... est-ce que je me trompe ?
'vais essayer de "bidouiller" en redéfinissant la méthode loaded...  
 
mais quelle galère qd même pour pas grand chose !

Reply

Marsh Posté le 18-01-2002 à 14:54:09    

bin voilà, j'ai rajouté ça :
 
 
procedure TIndexDisplayer.Loaded;
begin
 inherited loaded;
   idxNameFont := idxNFont;
   idxValueFont := idxVFont;
end;
 
 
 
et maintenant, ça marche !!!!!
c'est qu'effectivement, il ne delphi ne stockait pas les font dans les propriétés des labels alors il falait le lui rappeler...
c'est tout de même pas top et ça fait très bidouillage !
si t'as une autre solution, dis moi sinon, merci pour tout est à la prochaine !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed