PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 23 → [.Net] Comment utiliser une interface ?
[.Net] Comment utiliser une interface ?
Débuté par Michel GARCIA, 10 juil. 2018 21:29 - 5 réponses
Membre enregistré
337 messages
Popularité : +8 (8 votes)
Posté le 10 juillet 2018 - 21:29
Salut à tous. Je n'arrive pas à utiliser un assemblage .Net qui demande un format IFontDisp pour passer les informations. Je retrouve IFontDisp dans la liste des mots que WD me propose (couleur mauve), et lorsque je fais par exemple :

PADTextFont est un objet "IFontDisp" dynamique
PADTextFont = allouer un "IFontDisp"("Verdana",12,FontStyle.Regular)


j'obtiens une erreur "Le Framework .NET a renvoyé l'erreur suivante : Cannot create an instance of an interface."

Sinon, j'essaye d'utiliser l'assemblage System.Drawing (System.Drawing.Size) de cette manière :

pclBtnSize est un objet dynamique "System.Drawing.Size"
pclBtnSize = allouer un "System.Drawing.Size"(150,60)


Rien à faire. le code originel en VB.net est le suivant :

'btnSign
        '
        Me.btnSign.Location = New System.Drawing.Point(354, 74)
        Me.btnSign.Margin = New System.Windows.Forms.Padding(4, 5, 4, 5)
        Me.btnSign.Name = "btnSign"
        Me.btnSign.Size = New System.Drawing.Size(118, 52)
        Me.btnSign.TabIndex = 1
        Me.btnSign.Text = "Sign"
        Me.btnSign.UseVisualStyleBackColor = True


Merci pour toute aide me permettant d'avancer sur ce problème. Michel

--
If it works, don't touch it, don't look at it, AND don't fix it ! No patches, no SP ! JUST DONT FIX IT.
Posté le 11 juillet 2018 - 09:54
Bonjour,
Une interface n'est pas une classe, elle ne peut pas être instanciée.
Une interface ne fait que définir un "contrat" qu'une classe doit respecter.
Ici tu dois déclarer une classe qui hérite de l'interface, et implémenter
les propriétés/méthodes déclarées par l'interface.

Frédéric.

"Michel GARCIA" a écrit dans le message de groupe de discussion :
201818f885c1a825d035cec4778920bdfe6e@news.pcsoft.fr...

Salut à tous. Je n'arrive pas à utiliser un assemblage .Net qui demande un
format IFontDisp pour passer les informations. Je retrouve IFontDisp dans la
liste des mots que WD me propose (couleur mauve), et lorsque je fais par
exemple :

PADTextFont est un objet "IFontDisp" dynamique
PADTextFont = allouer un "IFontDisp"("Verdana",12,FontStyle.Regular)


j'obtiens une erreur "Le Framework .NET a renvoyé l'erreur suivante : Cannot
create an instance of an interface."

Sinon, j'essaye d'utiliser l'assemblage System.Drawing (System.Drawing.Size)
de cette manière :

pclBtnSize est un objet dynamique "System.Drawing.Size"
pclBtnSize = allouer un "System.Drawing.Size"(150,60)


Rien à faire. le code originel en VB.net est le suivant :

'btnSign
'
Me.btnSign.Location = New System.Drawing.Point(354, 74)
Me.btnSign.Margin = New System.Windows.Forms.Padding(4, 5, 4, 5)
Me.btnSign.Name = "btnSign"
Me.btnSign.Size = New System.Drawing.Size(118, 52)
Me.btnSign.TabIndex = 1
Me.btnSign.Text = "Sign"
Me.btnSign.UseVisualStyleBackColor = True


Merci pour toute aide me permettant d'avancer sur ce problème. Michel

--
If it works, don't touch it, don't look at it, AND don't fix it ! No
patches, no SP ! JUST DONT FIX IT.
Membre enregistré
685 messages
Popularité : +3 (3 votes)
Posté le 11 juillet 2018 - 11:18
Bonjour,

Si IFontDisp est une interface effectivement, il n'est pas possible d'instancier une interface.
Dans ce cas, il faut instancier un objet d'une classe qui implémente cette interface.

IL faudrait se tourner vers la doc.
Membre enregistré
337 messages
Popularité : +8 (8 votes)
Posté le 11 juillet 2018 - 16:54
Bonjour Frédéric et François ! Merci pour les clarifications, mais quelque chose ne joue pas, j'obtiens tjrs des erreurs.

L'objet en question vient de System.Drawing.Font

en VB (textFontSize est un entier = 12):
myPad.TextFont = New Font("Verdana", textFontSize, FontStyle.Regular)

WizCtl.Font = myPad.TextFont


En WD :
pclTruc est un System.Drawing.Font dynamique
pclTruc = allouer un "System.Drawing.Font"("Verdana",12,FontStyle.Regular)

WizCtl:Font = pclTruc


Et donc j'obtiens une erreur :
Echec lors de la lecture du champ <Font> du type <WizCtlClass>
Le Framework .Net a renvoyé l'erreur suivante :
Object of type "System.Drawing.Font" cannot be converted to type stdole.IFontDisp

J'ai essayé de plusieurs manière possibles :
MaPolice est un objet automation "stdFont"

MaPolice>>Name = "Arial"
MaPolice>>Size = 14
MaPolice>>Bold = Vrai


ça ne fonctionne pas non plus, ni avec PoliceCrée de WD... Bref, je ne m'en sors pas. J'ai trouvé des informations chez MSDN :
https://msdn.microsoft.com/en-us/library/windows/desktop/ms692695(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/system.drawing.font(v=vs.110).aspx

Et à prioris, Font(String, Single, FontStyle) devrait fonctionner...

Voilà.. Cerveau en mode BSOD, merci à ceux qui pourront éclairer ma lanterne, soyez bénis jusqu'à la 7ème génération !

--
If it works, don't touch it, don't look at it, AND don't fix it ! No patches, no SP ! JUST DONT FIX IT.
Posté le 12 juillet 2018 - 08:17
La méthode attend une classe qui implémente l'interface IFontDisp, donc la
classe utilisée ici doit implémenter cette interface.
Il faut donc une classe qui hérite de l'interface IFontDisp et implémente
ses propriétés.

Visiblement le framework .NET propose une méthode pour gérer tout ça
(OleCreateFontIndirect), peut-être que tu peux l'utiliser.

Frédéric.

"Michel GARCIA" a écrit dans le message de groupe de discussion :
2018d8e667cfbc93129a7b1e7723597f2066@news.pcsoft.fr...

Bonjour Frédéric et François ! Merci pour les clarifications, mais quelque
chose ne joue pas, j'obtiens tjrs des erreurs.

L'objet en question vient de System.Drawing.Font

en VB (textFontSize est un entier = 12):
myPad.TextFont = New Font("Verdana", textFontSize, FontStyle.Regular)

WizCtl.Font = myPad.TextFont


En WD :
pclTruc est un System.Drawing.Font dynamique
pclTruc = allouer un "System.Drawing.Font"("Verdana",12,FontStyle.Regular)

WizCtl:Font = pclTruc


Et donc j'obtiens une erreur :
Echec lors de la lecture du champ <Font> du type <WizCtlClass>
Le Framework .Net a renvoyé l'erreur suivante :
Object of type "System.Drawing.Font" cannot be converted to type
stdole.IFontDisp

J'ai essayé de plusieurs manière possibles :
MaPolice est un objet automation "stdFont"

MaPolice>>Name = "Arial"
MaPolice>>Size = 14
MaPolice>>Bold = Vrai


ça ne fonctionne pas non plus, ni avec PoliceCrée de WD... Bref, je ne m'en
sors pas. J'ai trouvé des informations chez MSDN :
https://msdn.microsoft.com/en-us/library/windows/desktop/ms692695(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/system.drawing.font(v=vs.110).aspx

Et à prioris, Font(String, Single, FontStyle) devrait fonctionner...

Voilà.. Cerveau en mode BSOD, merci à ceux qui pourront éclairer ma
lanterne, soyez bénis jusqu'à la 7ème génération !

--
If it works, don't touch it, don't look at it, AND don't fix it ! No
patches, no SP ! JUST DONT FIX IT.
Membre enregistré
337 messages
Popularité : +8 (8 votes)
Posté le 12 juillet 2018 - 13:06
Bonjour Frédérice, merci pour l'information. Je suis dessus. Par contre, j'ai un souci avec ceci, je ne comprend pas comment réaliser une "union" en WD :

Initial point size of the font. Use the int64 member of the CY structure and scale your font size (in points) by 10000.

typedef union tagCY {
  struct {
    unsigned long Lo;
    long          Hi;
  };
  LONGLONG int64;
} CY, CURRENCY;


En code WL :
tagCY est une structure
nLo est un entier sans signe sur 4 octets
nHi est un entier sur 4 octets
FIN
nInt64 est un entier sur 8 octets


Voilà. Merci pour vos commentaires.
A+, Michel

--
If it works, don't touch it, don't look at it, AND don't fix it ! No patches, no SP ! JUST DONT FIX IT.