Plantage inspecteur d'objet

Oniria Messages postés 292 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 18 décembre 2014 - 28 sept. 2007 à 18:48
Oniria Messages postés 292 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 18 décembre 2014 - 29 sept. 2007 à 11:42
Bonjour,

Voila un gros probléme que j'ai actuellement et je ne parvients vraiment pas à comprendre.
Je suis en train de développer un composant (mon premier) qui permet de communiquer avec un TPE (Lecteur de carte bleu des commercant).
Ce composant utilise pour communiquer le fameux composant comport. Or j'ai mis comport dans les property de manière à pouvoir rendre mon composant moins fastidieux. La propriété apparait correctement dans l'inspecteur d'objet lorsque je place mon composant sur la fiche. Si je place également sur ma fiche un composant Comport, il apparait dans la liste de l'inspecteur d'objet dans ma rubrique comport, mais dés que je sélectionne le comport, une erreur se produit : violation d'accés dans le module CPortLib7.bpl.
Je précise que mon composant est dans un paquet perso que j'ai appelé Protocole.

Voici un petit bout de code :

TDoErrorEvent = Procedure(Sender : TObject; Erreur : integer;MsgErreur : string) of object;

TLecteurCB = class(TComponent)
private
  FCaisse : boolean; // = True si c'est une caisse, False si TPE
  FMaitre : Boolean; // =True si on est le maitre, false si on est l'esclave
  FTransaction : integer; // =0 si rien n'a marché, 1 si 1e phase , 2 si tout c'est bien passé
  FNumCaisse : integer; // Numéro de la caisse
  FMontant : real; // montant
  FDevise : integer; // code chiffre de la devise
  FPrivee : string; // zone privée de la transmission
  FReponse : string; // Reponse du TPE si mode maitre
  FQueryRep : boolean; // Reponse demande ou non au TPE
  FMode : char; // Mode de payement (1 CB;...)
  FType : char; // Type de payement (0 achat, 1 remboursement...)
  FStat : char; // Retour opération (0 transaction acceptée...)
  etat_transmission : integer;
  BufferRx : array[0..65535] of byte;
  BufferRx_Count : integer;
  trame_Tx,trame_Rx : array[0..100] of byte;
  nb_octet_recevoir : integer;
  nb_octet_emettre : integer;
 
  // Objet associé
  Timer_TO : TTimer;
  FComport : TComport;
  FComlink : TComlink;
  FBaudrate : TBaudrate;
  FDataBits : TDatabits;
  FParity : TParityBits;
  FStop : TStopBits;
  FComport : string;
  FErrorEvent : TDoErrorEvent; // événement si une erreur apparait
  FOnFinished : TNotifyEvent; // événement si la transaction s'est bien passé (à la fin)
 
  function CheckTrame :integer;
  Procedure CreateTrame;
  Function FCheckTransaction : boolean;
  procedure SetComPort(const Value: TComPort);
 
public

  constructor Create(AOwner : TComponent);override;
  destructor Destroy; override;
  function Connect : integer; // Connecte le port série et attend en esclave
  function Start : integer;  // Si on est en mode maitre, entame la transaction sinon attend en esclave avant de transmettre
  function Cancel : integer; // Annule la transaction
  function GetDeviseNum(type_recherche:integer;dev : string):integer;// type_recherche=0 si dev=code texte, =1 si dev=libelle
  function GetDeviseLibelle(CodeDeviseNum : integer) : string;
  function GetDeviseCodetxt(CodeDeviseNum : integer) : string;
  procedure Timer_TOTimer(Sender: TObject);
  procedure FComportRxChar(Sender: TObject; Count: Integer);

published
  property Comport : TComport read FComport write setComport;
  property Caisse : boolean read FCaisse write FCaisse; // = True si c'est une caisse, False si TPE
  property Transaction : boolean read FCheckTransaction ; // =True si toute la transaction s'est bien passée
  Property NumCaisse : integer read FNumCaisse write FNumCaisse; // Numéro de la caisse
  Property Montant : real read FMontant write FMontant; // montant
  Property Devise : integer read FDevise write FDevise; // code chiffre de la devise
  Property Privee : string read FPrivee write FPrivee; // zone privée de la transmission
  Property Reponse : string read FReponse write FReponse; // Reponse du TPE si mode maitre
  property QueryRep : boolean read FQueryRep write FQueryRep; // Reponse demande ou non au TPE
  property Mode : char read FMode write FMode; // Mode de payement (1 CB;...)
  property TypePaye : char read FType write FType; // Type de payement (0 achat, 1 remboursement...)
  property Stat : char read FStat write FStat; // Retour opération (0 transaction acceptée...)
  property OnError : TDoErrorEvent read FErrorEvent write FErrorEvent;
  property OnFinished : TNotifyEvent read FOnFinished write FOnFinished;
end;

implementation

//******************************************************************************
constructor TLecteurCB.Create(AOwner : TComponent);
begin
  inherited;
  // Creation des composants
  Timer_TO:=TTimer.Create(nil);
  //FComport:=TComport.Create(Self);
  Timer_TO.OnTimer:=Timer_TOTimer;
  Timer_TO.Enabled:=False;
  FErrorEvent:=nil;
  FOnFinished:=nil;

end;

//******************************************************************************
destructor TLecteurCB.Destroy;
begin
  Timer_TO.Free;
  inherited destroy;
end;

*
*je n'ai pas recopié toutes les procedures et fonction
*
//******************************************************************************
procedure TLecteurCB.SetComPort(const Value: TComPort);
begin
  if Value <> FComport then
  begin
    if FComport <> nil then
      FComport.UnRegisterLink(FComLink);
    FComport := Value;
    if FComport <> nil then
    begin
      FComport.FreeNotification(Self);
      FComport.RegisterLink(FComLink);
      FComport.OnRxChar:=FComportRxChar;
     
      // réglage par défaut du port série
      //FComport.BaudRate:=br1200;
      //FComport.DataBits:=dbSeven;
      //FComport.StopBits:=sbOneStopBit;
      //FComport.Port:='COM1';
      //FComport.Parity.Bits:=prEven;
      //FComport.Parity.Check:=True;
    end;
  end;
end;

end.

Ce que je ne comprend pas c'est que pour faire ca, je me suis basé sur le composant TComLed dont la fonction SetComport est très semblable.
Si quelqu'un a une petite idée, je suis vraiment preneur. (En plus, je compte mettre ce source sur le site pour en faire profiter tout le monde mais comme il est actuellement, je ne peux pas).

Le composant fonctionne parfaitement si le comport n'est plus accessible dans les propriètés et et que je l'utilise normalement.

Merci au bonne volonté

Oniria

2 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
28 sept. 2007 à 19:44
type
  TLecteurCB = class(TComponent)
  private
    fComport : TComport;
    procedure SetComport(value : TComport);
    ...
  protected
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  public
    constructor Create(AOwner: TComponent); override;
    ...
  published
    property Comport : TComport read fComport write SetComport;
    ...
  end;

constructor TLecteurCB.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  fComport := nil;
  Timer_TO := TTimer.Create(self);
  Timer_TO.Enabled := False; 
  Timer_TO.OnTimer := Timer_TOTimer;
end;

procedure TLinkedCompo.Notification(AComponent: TComponent; Operation: TOperation);
begin  if (AComponent fComport) and (Operation opRemove) then
  begin
    fComport := nil;
  end;
  inherited Notification(AComponent, Operation);
end;

procedure TLinkedCompo.SetComport(value: TComport);
begin
  if Assigned(fComport) and (Value <> fComport) then
  begin
    fComport.UnregisterLink(fComLink);
    fComport.RemoveFreeNotification(Self);
  end;
 
  fComport := Value;

  if Assigned(fComport) then
  begin
    fComport.FreeNotification(Self);
    fComport.RegisterLink(fComLink);
    ...
  end;
end;



<hr size="2" width="100%" />


http://deefaze.gnomz.com
0
Oniria Messages postés 292 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 18 décembre 2014 3
29 sept. 2007 à 11:42
Bonjour,
Je viens d'essayer ce que tu as mis, et j'ai toujours le probléme :

Violation d'accés à l'adresse 04EE5292 dans la module 'CPortLib7.bpl', lecture à l'adresse 00000012

por information, je suis sous delphi7.

Oniria
0
Rejoignez-nous