Oniria
Messages postés292Date d'inscriptiondimanche 14 mars 2004StatutMembreDernière intervention18 décembre 2014
-
28 sept. 2007 à 18:48
Oniria
Messages postés292Date d'inscriptiondimanche 14 mars 2004StatutMembreDernière intervention18 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.
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.
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;