IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

OLEVariant et Record


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Delphi 10.4
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Delphi 10.4

    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Par défaut OLEVariant et Record
    Bonjour,
    je suis confronté à un problème depuis quelques jours concernant l'utilisation d'une "bibliothèque de type" importée via 'Importer un composant' (Delphi Xe).

    Dans l'unité (_TLB) importée se trouve une "property" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        property PropertyValue[PropId: PropId]: OleVariant read Get_PropertyValue write Set_PropertyValue;
    c'est via cette propriété que l'on peut configurer tout une liste de paramètres. Certains sont des Boolean, d'autre des Integer ou single et cela fonctionne sans aucun probleme ; la convertion des types delphi (integer, single, ...) via OleVariant se fait "automatiquement"

    Par contre un paramètre de la librairie requiert une valeur de type "Record" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Rectangle = record
        Left: Smallint;
        Top: Smallint;
        Width: Smallint;
        Height: Smallint;
      end;
    (le type rectangle se trouvant bien définit dans le fichier _TLB importé).

    et dans ce cas je n'arrive pas à "passer" ce type de paramètre, le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     var R : Rectangle  ;
     
     begin
      R.Left     := 100 ;
      R.Top     := 100 ;
      R.Width  := 320 ;
      R.Height := 200 ;
     
      Device.PropertyValue[ PROPID_GRAB_USER_ROI_RECT_I ] := R ;
     end;
    donne une erreur de compilation:
    E2010 Type incompatibles : "OleVariant" et "rectangle"

    d'un autre côté si je "passe" une variable d'un type accepté (integer) à la compilation, c'est alors à l'exécution qu'u message apparait :

    Le projet ... exe a déclebcé la classe d'exception EOleException avec le message "type mismatch. expected Rectangle for property GRAB_USER_ROI_RECT_I" .

    Merci de votre aide.

  2. #2
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    En transformant le Trect en un array de variant?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var
      MonVariant:Variant;
    begin
      MonVariant := VarArrayCreate([0,3],varInteger);
      MonVariant[0] := 100;
      MonVariant[1] := 100;
      MonVariant[2] := 320;
      MonVariant[3] := 200;
      Device.PropertyValue[ PROPID_GRAB_USER_ROI_RECT_I ] := MonVariant;

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    Tu n'aurais pas une interface qui ferait l'intermédiaire entre Rectangle et OleVariant ?

    Sinon, ce Rectangle, contient 4 Smallint, ça fait 64 bits, ça tient dans un int64 !
    Pour le coup du tableau comme le propose Linkin c'est une bonne idée, faudrait que tu vérifie dans la doc de l'ActiveX (si il y en a une), deviner une telle chose semble difficile et pour ma part, je n'y crois pas trop au vu de ton EOleException qui réclame un Rectangle et non un tableau

    Est-ce un ActiveX connu genre MATLAB ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre averti
    Profil pro
    Delphi 10.4
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Delphi 10.4

    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Par défaut
    Merci pour vos réponses,

    j'avais déjà essayé le tableau de variant.

    Je viens d'essayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      R.Left   := 100 ;
      R.Top    := 100 ;
      R.Width  := 320 ;
      R.Height := 200 ;
     
      move( R, i64, 8 ) ;   // i64 : int64
     
      Device.PropertyValue[ PROPID_GRAB_USER_ROI_RECT_I ] := i64 ;
    et dans les deux cas (Tableau de variant ou i64) cela me donne toujours une exception de type mismatch !

    je vais éplucher le fichier TLB....

    il s'agit d'une DLL pour communiquer avec des cameras video (Vrmagic.com)

    au départ tous est fourni pour travailler en C (.LIB et .h), mais comme il y avait également un object COM de 'enregistré je l'ai importé dans Delphi ce qui m'a évité de traduire le .h. tout fonctionne correctement sauf cette histoire de Rectangle !

    Je vais essayer de contacter leur support mais je sais qu'il ne sont pas du tout "Delphi" ...

    Merci.

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    Ben voilà, en donnant le nom, on trouve la doc :

    Parameter types are indicated in the identifier of the Property.
    There are integral types of parameters like float (thus, the identifier for the Exposure Time Property is “VRM_PROPID_CAM_EXPOSURE_TIME_F”; note the “_F”), boolean (“_B”), or integer (“_I”) values as well as more complex types like VRmPointI (“_POINT_I”), VRmRectI (“_RECT_I”), or VRmSizeI (“_SIZE_I”)...
    Size, Point, Rectangle (.COM only4)
    corresponds to VRmSizeI, VRmPointI and VRmRectI
    VRmRectI est l'interface compatible à la fois OleVariant et Rectangle, c'est l'intermédiaire que j'évoquais, j'espère que ce type existe dans le fichier généré TLB
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre averti
    Profil pro
    Delphi 10.4
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Delphi 10.4

    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Par défaut
    il n'y a pas vraiment de définition de VrmRectI dans le _TLB.pas, seul les déclarations suivantes semble concernées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    type
      PropType = TOleEnum;
    const
      PROP_TYPE_BOOL = $00000001;
      PROP_TYPE_INT = $00000002;
      PROP_TYPE_FLOAT = $00000003;
      PROP_TYPE_STRING = $00000004;
      PROP_TYPE_ENUM = $00000005;
      PROP_TYPE_SIZE_I = $00000006;
      PROP_TYPE_POINT_I = $00000007;
      PROP_TYPE_RECT_I = $00000008;
    mais aussi deux fonctions faisant partie de deux "objets" semble pouvoir créer un "Rectangle" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     IVRmUsbCam = interface(IDispatch)
        ['{F41095B4-E3D5-4445-8EAA-F61AA2DC5C5B}']
    ...
        function NewRectangle(Left: Smallint; Top: Smallint; Width: Smallint; Height: Smallint): Rectangle; safecall;
    perty BayerHQ: WordBool read Get_BayerHQ write Set_BayerHQ;
    ....
      end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    IVRmUsbCamDisp = dispinterface
        ['{F41095B4-E3D5-4445-8EAA-F61AA2DC5C5B}']
    ...
        function NewRectangle(Left: Smallint; Top: Smallint; Width: Smallint; Height: Smallint): {??Rectangle}OleVariant; dispid 15;
    ...
      end;
    la mise en commentaire dans le deuxième cas {??Rectangle} est d'origine, je n'ai pas modifié ... d'ailleur je n'utilise pas ces fonction NewRectangle peut-être devrais-je !

    maintenant je dois avouer ne pas tout comprendre ... notamment la différence entre interface et dispinterface. je me contente de créer un object dans mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VRmUsbCam := CoVRmUsbCam.Create ;
    et d'ensuite utiliser les fonctions, procédures et property qu'il contient ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 26/01/2003, 13h45
  2. Stocker un record dans un fichier
    Par ushu dans le forum Langage
    Réponses: 7
    Dernier message: 13/12/2002, 15h51
  3. Structure de données de type "RECORD"
    Par chaours dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/09/2002, 17h10
  4. Record et TObject
    Par spirale dans le forum Langage
    Réponses: 2
    Dernier message: 13/09/2002, 12h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo