Cast de classes

furax13 Messages postés 90 Date d'inscription mardi 28 octobre 2003 Statut Membre Dernière intervention 24 avril 2008 - 2 août 2006 à 12:07
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006 - 3 août 2006 à 17:23
dans mon application , j'ai une classe COoptimisation qui contient une liste de contraintes (classe COContrainte).

Chaque contrainte peut être d'un type différent:

TYPE
  typeContraintesOptimisation = (Contrainte_Heating_Speed_1,
    Contrainte_Natural_Gaz_Flow_1,   Contrainte_Natural_Gaz_Flow_2,
    Contrainte_Carbon_Deposition_1,   Contrainte_Carbon_Deposition_2,
    COContrainte_Carbon_Deposition_3,);

j'ai donc créé autant de classes que de types différents, classes qui héritent de ma classe COcontrainte :
exemple :
TYPE
  COContrainte_Heating_Speed_1 = CLASS(COContrainte)
  PRIVATE
    Fpriorite                             : integer;
    FTypeDeContrainte                     : integer;
    FTemperature                          : double;
    FVitesseChauffe                       : double;
    FtoleranceTemperaturePlus             : double;
    FtoleranceTemperatureMoins            : double;
    FtolerancevitesseChauffePlus          : double;
    FtolerancevitesseChauffeMoins         : double;



    PROCEDURE SetInteger(index: integer; val: integer);
    PROCEDURE setDouble(index: integer; val: Double);



  PUBLIC
    CONSTRUCTOR creation(priorite, typeConstraint: integer; temp, vitesse, tolerTempPos, tolerTempNeg, tolerVitPos, tolerVitNeg: double);



    DESTRUCTOR Destroy; OVERRIDE;



    PROPERTY priorite: integer INDEX 0 READ Fpriorite WRITE setInteger;
    PROPERTY typeDeContrainte: integer INDEX 1 READ FTypeDeContrainte WRITE setInteger;



    PROPERTY temperature: double INDEX 0 READ FTemperature WRITE setDouble;
    PROPERTY vitessechauffe: double INDEX 1 READ FVitesseChauffe WRITE setDouble;
    PROPERTY ToleranceTempPos: double INDEX 2 READ FtoleranceTemperaturePlus WRITE setDouble;
    PROPERTY ToleranceTempNeg: double INDEX 3 READ FtoleranceTemperatureMoins WRITE setDouble;
    PROPERTY ToleranceVitessePos: double INDEX 4 READ FtolerancevitesseChauffePlus WRITE setDouble;
    PROPERTY ToleranceVitesseNeg: double INDEX 5 READ FtolerancevitesseChauffeMoins WRITE setDouble;
{  méthode à créer
determineValidite
 ActionSurCycle
 trace



}
  END;


quand je crée ma contrainte COContrainte), je regarde son type et je crée une contrainte du type associé

CONSTRUCTOR COContrainte.creation(noContrainte, typeConstraint: integer; name: STRING; time: double;
  validity, nbIter, nbMaxIter, noCoil: integer);
VAR
  labeltype                             : STRING;



BEGIN
   //construction de l'objet fOptimisation
  INHERITED create;



  FNumeroContrainte         := noContrainte;
  FTypeContrainte           := typeConstraint;
  FNomContrainte            := name;
  FTemps                    := time;
  FValidite                 := validity;
  FNbIteration              := nbIter;
  FNbIterationMaxTolere     := nbMaxIter;
  FNumeroCoil               := noCoil;



  labeltype := GetEnumName(TypeInfo(typeContraintesOptimisation), typeConstraint);



  CASE AnsiIndexStr(labeltype, ['Contrainte_Heating_Speed_1', 'Contrainte_Natural_Gaz_Flow_1']) OF
    0: COContrainte_Heating_Speed_1.creation(0, typeConstraint, 700, 40, 0, 0, 0, 0);
    1: COContrainte_Natural_Gaz_Flow_1.creation(0, typeConstraint, 700, 10.5, 0, 0, 0, 0);
 END;
//     setOptimisation(classeOptimisation);

END;


dans mon programme principal, je récupère la contrainte (COCOntrainte) la plus récente et en fonction du type de la contrainte, j'aimerai récupérer la contrainte du type associée pour effectuer un traitement particulier (code non fourni pour le traitement)

Malheureusement, je n'arrive pas récupérer la contrainte du type associé.
comment faire?

merci pour votre aide.

PROCEDURE TForm1.FormCreate(Sender: TObject);
VAR
  i                                     : integer;
  contrainteCourante                    : COContrainte;
  nbTrouveContraintes                   : integer;
  fOptimisation                         : COOptimisation;
//  fNewOptim : COOptimisation;
  fContrainteHeatingSpeed               : COCOntrainte_Heating_speed_1;
  FContrainteNaturalGazFlow             : COContrainte_Natural_gaz_flow_1;
  labelTYpe                             : STRING;



BEGIN
  fOptimisation := NIL;
  TRY
  //construction de l'objet fOptimisation
    fOptimisation := COOptimisation.creation(1, 4, 10, '415', 4, 'DoublePenteBreme');



   //destruction de l'objet fOptimisation
    nbTrouveContraintes := fOptimisation.NbContraintes;



    contrainteCourante := fOptimisation.getContrainteLaPlusRecente(0);
    ShowMessage('Le nom est : ' + contrainteCourante.NomContrainte);
    ShowMessage('La date est : ' + FloatToStr(contrainteCourante.temps));



     //on essaye de récupèrer la contrainte de type
    labeltype := GetEnumName(TypeInfo(typeContraintesOptimisation), contraintecourante.TypeContrainte);



    CASE AnsiIndexStr(labeltype, ['Contrainte_Heating_Speed_1', 'Contrainte_Natural_Gaz_Flow_1']) OF
      0: BEGIN
          fContrainteHeatingSpeed := COCOntrainte_Heating_speed_1(contrainteCourante);
          ShowMessage('La  température est : ' + FloattoStr(fContrainteHeatingSpeed.temperature) + ' °C');
        END;
      1: BEGIN
          FContrainteNaturalGazFlow := COContrainte_Natural_gaz_flow_1(contrainteCourante);
          ShowMessage('La  température est : ' + FloattoStr(FContrainteNaturalGazFlow.temperature) + ' °C');
        END;
    END;



//fNewOptim := contrainteCourante.Optimisation;



    FOR i := 0 TO fOptimisation.NbContraintes - 1 DO
      BEGIN
       //On récupère la ième contrainte
        contrainteCourante := fOptimisation.getContrainteDepuisListe(0);
        ShowMessage('Le nom est :' + contrainteCourante.NomContrainte);



        contrainteCourante.destroy;
        fOptimisation.NbContraintes := nbTrouveContraintes - 1;
      END;
    fOptimisation.NbContraintes := 0;



  FINALLY
    fOptimisation.free;
  END;
END;





Ci joint déclaration des différentes classes :

TYPE
  TListeContrainte = TList;



TYPE
  COOptimisation = CLASS(TObject)
  PRIVATE
    FMode                   : Integer;
    FNbcoils                : Integer;
    FNbContraintes          : Integer;
    FTypeOptimisation       : Integer;
    FTexture                : STRING;
    FNomTypeOptimisation    : STRING;
    FListeContrainte        : TListeContrainte;



    PROCEDURE SetInteger(index: integer; val: integer);
    PROCEDURE setstring(index: integer; val: STRING);



  PUBLIC
    //Liste des assesseurs
    PROPERTY Mode: integer INDEX 0 READ FMode WRITE setInteger;
    PROPERTY Nbcoils: integer INDEX 1 READ FNbcoils WRITE setInteger;
    PROPERTY NbContraintes: integer INDEX 2 READ FNbContraintes WRITE setInteger;
    PROPERTY TypeOptimisation: integer INDEX 3 READ FTypeOptimisation WRITE setInteger;
    PROPERTY Texture: STRING INDEX 0 READ FTexture WRITE setString;
    PROPERTY NomTypeOptimisation: STRING INDEX 1 READ FNomTypeOptimisation WRITE setString;



    CONSTRUCTOR creation(modeOptim, nbBobines, nbConstraints: integer; textur: STRING; typeOptim: integer; nomOptim: STRING);
    DESTRUCTOR Destroy; OVERRIDE;



    FUNCTION getContrainteDepuisListe(CONST position: integer): COContrainte;
    FUNCTION getContrainteLaPlusRecente(CONST position: integer): COContrainte;



  END;

TYPE
  COContrainte = CLASS(TObject)
  PRIVATE
    FNumeroContrainte         : integer;
    FTypeContrainte           : integer;
    FValidite                 : integer;
    FNbIteration              : integer;
    FNbIterationMaxTolere     : integer;
    FNumeroCoil               : integer;
    FNomContrainte            : STRING;
    FTemps                    : double;
  //  TOptimisation : COOptimisation;



 //   FUNCTION getOptimisation: COOptimisation;
 //   PROCEDURE setOptimisation(valeur: COOptimisation);



    PROCEDURE SetInteger(index: integer; val: integer);
    PROCEDURE setstring(index: integer; val: STRING);
    PROCEDURE setDouble(index: integer; val: Double);



  PUBLIC
 //   CONSTRUCTOR creation(classeOptimisation : COOptimisation; noContrainte,typeConstraint: integer; name: STRING; time: double;
    CONSTRUCTOR creation(noContrainte, typeConstraint: integer; name: STRING; time: double;
      validity, nbIter, nbMaxIter, noCoil: integer);
    DESTRUCTOR Destroy; OVERRIDE;



//    PROPERTY Optimisation: COOptimisation READ getOptimisation WRITE setOptimisation;



    PROPERTY NumeroContrainte: integer INDEX 0 READ FNumeroContrainte WRITE setInteger;
    PROPERTY TypeContrainte: integer INDEX 1 READ FTypeContrainte WRITE setInteger;
    PROPERTY Validite: integer INDEX 2 READ FValidite WRITE setInteger;
    PROPERTY NbIteration: integer INDEX 3 READ FNbIteration WRITE setInteger;
    PROPERTY NbIterationMaxTolere: integer INDEX 4 READ FNbIterationMaxTolere WRITE setInteger;
    PROPERTY NumeroCoil: integer INDEX 5 READ FNumeroCoil WRITE setInteger;



    PROPERTY NomContrainte: STRING INDEX 0 READ FNomContrainte WRITE setString;
    PROPERTY Temps: double INDEX 0 READ FTemps WRITE setDouble;



  END;

1 réponse

jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006
3 août 2006 à 17:23
Ce n'est pas une superbe idée de poster tout un source, cela ne donne pas forcément envie de le lire. Analyse un peu ton problème, et sois plus concis, ça sera d'autant plus facile pour nous de t'aider efficacement ;).

j!nH
0
Rejoignez-nous