取るに足らない雑多な話


◆Gestalt Manager

 メニューの回で「Aquaかどうか」を調べたGestalt関数の他の使用例。

コードを表示

/*  システムバージョン(例:9.1→0x0910)  */
long SystemVersion(void) {
    long systemVersion;
    
    if (Gestalt(gestaltSystemVersion, &systemVersion) != noErr)
        return 0;
    
    return systemVersion;
}

/*  CarbonLibバージョン(例:1.6→0x0160)  */
long CarbonVersion(void) {
    long carbonVersion;
    
    if (Gestalt(gestaltCarbonVersion, &carbonVersion) != noErr)
        return 0;
    
    return carbonVersion;
}

/*  QuickTimeバージョン(例:6.0.3→0x0603)  */
long QuickTimeVersion(void) {
    long qtVersion;
    
    if (Gestalt(gestaltQuickTimeVersion, &qtVersion) != noErr)
        return 0;
    
    /*  怪しげなシフト  */
    return qtVersion >> 16;
}

◆Internet Config

 ブラウザを使ってURLにジャンプします。説明は省略ー。否、分からん……。(←

コードを表示

/*  アプリケーションのクリエータコード  */
#define APP_CREATOR FOUR_CHAR_CODE('XXXX')
...
/*  URLにジャンプ!(URLはPascal文字列)  */
void LaunchURL(ConstStr255Param url) {
    ICInstance ic;
    
    if (ICStart(&ic, APP_CREATOR) == noErr) {
        long start, end;
        
        start = 0;
        end = url[0];
        ICLaunchURL(ic, "\p", &url[1], url[0], &start, &end);
        ICStop(ic);
    }
}

◆Carbon Help Manager

 ヘルプメニューをもらうサンプルです。

コードを表示

/*  (後ろの引き数はいらなかったらNULL)  */
if (HMGetHelpMenu(&helpMenu, &firstCustomItemIndex) == noErr) {
    /*  ここで項目の追加とか……  */
    /*  firstCustomItemIndexが追加項目の先頭  */
    ...

 次に、ヘルプタグ(マウスを乗せると出てくる四角いあれ)のサンプルです。

コードを表示

HMHelpContentRec helpTag;
...
/*  下2行はこのままで……  */
helpTag.version = kMacHelpVersion;
SetRect(&helpTag.absHotRect, 0, 0, 0, 0);
/*  位置の指定  */
helpTag.tagSide = kHMDefaultSide;
/*  普段のヘルプタグ(contentTypeに種類、共用体に内容)  */
helpTag.content[kHMMinimumContentIndex].contentType = kHMStringResContent;
helpTag.content[kHMMinimumContentIndex].u.tagStringRes.hmmResID = 128;
helpTag.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 1;
/*  コマンドキーを押している時のヘルプタグ(同上)  */
helpTag.content[kHMMaximumContentIndex].contentType = kHMNoContent;
/*  ヘルプタグをセット!  */
HMSetControlHelpContent(control, &helpTag);
/*  ウインドウ用はHMSetWindowHelpContent  */

◆CFString/CFMutableString

 CFStringが不変文字列で、CFMutableStringが可変文字列。それぞれの参照の型はCFStringRefとCFMutableStringRefで、CFMutableStringRefの方は「CFStringRefのふり」をさせられます。(逆向きはエラー!)

 メモリ管理はカウンタ式になっていて、最初にCFStringCreate〜した時点でカウンタは1。ここでCFRelease(カウンタを-1)すると0になって、解放されます。解放されると困るところでCFRetain(カウンタを+1)し、いらなくなったらCFRelease……が基本です。(CFStringRefはCFMutableStringRefかもしれないので、CFRetainではなくコピーした方がいいケースも多いのですが。)

 ちなみに、CFSTRで作ったCFStringは終了まで解放されない(CFRelease/CFRetainは無意味)とのこと。

コードを表示

/*  CFString定数  */
cfStr = CFSTR("ASCII String");
/*  CFStringを生成  */
cfStr = CFStringCreateWithCharacters(NULL, chars, numChars);
cfStr = CFStringCreateWithPascalString(NULL, pStr, encoding);
cfStr = CFStringCreateWithFormat(NULL, NULL, format, ...);
cfStr = CFStringCreateWithSubstring(NULL, str, range);
/*  CFStringをコピー  */
cfStr = CFStringCreateCopy(NULL, str);
/*  CFMutableStringを生成  */
cfMutStr = CFStringCreateMutable(NULL, maxLen);
cfMutStr = CFStringCreateMutableCopy(NULL, maxLen, str);
/*  maxLenを0にすると長さ制限無し!  */

/*------------------------------------------------------------------------------
    encodingは定数(kCFStringEncoding〜)かGetApplicationTextEncoding()
------------------------------------------------------------------------------*/

 CFString/CFMutableString共通の関数。この他に比較や検索をする機能も!

コードを表示

/*  長さ  */
len = CFStringGetLength(str);
/*  文字(UniChar)  */
c = CFStringGetCharacterAtIndex(str, idx);
chars = CFStringGetCharactersPtr(str);
CFStringGetCharacters(str, range, buf);
/*  Pascal文字列に変換  */
pStr = CFStringGetPascalStringPtr(str, encoding);
ret = CFStringGetPascalString(str, buf, bufSize, encoding);
/*  数値に変換  */
n = CFStringGetIntValue(str);
x = CFStringGetDoubleValue(str);

/*------------------------------------------------------------------------------
    名前がCFStringGet〜PtrのものはNULLに注意!
    (バッファを使う関数との二段構えに……下みたいな感じで)
    pStr = CFStringGetPascalStringPtr(str, encoding);
    if (pStr == NULL) {
        CFStringGetPascalString(str, buf, bufSize, encoding);
        pStr = buf;
    }
    ...
------------------------------------------------------------------------------*/

 CFMutableString専用の関数。文字列を繋いでいくのに便利かな……。

コードを表示

/*  追加系  */
CFStringAppend(mutStr, appendedStr);
CFStringAppendCharacters(mutStr, chars, numChars);
CFStringAppendPascalString(mutStr, pStr, encoding);
CFStringAppendFormat(mutStr, NULL, format, ...);
/*  挿入ー  */
CFStringInsert(mutStr, idx, insertedStr);
/*  削除ー  */
CFStringDelete(mutStr, range);
/*  差し換え系  */
CFStringReplace(mutStr, range, replacement);
CFStringReplaceAll(mutStr, replacement);

目次