2009-06-10 5 views
2

Je suis sur Delphi 2009 et mon application contient un module de données qui comporte un composant personnalisé nommé 'Globals'.Violation d'accès lors de l'affectation d'une propriété de composant sur le module de données

Dans une autre forme dans l'application, je suis en train de changer une propriété publiée (une chaîne) sur le composant Globals:

dm.Globals.qhProject := _ProjectName.Text; //always gives access violation 

Le contrôle de _ProjectName est un descendant de TLabeledEdit. Je reçois toujours une violation d'accès s'il y a du texte dans la boîte.

Cependant, si j'assing manuellement une chaîne à la propriété, je ne reçois pas l'AV:

dm.Globals.qhProject := 'some text'; //works 

est ici la déclaration de la propriété qhProject:

FqhProject: string;  
property qhProject: string read FqhProject write FqhProject; 

Je ne peux pas comprendre pourquoi il y a un AV ici du tout. J'ai essayé de déplacer l'ordre de création automatique du module formulaires/données, mais j'ai toujours l'AV.

Qu'est-ce que je fais mal ici?

Mise à jour:

J'utilise Effets Billenium TFormContainer pour basculer entre les différentes formes dans l'application. Les deux formulaires concernés sont dans le conteneur de formulaire. Une forme, TdlgSummary, contient les éléments suivants:

procedure TdlgSummary.SyncVars; 
begin 
    dm.Globals.qhProject := _ProjectName.Text 
end; 

L'autre forme, TdlgFinalize, contient les éléments suivants:

dlgSummary.SyncVars; 

Si je lance SyncVars à l'intérieur de dlgSummary, il fonctionne très bien. Si je l'appelle de dlgFinalize, je reçois l'AV. Cela semble être le cœur du problème, mais je ne peux pas comprendre ce qui ne va pas. Même si je passe le contrôle à dlgFinalize, dlgSummary n'a pas été détruit, parce que je peux y revenir. Des idées?

Répondre

4

Il me semble que _ProjectName est nul. Essayez de placer un point d'arrêt sur cette ligne et examinez _ProjectName, voir si elle donne une référence valide ou non.

+0

Plusieurs de ces formulaires se trouvent dans un conteneur TFormContainer, qui fait partie de la suite de composants Billenium Effects. Il donne une référence valide lorsque le formulaire contenant _ProjectName exécute le code ci-dessus. Lorsqu'un autre formulaire l'exécute, la référence n'est pas valide. Je ne sais pas où aller à partir d'ici, car je peux basculer entre les formes, et le formulaire avec le contrôle _ProjectName n'a pas été détruit .... – croceldon

+0

Plus de détails: Il semble que je ne peux pas accéder au formulaire avec la modification éditée (TdlgSummary) d'un autre formulaire. Je ne peux pas comprendre pourquoi, cependant. J'ai le fichier source dans l'instruction des utilisations, et je suis d'y accéder comme suit: dlgSummary._ProjectName.Text // lance une AV – croceldon

+0

Je ne suis pas familier avec les effets Billenium ou des conteneurs de forme, mais vérifiez à voir si le formulaire est créé par le conteneur de formulaire et non par le DPR. dlgSummary est une variable globale déclarée dans l'unité du formulaire, mais si Delphi ne l'initialise pas au démarrage parce que le conteneur de formulaire est supposé le faire, le conteneur de formulaire instancie simplement une instance de la classe de formulaire et l'affecte à une liste interne. pas au global désigné, votre variable de forme globale sera laissée comme nulle.Je tire aveuglément dans le noir ici, mais vois si c'est ce qui se passe ... –

Questions connexes