Как установить текст в текстовом поле Carbon на OSX? - PullRequest
0 голосов
/ 04 марта 2009

Я пытаюсь установить текст текстового поля с помощью 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, но мое текстовое поле содержит только мусор. Не имеет значения, установил ли я атрибут моего текстового поля в Юникод или нет.

Есть идеи, что здесь не так?

Ответы [ 2 ]

2 голосов
/ 04 марта 2009

Что возвращает GetControlID (...)? Это noErr?

Поскольку ControlRef также является HIViewRef, вы также можете использовать функцию:

HIViewSetText, чтобы установить текст. Это задокументировано для работы с функциями, которые принимают kControlEditTextCFStringTag.

Кстати, строка, которую вы написали:

CFRelease(title);

Будет причиной проблем. Следует освобождать только те объекты, которые были созданы с использованием функций, в имени API которых есть Create или Copy. Вы можете прочитать: «Введение в руководство по программированию управления памятью для Core Foundation» - поиск в документации по Xcode.

0 голосов
/ 04 марта 2009

Наконец-то это сработало:

SetControlData(ctrl, kControlEditTextPart, kControlStaticTextCFStringTag, sizeof(title), &title);

Так как это, кажется, очень старый API, лучший способ выглядит так:

HIViewSetText(ctrl, title);

Спасибо Линдси за подсказки.

...