creation de composants, pb avec 1 propriété. [Delphi 6] - Programmation
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]
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é ?
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 ????
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....
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)
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 !
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 !
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.
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]