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

  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 ...

  7. #7
    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
    Citation Envoyé par steph1969 Voir le message
    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 :
    je ne pourrais pas t'aider, je n'ai pas bien non plus compris cela !
    Je crois que

    Citation Envoyé par steph1969 Voir le message
    ...
    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 !
    la variante NewRectangle retournant un OleVariant semble à mon avis la solution à ton problème, ton OleVariant contiendra le type géré par PropertyValue probablement un VrmRectI dont la description ne doit exister que du côté sur serveur COM !

    J'espère que tu as accès à la variante OleVariant de NewRectangle depuis CoVRmUsbCam
    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

  8. #8
    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
    J'ai trouvé ! ...

    En fait pour les propriétés de type float, integer, boolean, je peux directement passer des variables "locales" définies dans les types correspondants. Par contre pour ce type "Rectangle", il faut faire appel à la fonction "NewRectangle" pour créer la variable à assigner (passer).

    Sauf que, l'objet VrmUSBCam instancié possède bien une fonction NewRectangle mais qui renvoie un type Rectangle (défini comme record dans le _TLB). Donc impossible de faire MonOleVariant := NewRectangle( ); (erreur compilation) et impossible de passer un Rectangle comme OleVariant (exception à l'exécution).

    Dans VrmUSBCamDisp (type dispinterface) la même fonction NewRectangle elle renvoie un OleVariant ... voici ce que j'ai écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Var VRmUsbCam       : IVRmUsbCam      ;
          DispVRmUsbCam : IVRmUsbCamDisp ;
          R                     : OleVariant         ;
    begin
     VRmUsbCam       := CoVRmUsbCam.Create              ;
     DispVRmUsbCam := IVRmUsbCamDisp( VrmUsbCam ) ;
     
     ....
     R := DispVrmUsbCam.Newrectangle( 100, 100, 320, 200 ) ;
     
     Device.PropertyValue[PROPID_GRAB_USER_ROI_RECT_I] := R ;
     ....
     
    end;
    et cela fonctionne !! Merci pour m'avoir guidé !

    apparemment les dispinterface sont exactement la même chose que les interface(IDispatch) mais avec une prénumérotation (index) des fonctions et
    propriétés de telle sorte à accélérer le traitement. En effect un objet IDispatch fait appel à des fonctions (en passant des chaine de caractères) pour connaitre la position des appel de fonction dans la DLL ce qui doit effectivement prendre un certain temps de traitement ..(se sont les dispid 15)

    Maintenant j'ai pas compris pourquoi il y avait une différence de définition entre Rectangle et OLEVariant dans le dispinterface correspondant au IDispatch ! ..

    Encore merci .

+ 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