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?
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
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
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 ... –