Comment définir du texte dans Carbon textfield sur OSX?
-
03-07-2019 - |
Question
J'essaie de définir le texte d'un champ de texte à l'aide de l'API Carbon comme suit:
ControlID editId = {'EDIT', 3};
ControlRef ctrl;
GetControlByID(GetWindowRef(), &editId, &ctrl);
CFStringRef title = CFSTR("Test");
OSErr er = SetControlData(ctrl, kControlEntireControl, kControlEditTextTextTag, CFStringGetLength(title), title);
CFRelease(title);
J'utilise le modèle de code C ++ de XCode. GetWindowRef () est donc un appel de la classe TWindow prédéfinie. La valeur de retour OSErr me donne noErr, mais mon champ de texte ne contient que des déchets. Peu importe que je règle ou non l'attribut de mon champ de texte sur Unicode.
Des idées sur ce qui ne va pas ici?
La solution
Qu'est-ce que GetControlID
(...) renvoie? Est-ce noErr
?
Un ControlRef
est également un HIViewRef
, vous pouvez également utiliser la fonction:
HIViewSetText
pour définir le texte. Ceci est documenté pour fonctionner avec des fonctions acceptant kControlEditTextCFStringTag
.
Au fait, la ligne que vous avez écrite:
CFRelease(title);
Peut causer des problèmes. Vous ne devez libérer que les objets créés à l'aide de fonctions pour lesquelles Create ou Copy ont été créés. Vous devez lire: "Introduction à la gestion de la mémoire - Guide de programmation pour Core Foundation". - recherche dans la documentation Xcode.
Autres conseils
Enfin, cela a fonctionné:
SetControlData(ctrl, kControlEditTextPart, kControlStaticTextCFStringTag, sizeof(title), &title);
Puisque cela semble être une très vieille API, une meilleure solution semble être:
HIViewSetText(ctrl, title);
Merci à Lyndsey pour les astuces.