⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chinesemate.c

📁 palm os 上的中文伴侣源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -