Bonsoir le forum,
Je fais encore appel à votre bienveillance pour un problème d'accès à des composants.
Pour résumer je cherche à créer dynamiquement un report et à pouvoir accéder aux labels qu'il contient pour les modifier en fonction des besoins du programme.
J'ai une première fiche ("frmMenuPrincipal") qui contient un simple bouton me permettant de lancer le rapport et qui contient le code suivant sur l'évènement "Clic" :
procedure TfrmMenuPrincipal.btnLancerRapportClick(Sender: TObject);
var
qrlabel: TQRLabel;
begin
qrlabel := TQRLabel.Create(self);
qrlabel.Name := 'qrlabel1';
qrlabel.Parent := frmRapport.qrPage;
qrlabel := TQRLabel.Create(self);
qrlabel.Caption := 'Label 2';
qrlabel.Name := 'qrlabel2';
qrlabel.Left := 600;
qrlabel.Parent := frmRapport.qrPage;
frmRapport.qrPage.Preview;
end;J'ai ensuite une seconde form ("frmRapport") qui contient un objet "TQuickRep" (qui s'appelle "qrPage" dans mon exemple) avec une bande de détail.
Deux labels sont créés dynamiquement sur le "qrPage" depuis le code du bouton ci-dessus.
Je voudrais pouvoir modifier les labels qui ont été créé dynamiquement grâce à un évènement du "qrPage", c'est la raison pour laquelle je n'ai pas mis de "Caption" pour le "qrlabel1" dans le code du bouton.
Comme je ne savais pas trop comment procéder, j'ai utilisé l'évènement "OnStartPage" comme en témoigne le code ci-dessous :
procedure TfrmRapport.qrPageStartPage(Sender: TCustomQuickRep);
begin
TQRLabel(FindComponent('qrlabel1')).Caption := 'Label 1';
end;Le problème c'est que la ligne de code ci-dessus me génère une exception de type "EAccessViolation".
Je me doute que ce n'est pas la faute de l'ordinateur mais bien du développeur que je suis mais je ne vois pas d'où proviens mon erreur.
Mon hypothèse est que du fait que j'ai réalisé un "Preview" depuis le bouton, je ne peux pas accéder à mon objet "qrlabel1" et donc il me dis que j'essaye d'accéder à un objet inexistant ?
Ais-je raison ?
Si oui, comment puis-je procéder pour aboutir à la solution que je désire ?
Je tiens à préciser que ceci est un exemple simplifié d'une application industrielle que je reprends afin de rendre des rapports dynamiques car des champs doivent ou ne doivent pas être affichés en fonction des résultats d'un automate stockés dans une base de données.
J'ai déjà une grande quantité de code qui se situe dans l'évènement "OnStartPage" et qui servait jusque là à remplir le contenu des labels fixes que je suis en train de rendre dynamique.
Une première solution bien contraignante serait de placer le code qui gère le contenu des labels dynamiques dans le code du bouton mais je ne sais pas trop si celà serait vraiment judicieux.
Alors avant de m'embarquer dans mes délires solitaires, je préfère demander l'avis de la communauté delphienne.
Je vous remercie d'avance de l'attention que vous porterez à ce post et des réponses que vous pourriez me fournir.
Cordialement,
informatixo
Que la force soit avec vous !