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.
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]