Classe déclarée mais non trouvée dans un composant [Résolu]

Signaler
-
Messages postés
302
Date d'inscription
jeudi 29 septembre 2005
Statut
Membre
Dernière intervention
17 septembre 2013
-
Salut à tous

J'ai besoin de vos lumières car je bute sur un problème que je n'arrive pas à identifier (Surement un truc con que je vois pas )

J'ai réalisé un composant dont voici la structure

unit TracksMix;

type
 	
 TTracksMix=Class;
  
 TEffect = class(TCollectionItem)
  private
    fTracksMix:TTracksMix;
  protected 
  public
  published
  end;  
 
  TTrackMixPn = class(TCustomControl)
  private
    fTracksMix:TTracksMix;  
    ScrollBox:TScrollBox;
    fEffectCnt:TEffectCnt;
    fCaption:String;
    fSlider:TSlider;
    fPrgrBar:TPrgrBar;
    fFader:TFader;
    fOnChange : TNotifyEvent;
    Procedure Set_Caption(Value:String);
  protected
    procedure Resize; override;
    procedure Paint; override;   
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: integer); override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    Property Caption : String Read fCaption Write Set_Caption;
    Property Slider:TSlider Read fSlider Write fSlider;
    Property PrgrBarr:TPrgrBar Read fPrgrBar Write fPrgrBar;
    Property Fader:TFader Read fFader Write fFader;
    Property EffectCnt:TEffectCnt Read fEffectCnt Write fEffectCnt;  
  end;


{>>TTrackMix}
 TTrackMix = class(TCollectionItem)
  private
    fOnChange: TNotifyEvent;
    fTrackMixPn:TTrackMixPn;
    fCollection  : TCollection;	
  protected
    procedure AssignTo(Dest : TPersistent); override;
    procedure Change; virtual;
    function GetDisplayName : string; override;
    property Collection : TCollection  read fCollection write fCollection;  	
  public
    constructor Create(ACollection: TCollection); override;
    destructor Destroy; override;
    procedure Assign(Source : TPersistent); override;
  published
    Property TrackMixPn : TTrackMixPn Read fTrackMixPn write fTrackMixPn;
    property OnChange    :TNotifyEvent read fOnChange write fOnChange;
  end;  
  
{>>TTrackMixCnt}
  TTrackMixCnt = class(TOwnedCollection)
  Private
    fOwner : TPersistent;
  protected
    function GetItem(Index: Integer): TTrackMix;
    procedure SetItem(Index: Integer; Value: TTrackMix);
    function GetOwner: TPersistent; override;	
  public
    ItemIndex:Integer;
    constructor Create(AOwner: TPersistent);
    function Add: TTrackMix;
    property Items[Index: Integer]: TTrackMix Read GetItem Write SetItem;
  end;

  {EVENEMENTS}
    TSolo_Event = procedure(Sender: TObject) of object;
    TMute_Event = procedure(Sender: TObject) of object;
    TPanel_Event = procedure(Sender: TObject) of object;
    TEffectClick_Event = procedure(Sender: TObject) of object;
    TSliderChange_Event = procedure(Sender: TObject) of object;
    TPrgrChange_Event = procedure(Sender: TObject) of object;
    TFaderChange_Event = procedure(Sender: TObject) of object;

  {>>TTracksMix}
  TTracksMix = class(TCustomControl)
  private
    fTrackMixCnt:TTrackMixCnt;
  protected
    procedure Paint; override;
    procedure Resize; override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: integer); override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    Property TrackMixCnt:TTrackMixCnt Read fTrackMixCnt Write fTrackMixCnt;  
  end;


Jusque là pas de problème, le composant fonctionne nickel chrome .

Ceci dit j'essaye de lire et enregistrer ce composant et ses propriétés dans un fichier. J'utilise donc les procédures suivantes

{>>Procédure pour sauvegarder un projet}
procedure Save_Project(DestFile:String;Components:Array Of TComponent);
Var
  FS:TFileStream;
  IndexElmt:Integer;
Begin
  //On crée FS en mode création
  FS:=TFileStream.Create(DestFile,fmCreate);
  //On essaye
  Try
    //Pour tout les éléments du tableau
    For IndexElmt:=Low(Components) To High(Components) Do
    //D'enregistrer le composant correspondant
    FS.WriteComponent(Components[IndexElmt]);
  //Finalement
  Finally
    //On libere FS
    FS.Free;
  End;
End;

{>>Procédure pour ouvrir un projet}
procedure Open_Project(SourceFile:String;Components:Array Of TComponent);
Var
  FS:TFileStream;
  IndexElmt:Integer;
Begin
  //On crée FS en mode lecture
  FS:=TFileStream.Create(SourceFile,fmOpenRead);
  //On essaye
  Try
    //Pour tout les éléments du tableau
    For IndexElmt:=Low(Components) To High(Components) Do
    //De lire le flux dans le composant correspondant
    FS.ReadComponent(Components[IndexElmt]);
  //Finalement
  Finally
    //On libere FS
    FS.Free;
  End;
End;


Que j'utilise ainsi :

Open_Project('MonFichier.aze',[TracksMix]);

Save_Project('MonFichier.aze',[TracksMix]);



Ceci dit je rencontre un chtit problème l'utilisation de la fonction Open_Project conduit à une exception que je ne saisis pas :
La classe TTrackMixPn n'est pas trouvée.

Si quelqu'un a une idée du pourquoi je suis preneur

Merci à vous

4 réponses


Arff je viens de trouver la solution : elle était devant mes yeux

Dans le OnCreate de TTrackMix mettre :
RegisterClass(TTrackMixPn)


Merci à toi et désolé du dérangement : j'ai été nul sur ce coup là
Messages postés
302
Date d'inscription
jeudi 29 septembre 2005
Statut
Membre
Dernière intervention
17 septembre 2013
1
Salut,

ça me saute aux yeux mais je ne suis pas spécialiste en TCollection :

Open_Project('MonFichier.aze', [TTracksMix]);  // et non pas TracksMix !


Luc.

Salut Beckerich : Merci pour ta réponse mais non il s'agit bien de TracksMix . TracksMix est un TTracksMix qui est déclaré dans mon projet. A moins que j'ai rien compris aux procédures WriteComponent et ReadComponent
Messages postés
302
Date d'inscription
jeudi 29 septembre 2005
Statut
Membre
Dernière intervention
17 septembre 2013
1
de rien, on est là pour ça (quand c'est constructif...)