VFP表单设计:数据打印时的覆盖问题解析

需积分: 50 7 下载量 189 浏览量 更新于2024-08-15 收藏 1.61MB PPT 举报
"VPF 表单设计中的数据打印覆盖问题及Visual FoxPro 6.0表单设计关键点" 在VPF (Visual FoxPro) 表单设计中,一个重要的考虑因素是元素的布局,特别是当涉及到打印时的数据可见性。在上述描述中提到了两种情况可能导致数据在打印时被覆盖: 1. 当一个域被设置为相对于带区底端固定,并且在其下方有一个域被设置为相对于带区顶端固定,同时还启用了溢出时伸展选项。在这种情况下,由于底部域的高度被固定,当上面的域扩展以适应更多数据时,底部域会因为没有足够的空间而被覆盖,导致部分数据无法在打印时显示。 2. 另一种情况是,如果一个域设置为相对于带区顶端固定,而在其上方有一个同样设置为顶端固定的域,且启用了溢出时伸展选项。这里的问题在于,当上面的域扩展时,由于下方域的高度固定,没有空间容纳扩展的内容,所以可能会遮盖住下面域的部分数据。 在Visual FoxPro 6.0中,表单设计是程序开发的重要组成部分。表单是用户与数据库交互的界面,可以用于数据输入、查看和输出。以下是一些关于表单设计的关键点: - **表单的基本设计方法**:包括单表表单和多表表单的设计,两者的主要区别在于数据源的关联方式。 - **添加控件**:在表单设计中,可以添加多种控件,如文本框、列表框、按钮等,以满足不同的用户交互需求。 - **控件功能和事件**:每个控件都有特定的功能,比如文本框用于输入数据,按钮用于触发操作。同时,控件还具有事件,如点击事件、改变事件等,可以编写对应的事件处理代码。 - **方法程序**:这是在表单或控件中定义的函数,用于执行特定的任务,比如数据验证、计算等。 - **表单管理**:包括表单的显示、隐藏、激活和关闭等操作,以及如何在多个表单之间切换。 - **表单集**:是包含一个或多个表单的集合,可以作为一个整体进行操作,方便管理和协调多个相关的表单。 创建表单的方法通常包括使用表单向导、表单设计器和快速表单。通过项目管理器、文件菜单或CREATEFORM命令,都可以新建一个表单。在表单设计器中,可以直观地调整控件的位置,设置属性,编写事件处理代码,以及创建自定义模板的表单。 在设计表单时,必须充分考虑布局、数据流和用户交互,以确保数据的有效展示和操作。同时,针对上述可能出现的打印覆盖问题,设计师需要调整域的位置和属性设置,确保在打印时所有数据都能正确显示。

解释下面代码static UINT8 libTXT2PDU( UINT8* msgData, UINT16 msgLen, UINT8* pTpdu, AtciMsgInfo *pAtSmsMessage, AtciCharacterSet chset_type ) { UINT8 offset = 0; UINT16 len=0; //CPUartLogPrintf("%s: enter", __FUNCTION__); //int i; //for(i=0;i<msgLen;i++) //CPUartLogPrintf("%s: msgData[%d] %d 0x%x", __FUNCTION__, i, msgData[i], msgData[i]); /* Copy the first octet */ /*SIMCom xiaokai.yang sync sms code @2023-02-06 begin*/ #ifdef FEATURE_SIMCOM_SMS char headbuf[PDU_HEAD_SIZE] = {0x05,0x00,0x03}; scCmssexInfoT* p_CmgsexInfo = (scCmssexInfoT*)getCmgsexInfoInd(); if(pAtSmsMessage->udhPresent) { pTpdu[ offset++ ] = (pAtSmsMessage->fo)|(0x1<<6); } else #endif /*SIMCom xiaokai.yang sync sms code @2023-02-06 end*/ pTpdu[ offset++ ] = pAtSmsMessage->fo; /* Message Reference */ pTpdu[ offset++ ] = pAtSmsMessage->msgRef; /* Originating Address (TP-OA) */ { UINT8 idx; UINT8 *data; data = pTpdu + offset; /* Set the Address Length octet */ *data++ = strlen( (char *)pAtSmsMessage->destAddr ); #ifdef FEATURE_SIMCOM_SMS PAL_LogIo(SC_MODULE_SMS,PAL_DBG_LEVEL_INFO,"destAddr [%s]",( (char *)pAtSmsMessage->destAddr )); #endif /* Format the TON/NPI octet */ *data++ = (UINT8)((pAtSmsMessage->addrType << 4) | pAtSmsMessage->addrPlan | 0x80); /* Format the BCD digits */ for ( idx = 0; idx < strlen( (char *)pAtSmsMessage->destAddr ); idx++ ) { libPutPackedBcd( data, idx, pAtSmsMessage->destAddr[ idx ], TRUE ); } /* check if we need to tack on a filler */ if( idx & 0x01 ) { /* Yup -- do it! , reversed nibbles */ libPutPackedBcd( data, idx, ATCI_BCD_FILLER, TRUE ); ++idx; } /* We're done -- update the PDU byte index */ offset += idx/2 + ATCI_SMS_BCD_POS; } /* Protocol Identifier (TP-PID) */ pTpdu[ offset++ ] = pAtSmsMessage->pid; /* Data Coding Scheme (TP-DCS) */ pTpdu[ offset++ ] = pAtSmsMessage->dcs; if(((pAtSmsMessage->fo&ATCI_TP_MTI_MASK)==ATCI_SMS_SUBMIT_MTI)&&((pAtSmsMessage->fo&ATCI_SMS_TP_VPF)==0x10)) { pTpdu[ offset++ ] = pAtSmsMessage->vp; } /*SIMCom xiaokai.yang sync sms code @2023-02-06 begin*/ #ifdef FEATURE_SIMCOM_SMS if(pAtSmsMessage->udhPresent) { headbuf[3] = p_CmgsexInfo->mr; headbuf[4] = p_CmgsexInfo->msg_total; headbuf[5] = p_CmgsexInfo->msg_seg; memmove(msgData+PDU_HEAD_SIZE,msgData,msgLen); memcpy(msgData, headbuf, PDU_HEAD_SIZE); msgLen+=PDU_HEAD_SIZE; } PAL_LogIo(SC_MODULE_SMS,PAL_DBG_LEVEL_INFO,"offset1 [%d],msgLen=%d",offset,msgLen);//274 #endif /*SIMCom xiaokai.yang sync sms code @2023-02-06 end*/ /* Now for the Message Data (TP-UDL + TP-UD) */ //ScShowDataByHex((char *)pTpdu, offset); //CPUartLogPrintf("[sms]msgLen=%d",msgLen); libMsgEncodeUserData( pAtSmsMessage->udhPresent, pAtSmsMessage->dcs, pTpdu, msgData, msgLen, offset, &len,chset_type); return len; }

2023-06-08 上传