📄 chinesemate.c
字号:
MemHandleUnlock(fldKeyTextHandle);
FldSetTextHandle(fldKeyPtr, fldKeyTextHandle);
//Init Buf
addrFullName = MemPtrNew(100);
addrFullName[0] = '\0'; addrFullName[99] = '\0';
pyStr = MemPtrNew(100);
pyStr[0] = '\0'; pyStr[99] = '\0';
Buf[0] = 0; Buf[1] = 0; Buf[2] = 0; Buf[3] = 0; Buf[4] = 0;
ExitEventLoop = false;
do
{
EvtGetEvent(&event, evtWaitForever);
keyHandled = false;
if (event.eType == keyDownEvent)
{
if (EvtKeydownIsVirtual(&event) && inSel)
{
if (IsFiveWayNavEvent(&event) && LstGetNumberOfItems(lstP) > 0)
{
if (NavKeyPressed(&event, Up) || event.data.keyDown.chr == 11)
{
keyHandled = true;
if (LstGetSelection(lstP) > 0)
{
LstSetSelection(lstP, LstGetSelection(lstP) - 1);
}
}
else if (NavKeyPressed(&event, Down) || event.data.keyDown.chr == 12)
{
keyHandled = true;
if (LstGetSelection(lstP) < LstGetNumberOfItems(lstP) - 1)
{
LstSetSelection(lstP, LstGetSelection(lstP) + 1);
}
}
else if (NavKeyPressed(&event, Select))
{
keyHandled = true;
bLstBuf = LstGetSelectionText(lstP, LstGetSelection(lstP));
seachOffset = 0;
i = 0;
while (i < keyLength)
{
seachOffset += TxtGetNextChar(bLstBuf, seachOffset, &Buf[i]);
i ++;
}
ExitEventLoop = true;
}
}
}
else if (event.data.keyDown.chr >= 97 && event.data.keyDown.chr <= 122 && ! inSel)
{
keyHandled = true;
fldTextSp = FldGetTextLength(fldKeyPtr);
fldKeyTextHandle = FldGetTextHandle(fldKeyPtr);
FldSetTextHandle(fldKeyPtr, NULL);
fldKeyTextPtr = MemHandleLock(fldKeyTextHandle);
if (fldTextSp < 5)
{
fldKeyTextPtr[fldTextSp] = event.data.keyDown.chr - 32;
}
MemHandleUnlock(fldKeyTextHandle);
FldSetTextHandle(fldKeyPtr, fldKeyTextHandle);
FldDrawField(fldKeyPtr);
}
else if (event.data.keyDown.chr == 0x0008 && ! inSel) //退格键
{
keyHandled = true;
fldTextSp = FldGetTextLength(fldKeyPtr) - 1;
fldKeyTextHandle = FldGetTextHandle(fldKeyPtr);
FldSetTextHandle(fldKeyPtr, NULL);
fldKeyTextPtr = MemHandleLock(fldKeyTextHandle);
if (fldTextSp > 0) //最后一个字符不用删,直接退出
{
fldKeyTextPtr[fldTextSp] = '\0';
MemHandleUnlock(fldKeyTextHandle);
FldSetTextHandle(fldKeyPtr, fldKeyTextHandle);
FldDrawField(fldKeyPtr);
}
else
{
MemHandleUnlock(fldKeyTextHandle);
FldSetTextHandle(fldKeyPtr, fldKeyTextHandle);
ExitEventLoop = true;
}
}
else if (event.data.keyDown.chr == 0x000A) //回车
{
keyHandled = true;
keyLength = FldGetTextLength(fldKeyPtr);
if (keyLength > 0)
{
fldKeyTextHandle = FldGetTextHandle(fldKeyPtr);
FldSetTextHandle(fldKeyPtr, NULL);
fldKeyTextPtr = MemHandleLock(fldKeyTextHandle);
i = 0;
while (i < keyLength)
{
Buf[i] = fldKeyTextPtr[i];
i ++;
}
MemHandleUnlock(fldKeyTextHandle);
FldSetTextHandle(fldKeyPtr, fldKeyTextHandle);
}
ExitEventLoop = true;
}
else if (event.data.keyDown.chr == 0x0020 && ! inSel) //空格
{
keyHandled = true;
keyLength = FldGetTextLength(fldKeyPtr);
if (keyLength > 0)
{
fldKeyTextHandle = FldGetTextHandle(fldKeyPtr);
FldSetTextHandle(fldKeyPtr, NULL);
fldKeyTextPtr = MemHandleLock(fldKeyTextHandle);
dbRef = DmOpenDatabaseByTypeCreator('DATA', 'addr', dmModeReadOnly);
dbR = DmOpenDatabaseByTypeCreator('CMPY', 'REiC', dmModeReadOnly);
dbCount = DmNumRecordsInCategory(dbRef, dmAllCategories);
lstBufLen = 0;
//开始巨耗费时间和内存的操作……
if((lstBuf = MemPtrNew(10752)) == 0) //获取15K内存
{
//不会出错吧……
}
lstBuf[0] = '\0';
lstBuf[10751] = '\0';
seachOffset = 0;
bLstBuf = 0;
for (i = 0; i < dbCount; i ++)
{
addrFullName[0] = '\0';
OLD_GetFirstName(dbRef, i, addrFullName);
if (TxtLen(addrFullName) >= keyLength) //大于或等于
{
pyStr[0] = '\0';
GBK2PY(addrFullName, pyStr, dbR);
if (TxtCompare(fldKeyTextPtr, keyLength, NULL, pyStr, keyLength, NULL) == 0) //匹配
{
inSel = true;
bLstBuf = lstBuf + lstBufLen;
bLstBuf[0] = '\0';
StrCat(bLstBuf, addrFullName);
lstBufLen += StrLen(addrFullName) + 1; //总是指向下一个名字开始
seachOffset ++;
}
}
}
//终于遍历完了
if (seachOffset > 0) //至少找到一个
{
MemPtrResize(lstBuf, lstBufLen); //赶快缩水
//开始很恶心的列表构筑过程……
lstArrayHandle = SysFormPointerArrayToStrings (lstBuf, seachOffset);
lstItemStr = MemHandleLock(lstArrayHandle);
LstSetListChoices (lstP , lstItemStr, seachOffset);
LstSetSelection(lstP, 0);
LstDrawList(lstP);
}
else
{
MemPtrFree(lstBuf);
ExitEventLoop = true;
}
MemHandleUnlock(fldKeyTextHandle);
FldSetTextHandle(fldKeyPtr, fldKeyTextHandle);
DmCloseDatabase(dbRef);
DmCloseDatabase(dbR);
}
}
}
if (! keyHandled)
{
SysHandleEvent(&event);
}
}while (event.eType != appStopEvent && ! ExitEventLoop);
fldKeyTextHandle = FldGetTextHandle(fldKeyPtr);
FldSetTextHandle(fldKeyPtr, NULL);
MemHandleFree(fldKeyTextHandle);
MemPtrFree(addrFullName);
MemPtrFree(pyStr);
if (inSel)
{
MemPtrFree(lstBuf);
MemHandleUnlock(lstArrayHandle);
MemHandleFree(lstArrayHandle);
}
}
static void OLD_FastAccessHandler(WChar * Buf, FormType * frmP)
{
EventType event;
FieldType * fldKeyPtr;
ListType * lstP;
MemHandle fldKeyTextHandle;
Char * fldKeyTextPtr;
Boolean ExitEventLoop;
UInt16 i;
UInt16 fldTextSp;
DmOpenRef * dbRef;
DmOpenRef * dbR;
UInt16 dbCount;
Char * addrFullName = 0;
UInt16 seachOffset;
UInt16 keyLength;
Boolean inSel;
Char * lstBuf = 0;
Char * bLstBuf = 0;
UInt16 lstBufLen;
Char * pyStr = 0;
MemHandle lstArrayHandle;
Char ** lstItemStr = 0;
Boolean keyHandled;
//Init List
lstP = (ListType *)FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, lstResult));
LstSetSelection(lstP, noListSelection);
inSel = false;
//Init Field
fldKeyPtr = (FieldType *)FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, fldKeyN));
fldKeyTextHandle = MemHandleNew(6);
fldKeyTextPtr = MemHandleLock(fldKeyTextHandle);
for (i = 0; i < 6; i ++)
{
fldKeyTextPtr[i] = '\0';
}
MemHandleUnlock(fldKeyTextHandle);
FldSetTextHandle(fldKeyPtr, fldKeyTextHandle);
//Init Buf
addrFullName = MemPtrNew(100);
addrFullName[0] = '\0'; addrFullName[99] = '\0';
pyStr = MemPtrNew(100);
pyStr[0] = '\0'; pyStr[99] = '\0';
Buf[0] = 0; Buf[1] = 0; Buf[2] = 0; Buf[3] = 0; Buf[4] = 0;
ExitEventLoop = false;
do
{
EvtGetEvent(&event, evtWaitForever);
keyHandled = false;
if (event.eType == keyDownEvent)
{
if (EvtKeydownIsVirtual(&event) && inSel)
{
if (IsFiveWayNavEvent(&event) && LstGetNumberOfItems(lstP) > 0)
{
if (NavKeyPressed(&event, Up) || event.data.keyDown.chr == 11)
{
keyHandled = true;
if (LstGetSelection(lstP) > 0)
{
LstSetSelection(lstP, LstGetSelection(lstP) - 1);
}
}
else if (NavKeyPressed(&event, Down) || event.data.keyDown.chr == 12)
{
keyHandled = true;
if (LstGetSelection(lstP) < LstGetNumberOfItems(lstP) - 1)
{
LstSetSelection(lstP, LstGetSelection(lstP) + 1);
}
}
else if (NavKeyPressed(&event, Select))
{
keyHandled = true;
bLstBuf = LstGetSelectionText(lstP, LstGetSelection(lstP));
seachOffset = 0;
i = 0;
while (i < keyLength)
{
seachOffset += TxtGetNextChar(bLstBuf, seachOffset, &Buf[i]);
i ++;
}
ExitEventLoop = true;
}
}
}
else if (event.data.keyDown.chr >= 97 && event.data.keyDown.chr <= 122 && ! inSel)
{
keyHandled = true;
fldTextSp = FldGetTextLength(fldKeyPtr);
fldKeyTextHandle = FldGetTextHandle(fldKeyPtr);
FldSetTextHandle(fldKeyPtr, NULL);
fldKeyTextPtr = MemHandleLock(fldKeyTextHandle);
if (fldTextSp < 5)
{
fldKeyTextPtr[fldTextSp] = event.data.keyDown.chr - 32;
}
MemHandleUnlock(fldKeyTextHandle);
FldSetTextHandle(fldKeyPtr, fldKeyTextHandle);
FldDrawField(fldKeyPtr);
}
else if (event.data.keyDown.chr == 0x0008 && ! inSel) //退格键
{
keyHandled = true;
fldTextSp = FldGetTextLength(fldKeyPtr) - 1;
fldKeyTextHandle = FldGetTextHandle(fldKeyPtr);
FldSetTextHandle(fldKeyPtr, NULL);
fldKeyTextPtr = MemHandleLock(fldKeyTextHandle);
if (fldTextSp > 0) //最后一个字符不用删,直接退出
{
fldKeyTextPtr[fldTextSp] = '\0';
MemHandleUnlock(fldKeyTextHandle);
FldSetTextHandle(fldKeyPtr, fldKeyTextHandle);
FldDrawField(fldKeyPtr);
}
else
{
MemHandleUnlock(fldKeyTextHandle);
FldSetTextHandle(fldKeyPtr, fldKeyTextHandle);
ExitEventLoop = true;
}
}
else if (event.data.keyDown.chr == 0x000A) //回车
{
keyHandled = true;
keyLength = FldGetTextLength(fldKeyPtr);
if (keyLength > 0)
{
fldKeyTextHandle = FldGetTextHandle(fldKeyPtr);
FldSetTextHandle(fldKeyPtr, NULL);
fldKeyTextPtr = MemHandleLock(fldKeyTextHandle);
i = 0;
while (i < keyLength && i < 5)
{
Buf[i] = fldKeyTextPtr[i];
i ++;
}
MemHandleUnlock(fldKeyTextHandle);
FldSetTextHandle(fldKeyPtr, fldKeyTextHandle);
}
ExitEventLoop = true;
}
else if (event.data.keyDown.chr == 0x0020 && ! inSel) //空格
{
keyHandled = true;
keyLength = FldGetTextLength(fldKeyPtr);
if (keyLength > 0)
{
fldKeyTextHandle = FldGetTextHandle(fldKeyPtr);
FldSetTextHandle(fldKeyPtr, NULL);
fldKeyTextPtr = MemHandleLock(fldKeyTextHandle);
dbRef = DmOpenDatabaseByTypeCreator('DATA', 'addr', dmModeReadOnly);
dbR = DmOpenDatabaseByTypeCreator('CMPY', 'REiC', dmModeReadOnly);
dbCount = DmNumRecordsInCategory(dbRef, dmAllCategories);
lstBufLen = 0;
//开始巨耗费时间和内存的操作……
if((lstBuf = MemPtrNew(10752)) == 0) //获取15K内存
{
//不会出错吧……
}
lstBuf[0] = '\0';
lstBuf[10751] = '\0';
seachOffset = 0;
bLstBuf = 0;
for (i = 0; i < dbCount; i ++)
{
addrFullName[0] = '\0';
OLD_GetFirstName(dbRef, i, addrFullName);
if (TxtLen(addrFullName) >= keyLength) //大于或等于
{
pyStr[0] = '\0';
GBK2PY(addrFullName, pyStr, dbR);
if (TxtCompare(fldKeyTextPtr, keyLength, NULL, pyStr, keyLength, NULL) == 0) //匹配
{
inSel = true;
bLstBuf = lstBuf + lstBufLen;
bLstBuf[0] = '\0';
StrCat(bLstBuf, addrFullName);
lstBufLen += StrLen(addrFullName) + 1; //总是指向下一个名字开始
seachOffset ++;
}
}
}
//终于遍历完了
if (seachOffset > 0) //至少找到一个
{
MemPtrResize(lstBuf, lstBufLen); //赶快缩水
//开始很恶心的列表构筑过程……
lstArrayHandle = SysFormPointerArrayToStrings (lstBuf, seachOffset);
lstItemStr = MemHandleLock(lstArrayHandle);
LstSetListChoices (lstP , lstItemStr, seachOffset);
LstSetSelection(lstP, 0);
LstDrawList(lstP);
}
else
{
MemPtrFree(lstBuf);
ExitEventLoop = true;
}
MemHandleUnlock(fldKeyTextHandle);
FldSetTextHandle(fldKeyPtr, fldKeyTextHandle);
DmCloseDatabase(dbRef);
DmCloseDatabase(dbR);
}
}
}
if (! keyHandled)
{
SysHandleEvent(&event);
}
}while (event.eType != appStopEvent && ! ExitEventLoop);
fldKeyTextHandle = FldGetTextHandle(fldKeyPtr);
FldSetTextHandle(fldKeyPtr, NULL);
MemHandleFree(fldKeyTextHandle);
MemPtrFree(addrFullName);
MemPtrFree(pyStr);
if (inSel)
{
MemPtrFree(lstBuf);
MemHandleUnlock(lstArrayHandle);
MemHandleFree(lstArrayHandle);
}
}
//百家姓-Treo600
static WChar OLD_LastNameHandler(ChineseMatePref * cPref, FormType * frmP)
{
EventType event;
FieldType * fldKeyPtr;
FieldType * fldNamePtr;
MemHandle fldKeyTextHandle;
MemHandle fldNameTextHandle;
Char * fldKeyTextPtr;
Char * fldNameTextPtr;
Char curKey = 0x00;
Boolean ExitEventLoop = false;
DmOpenRef * dbRef;
DmOpenRef * pydbRef;
UInt16 dbCount = 0;
WChar curChar = 0;
WChar prvChar;
UInt16 nameOffset;
UInt16 curSel;
UInt16 curSelEnd;
UInt16 maxNameLen;
Boolean keyHandled;
UInt16 i;
UInt16 seachI;
UInt16 endI;
//Init Field
fldKeyPtr = (FieldType *)FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, fldLNKey));
fldKeyTextHandle = MemHandleNew(2);
if (! fldKeyTextHandle) //err check
{
FrmAlert(errMemError);
return 0;
}
fldKeyTextPtr = (Char *)MemHandleLock(fldKeyTextHandle);
fldKeyTextPtr[0] = 0x00; fldKeyTextPtr[1] = 0x00;
MemHandleUnlock(fldKeyTextHandle);
FldSetTextHandle(fldKeyPtr, fldKeyTextHandle);
fldNamePtr = (FieldType *)FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, fldName));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -