begin process at 2012 02 09 23:04:45
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Divers

 > 

Aide et documentation

 > 

QuickReport4 + FindComponent = EAccessViolation


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

QuickReport4 + FindComponent = EAccessViolation

mercredi 13 février 2008 à 18:24:36 | QuickReport4 + FindComponent = EAccessViolation

informatixo

Membre Club
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 !
mercredi 13 février 2008 à 18:47:09 | Re : QuickReport4 + FindComponent = EAccessViolation

Shai

qrlabel := TQRLabel.Create(frmRapport);

le Composant passé en paramètre du Create est le Owner, et c'est lui qui contient la liste des components qui est parcouru via FindComponent

Le EAccessViolation est que FindComponent renvoie nil


Shai Le Troll
!! Aide via F1 !! Pensez-y !!
 
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le conf

jeudi 14 février 2008 à 08:44:35 | Re : QuickReport4 + FindComponent = EAccessViolation

informatixo

Membre Club
Tout d'abord merci beaucoup de ta réponse Shai.

J'ai effectivement essayé ta solution mais celà ne fonctionne pas car le composant n'est pas situé sur le QuickReport (il s'agit d'un TQRLabel et non d'un TLabel).

J'ai donc essayé une variante de ta solution qui est "TQRLabel.Create(frmRapport.qrPage)" mais celà ne fonctionne pas non plus !

J'avais fais un qrlabel.Parent := frmRapport.qrPage n'est-ce pas la même chose que la ligne ci-dessus ?

En attendant merci beaucoup de ta participation.

Cordialement,
informatixo

Que la force soit avec vous !
jeudi 14 février 2008 à 10:50:02 | Re : QuickReport4 + FindComponent = EAccessViolation

Shai

Je ne comprend pas  ta réponse,

"car le composant n'est pas situé sur le QuickReport (il s'agit d'un TQRLabel et non d'un TLabel)."

il y a pas de relation de parent (ancrage / visibilité) mais de possession d'objet ... et ta phrase n'a ni queue ni tête

Que renvoie le FindComponent ? nil ? ou autre chose, tu cast en TQRLabel mais sans vérifier la classes ...

Si tu as des problèmes, tu peux ajouter dans une TStringList triées ...

ObjectsNamedList.AddObject( 'qrlabel1', qrlabel);

et dans le OnStartPage

idx := ObjectsNamedList.IndexOf('qrlabel1');
if idx >= 0 then
begin
  QRLabel := (ObjectsNamedList.Objects[i] as TQRLabel);
  if Assigned(QRLabel) then
    QRLabel := 'Label 1';
end;



Sinon, ayant fait de l'industrie, QuickReport selon mes tests, ne supporte pas d'être lancé en Thread, si tu dois faire des impressions, il faut les pooler dans une liste puis les imprimer séquentiellement dans un Timer, mais tu n'en es pas encore là ...


Shai Le Troll
!! Aide via F1 !! Pensez-y !!
 
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le conf

jeudi 14 février 2008 à 13:21:53 | Re : QuickReport4 + FindComponent = EAccessViolation

informatixo

Membre Club
Effectivement ma phrase n'a ni queue ni tête et je m'en excuse (pourtant j'ai relu avant de poster mais visiblement pas assez).

Je voulais dire "car le composant est situé sur le QuickReport (il s'agit d'un TQRLabel et non d'un TLabel)."".

Pour ta seconde question le FindComponent renvoi effectivement "nil".

Si je crée mon label sur le "frmRapport" lorsque que j'exécute il n'apparaît pas sur mon report. En revanche si je met comme parent "qrPage" (c'est-à-dire mon TQuickRep) alors là il apparaît bien.

Mais le problème c'est toujours mon FindComponent dans le "OnStartPage" qui passe pas et me génère une "EAccessViolation" car il est "nil".

Cordialement,
informatixo

Que la force soit avec vous !
samedi 1 mars 2008 à 20:48:57 | Re : QuickReport4 + FindComponent = EAccessViolation

informatixo

Membre Club
Réponse acceptée !
Après avoir relu ta réponse plusieurs fois Shai, je me suis aperçu que j'avais effectivement mal compris la différence entre la notion de "owner" et celle de "Parent".

Et effectivement celà ne pouvait engendrer qu'une erreur de violation d'accès.

Je suis donc finalement arrivé à trouver la solution qui me convenait le mieux et que voici :

Je crée mes composants sur la page du Quickreport (qrPage) en m'inspirant du premier exemple que tu m'a donné de cette façon TQRlabel.Create(frmRapport.qrPage).

Ensuite j'y accède depuis le "OnStartPage" en faisant frmRapport.qrPage.FindComponent('qrlabel1')).Caption := 'Label 1'

Mon problème résidait dans le fait que je ne précisait pas au "FindComponent" où cherchait les composants.

Le fait de créer les composants sur la page du QuickReport me permet de générer plusieurs rapports de manière dynamique tout en gardant les mêmes noms de composants sur chaque page de rapport puisque le propriétaire n'est plus la form mais bien successivement chaque page de rapport.

Ainsi mon problème est enfin résolu.

Je te remercie encore Shai pour ta participation qui m'a permis de comprendre quelquechose d'essentiel dans la gestion dynamique des composants.

Que la force soit avec vous !


Cette discussion est classée dans : bouton, code, labels, qrlabel, qrpage


Répondre à ce message

Sujets en rapport avec ce message

Problème avec TFrame [ par Inekman ] Salut people,J'ai un petit soucis concernant l'utilisation des TFrame.Posons-le problème :-> j'ai une fenêtre principale contenant 2 boutons : bt1 et code d'un bouton [ par madjido ] salutj'ai une application delphi(gestion d'une librairie comerciale)pour ajouter un nouveau livre j'ais la forme (caption :livre)j'ai tous les champs fermeture du projet [ par youhibadelphi ] Salut Dans un bouton j'ai écris le code suivant pour fermer mon projet: var rep:word; Begin rep:=messagedlg('etes vous sur de vouloir quitter'),mtinf Bouton terminer 3ème étapes pour poster un code [ par piette ] salut,merci à Bacterius  et ...\ Dan /...pour leurs réponses. Je m'aperçois que ma question n'est pas assez précise.Je recherche, pour déposer un code [CS]Comment ajouter un nouveau code-source : truc bizarre [ par pseudo3 ] Bonjour, Petite question : On fait comment pour ajouter un nouveau code-source car je viens d'essayer et arrivé à "Etape 3 : Faciliter le referenceme Création d'un bouton simple par code - problème [ par kabbabi ] Bonjour, Je suis face à un problème tout con : Je veux créer un bouton par code mais le bouton ne s'affiche pas ! Pourtant il n'y a pas d'erreur vous Comment éviter [ par DONALD3D ] Bonjour, j'envoie un texte à un serveur qui se charge d'affectuer une action dès réception. Je souhaiterai bloquer l'action de bouton "envoi" tant qu [CS]Ajout de code [ par jcniloc ] Bonjour, J'ai "commis" une petite application Delphi que j'aurais aimé partager afin de recevoir des critiques (constructives je l'espère). Mais à l'é dupliquer une feuille excel [ par pratrick ] messieur Bonjour je cherche à dupliquer une feuille excel j'ai essayé [code=pas]OleApplication.ActiveWorkbook.Worksheets[2].Add[/code] et [code=pa Extented me pose problèmes :-( [ par Damien7784 ] Bonsoir à tous; j'espère être dans la bonne section pour exposer mon souçis. Voilà, je code depuis peux (hier lol) en Pascal ( delphi 7). J'ai réus


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,966 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales