Как установить текст в текстовом поле Carbon textfield в OSX?
-
03-07-2019 - |
Вопрос
Я пытаюсь установить текст текстового поля с помощью Carbon API следующим образом:
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);
Я использую шаблон кода C ++ XCode, поэтому GetWindowRef() - это вызов предопределенного класса TWindow.Возвращаемое значение OSErr дает мне noErr, но мое текстовое поле содержит только мусор.Не имеет значения, установил ли я атрибут моего текстового поля в Unicode или нет.
Есть какие-нибудь идеи, что здесь не так?
Решение
Что делает GetControlID
(...) вернуться?Так ли это noErr
?
В качестве ControlRef
также является HIViewRef
, вы также можете использовать функцию:
HIViewSetText
чтобы задать текст.Это задокументировано для работы с функциями, которые принимают kControlEditTextCFStringTag
.
Кстати, строчка, которую вы написали:
CFRelease(title);
Это вызовет проблемы.Следует выпускать только те объекты, которые были созданы с использованием функций, в имени API которых есть Create или Copy.Вам захочется почитать:"Введение в руководство по программированию управления памятью для Core Foundation" - ищите в документации Xcode.
Другие советы
Наконец это сделало свое дело:
SetControlData(ctrl, kControlEditTextPart, kControlStaticTextCFStringTag, sizeof(title), &title);
Поскольку это, кажется, очень старый API, лучшим способом, по-видимому, является:
HIViewSetText(ctrl, title);
Спасибо Линдси за подсказки.