Acess violation At Adress in module

Résolu
cs_Paounet Messages postés 36 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 6 juin 2023 - 18 août 2007 à 20:31
cs_Paounet Messages postés 36 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 6 juin 2023 - 21 août 2007 à 02:58
Apres creation de mon composant TGetPassword qui fonctionne.. j'ai créé une feuille principale Form1 (Unit1) qui utilise la 2ème feuille Modale Form2 avec Unit2 qui contient le composant..
La fonction Test(x,y,z)  du Composant fonctionne bien à l'interieur de la feuille modale Form2 ou il est installé, mais non a partir de la feuille principale Form1 en m'affichant le message:
« Acess violation At Address  0046B5D1 in Module 'Programme.exe'
(mon programme compilé). Read of Addres 00000364...
Quelqu'un peut-il m'aiguiller pour trouver l'Erreur.. et les codes..D'avance Merci
Unit 1                                                            Unit 2
Form 1                                                           Form2
...
Uses Unit2;                                                     Uses Unit1;
.                                 
.                                                                     ModalResult:=mrOk;
Procedure...
 If (Form2.Test(MDP,Login,Codes) Then --- Message Erreur.
Paounet

8 réponses

Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
20 août 2007 à 21:12
non je pense pas que ca vienne de ton composant avec ce que tu nous met.
par contre ce qui m'etonne c'est que ton compo herite de TPanel! je suppose qu'il contient les edits de saisie des valeurs.
enfin, si je comprend bien ce que tu as fait, j'aurait fait un truc dans ce genre (c'est peut etre deja ce que tu as fait):

TGetPassword = class(TPanel)
private
    edtMDP: TEdit;
    edtLogin: TEdit;
    edtCodes: TEdit;
    ...
public
    property MDP: string read GetMDP write SetMDP;
    property Login: string read GetLogin write SetLogin;
    property Codes: string read GetCodes write SetCodes;
    ...
    function Test: Boolean;
end;

...

function TGetPassword.GetMDP: string;
begin
    Result := edtMDP.Text;
end;

procedure TGetPassword.SetMDP(const Value: string);
begin
    edtMDP.Text := Value;
end;

//Idem pour Login et Codes

function TGetPassword.Test: Boolean;
begin
    //Ton code en utilisant les properties
end;
3
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
19 août 2007 à 14:34
Procedure...
if not Assigned(Form2) then ShowMessage('form2=nil');
 If (Form2.Test(MDP,Login,Codes) Then --- Message Erreur
0
cs_Paounet Messages postés 36 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 6 juin 2023 3
19 août 2007 à 16:13
Merci pour la réponse .....
Mais elle ne répond pas à mon problème.. Tout se passe comme si ma fonction Test(....) de mon composant n'est pas accesible depuis une feuille autre que celle ou se trouve le composant..
Le code ' if not Assigned(Form2) then ShowMessage('form2=nil');' me renvoit le message 'form2=nil' et mon code du test(...) le même message Access Vialotion...
Bien que que feuille1 a l'unité de feuille2 c'est comme si mon compo est invisible..

Paounet
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
19 août 2007 à 23:06
heuuuu je crois que tu n'as pas bien compris ce que je voulais dire !!!
ta variable Form2 n'est pas affectée .
donc plusieurs possibilités:
    - ta form n'est pas créée automatiquement (tu dois avoir un createforl(Form2, TForm2) dans la source de ton dpr
    - tu as une autre variable qui s'appele form2 qui n'est pas intialisée
    - la fonction test est appelée dans le Create ou le OnCreate de ta Form1
    - ...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Paounet Messages postés 36 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 6 juin 2023 3
20 août 2007 à 04:05
Je te remercie sincérement de ta sollicitude Guillemouze
..

Ma forme2 se trouve bien dans le Dpr.
la fonction Test est demandée sur le OnShow de Form1.
En fait je te passe les codes:
------------------------------DPR --------------------
program Protection;
uses
  Forms,
  Demo in 'Demo.pas' {FormDemo},       Feuille Prinicpale -> Form1
  Saisie in 'Saisie.pas' {FormSaisie},         Feuille Modale    -> Form2
  ProtectF in 'ProtectF.pas' {FormF},                 "
  ProtectR in 'ProtectR.pas' {FormR};                "
{$R *.res}
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.Title := 'Protection des Logiciels';
  Application.CreateForm(TFormDemo, FormDemo);          ->   Form1
  Application.CreateForm(TFormSaisie, FormSaisie);           ->   Form2
  Application.CreateForm(TFormF, FormF);
  Application.CreateForm(TFormR, FormR);
  Application.Run;
end.
--------------------------Feuille Principale  Form1= FormDemo ---------
Unit Demo
.........
Uses ProtectF,ProtectR,Saisie;         Saisie est l'unité ou se trouve le Compo.
{$R *.dfm}
// Test d'existence du fichier Licence.dat et prise des Codes
procedure TFormDemo.FormShow(Sender:TObject);
Const Fichier='Licence.dat';
Var F:TextFile;Code:String;Res:Array[0..2] Of String;i,j:Integer;
begin
  Flag:=False;For i:=0 to 2 Do Res[i]:='';
  If FileExists(Fichier)=False Then Exit Else
    Begin AssignFile(F,Fichier);Reset(F);Read(F,Code);CloseFile(F);
    Code:=Crypte(Code);End;i:=0;For j:=1 to Length(Code) Do
      If Code[j]<>#13 then Res[i]:=Res[i]+Code[j] Else Inc(i);
  // Execute le Test par rapport au composant TGetPassword des Codes
  // Exemple '3452CB6A','DELPHI','4381B685A8075C3452CB'
  If FormSaisie.GetPW.Test(Res[0],Res[1],Res[2]) Then Begin
    Enregistre.visible: =False;Version.Caption:='Version Complète';
    End Else Flag:=False;
end;
-------------------- Feuille Modale Form2 = FormSaisie --------
Unit Saisie;
interface
uses Forms,GetPassword,StdCtrls,Buttons,Classes,Controls,ExtCtrls,
     Dialogs;
type
  TFormSaisie = class(TForm)
    Retour:TBitBtn;
    GetPW:TGetPassword;
    procedure RetourClick(Sender:TObject);
  end;
var FormSaisie:TFormSaisie;Flag:Boolean;
implementation
Uses Demo;
{$R *.dfm}
procedure TFormSaisie.RetourClick(Sender:TObject);
Const Mess='Valide';Var Mess1:String;
begin
  If GetPW.Test('3452CB6A','DELPHI','4381B685A8075C3452CB') then
    Mess1:='' Else Mess1:='Non ';
  ShowMessage(Mess1+Mess+#13);     ( Par contre ici ça marche)
  ModalResult:=mrOk;
end;
end.
-------------------------------------------------------------------------------
A tout hasard c'est le compo TGetPassword qui crée automatiquement en partie la feuille 2 - FormSaisie ( Attributs - rien d'autre)...
Paounet
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
20 août 2007 à 13:36
pas facile de debugger comme ca ...
je te conseille de faire du pas a pas et d'evaluer tes variables la ou ca plante.
tu peux aussi mettre un point d'arret dans le OnCreate de ta formeSaisie et un sur ta ligne qui pose probleme pour voir l'ordre d'appel (le create doit etre appelé avant la ligne en question)
0
cs_Paounet Messages postés 36 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 6 juin 2023 3
20 août 2007 à 17:09
Effectivement... J'ai contourné la difficulté en copiant de mon compo TGetPassword la fonction publique Test(etc...):Boolean; je l'ai intégrée dans ma 2ème feuille modale Formsaisie. En l'appelant de ma feuille princiaple tout fonctionne.. Bizarre, pourtant elle était déclarée comme publique. C'est dommage car je la retrouve 2 fois désormais.. Ca vient du compo c'ezst sûr mais je ne vois pas...

A tout hasard....
  TGetPassword = class(TPanel)
      .  
      .
      .
    Function Test(MDP,Login,Codes:String):Boolean;
   .
   .
// Fonction qui teste les valeurs saisies avec l'algorithme de calcul
Function TGetPassword.Test(MDP,Login,Codes:String):Boolean;
Var Chaine:String;i,Valeur,Nbre,Nb:Integer;
Begin
  Valeur:=0;
  // On récupère le Nombre Nb de Passe.Text:=MotPasse(IntToHex(Nbre,1))
  Nbre:=Round(Hexa(MDP));
  // Calcul de la Somme Ascii du Nom = Valeur
  For i:=1 To Length(Login) Do Inc(Valeur,Ord(Login[i]));
  // Calcul du Nombre générateur de Random Nb:=Valeur*Nbre
  Nb:=Valeur*Nbre;
  // Calcul du Code Activation Valide
  Chaine:=Copy(IntToStr(Valeur)+IntToHex(Valeur,1)+
    IntToHex(Nb,1)+IntToHex(Nbre,1),1,20);
  If Chaine=Codes then Test:=True Else Test:=False;
End;
Paounet
0
cs_Paounet Messages postés 36 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 6 juin 2023 3
21 août 2007 à 02:58
Effectivement ca y ressemble...  mon compo est de type TPanel et comprend pas  mal d'objets... Merci tout de même... Au debut je pensais que mon compo lorsqu'il était déposé sur une feuille, et qu'il la reformatait, celle-ci pouvait poser problème.. Mais avec ton aimable concours j'ai compris que lorsque la feuille 2 était lancée le compo devient après sa création accessible.. mais dès lors j'appelais la fonction du compo depuis la feuille 1, sa création n'étant pas faite....> ERREUR.. Je pense que c'est cela..

Dis moi à tout hasard.. lorsque je crée la feuille qui reçoit mon compo comment faire pour ajouter à ladite feuille (Form1) de nouvelles propriétés, voire fonction si tu sais Merci...

Je faisais ceci pour c=recréer ma feuille
------------------------------------------
Constructor TGetPassword.Create(Owner:TComponent);
Begin
  Inherited Create(Owner);
  If Owner is TForm then with TForm(Owner) Do Begin
    Begin { Mes propriétés celles visibles normalement }End;
    Mes Objets... etc..                              MERCI.
Paounet
0
Rejoignez-nous