Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : QuickReport4 + FindComponent = EAccessViolation [ Divers / Aide et documentation ] (informatixo)

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é 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 RightStr [ par dunith ] Bonjour j'ai une procédure son implémentation est comme suit:procedure TGestCAB.CodeRecu(Sender: TObject; returnPacket : string);  var   Code : String Besoin de précision pour un code [ par emirej ] Bonjour j'aimerais avoir un peu d'aide pour mon code merci.Voici mon code :unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, G gestion d'évènement pour lecture des codes barres [ par dunith ] Bonjour j'ai déjà posé la question à porpos des lecteurs codes barres, mais je n'ai pas eu de réponse... alors j'ai créer un objet TGestCAB qui gère l quickReport et sql en delphi [ par Eros2007 ] Bonjour tout le monde.voila ma question:j'utilise une requette sql pour pouvoir faire un preview et imprimer par la suite les enregistrements des clie Mettre caractère " & " dans un bouton [ par Bacterius ] Bonjour,je voudrais juste connaître l'astuce pour pouvoir mettre le caractère "&" dans le Caption d'un TButton, car sa propriété ShowAccelChar n'est p Molette de la souris [ par mighty_warrior ] Bonsoir,Dans mon application (jeu) j'utilise le code du genre  if IsKeyDown(VK_RBUTTON) then... pour connaître l'utilisa Transformer du texte en code [ par Bacterius ] Bonjour, je voulais savoir s'il était possible de charger par exemple, un fichier texte contenant ca :procedure Nouvelleprocedure(Var1, Var2: Type);be comment convertir un char en sa valeur code touche? [ par mighty_warrior ] Bonsoir,donc ma question: comment convertir un char en sa valeur code touche?par exemple pour la lettre A on sait que son code touche est 65 mais dans


Nos sponsors

Sondage...

CalendriCode

Novembre 2008
LMMJVSD
     12
3456789
10111213141516
17181920212223
24252627282930

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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
Temps d'éxécution de la page : 0,265 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.