硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1982|回复: 5
收起左侧

[emWin] 请问,emWin里的LISTVIEW控件在使用时是不是有什么要注意的??

[复制链接]

53

主题

77

回帖

236

积分

高级会员

积分
236
发表于 2022-2-8 12:31:20 | 显示全部楼层 |阅读模式
我在用LISTVIEW时,已经加入了几十条数据后,用手拖动表格上下左右移动过程中,就容易导致死机,奇怪了。。难道这个控件在拖动时有什么BUG??导致内存泄漏吗??
回复

使用道具 举报

53

主题

77

回帖

236

积分

高级会员

积分
236
 楼主| 发表于 2022-2-8 12:32:18 | 显示全部楼层
注:LISTVIEW_EnableMotion(hItem, 1);使能了表格的这个功能。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2022-2-8 16:04:27 | 显示全部楼层
几十条卡死,不正常。方便的话,仅分享你的这部分测试代码,我试试。
回复

使用道具 举报

53

主题

77

回帖

236

积分

高级会员

积分
236
 楼主| 发表于 2022-2-8 16:08:34 | 显示全部楼层
eric2013 发表于 2022-2-8 16:04
几十条卡死,不正常。方便的话,仅分享你的这部分测试代码,我试试。

几百条也不应该卡死吧?这个控件是否存在BUG?我的代码如下:
首先是控件的配置:
        hItem = WM_GetDialogItem(hWin, GUI_ID_LISTVIEW0);
        LISTVIEW_SetFont(hItem, GUI_FONT_13_ASCII);
    LISTVIEW_SetBkColor(hItem, LISTVIEW_CI_UNSEL, GUI_WHITE);
        LISTVIEW_SetBkColor(hItem, LISTVIEW_CI_SELFOCUS, GUI_BLACK);
        LISTVIEW_SetTextColor(hItem, LISTVIEW_CI_UNSEL, GUI_BLACK);
        LISTVIEW_SetTextColor(hItem, LISTVIEW_CI_SELFOCUS, GUI_YELLOW);
        LISTVIEW_SetWrapMode(hItem, GUI_WRAPMODE_WORD);
    LISTVIEW_SetAutoScrollH(hItem, 1);
    LISTVIEW_SetAutoScrollV(hItem, 1);
    LISTVIEW_SetRowHeight(hItem, 20);
    LISTVIEW_SetHeaderHeight(hItem, 32);

    LISTVIEW_AddColumn(hItem, 56, "时间", GUI_TA_HCENTER | GUI_TA_VCENTER);
    LISTVIEW_AddColumn(hItem, 50, "焊点号", GUI_TA_HCENTER | GUI_TA_VCENTER);
        LISTVIEW_AddColumn(hItem, 48, "规范号", GUI_TA_HCENTER | GUI_TA_VCENTER);       
    LISTVIEW_AddColumn(hItem, 46, "电流\nRMS1", GUI_TA_HCENTER | GUI_TA_VCENTER);
        LISTVIEW_AddColumn(hItem, 46, "电流\nPEK1", GUI_TA_HCENTER | GUI_TA_VCENTER);
    LISTVIEW_AddColumn(hItem, 46, "电流\nRMS2", GUI_TA_HCENTER | GUI_TA_VCENTER);
        LISTVIEW_AddColumn(hItem, 46, "电流\nPEK2", GUI_TA_HCENTER | GUI_TA_VCENTER);
    LISTVIEW_AddColumn(hItem, 46, "电流\nRMS3", GUI_TA_HCENTER | GUI_TA_VCENTER);
        LISTVIEW_AddColumn(hItem, 46, "电流\nPEK3", GUI_TA_HCENTER | GUI_TA_VCENTER);
    LISTVIEW_AddColumn(hItem, 46, "电压\nRMS1", GUI_TA_HCENTER | GUI_TA_VCENTER);
        LISTVIEW_AddColumn(hItem, 46, "电压\nPEK1", GUI_TA_HCENTER | GUI_TA_VCENTER);
    LISTVIEW_AddColumn(hItem, 46, "电压\nRMS2", GUI_TA_HCENTER | GUI_TA_VCENTER);
        LISTVIEW_AddColumn(hItem, 46, "电压\nPEK2", GUI_TA_HCENTER | GUI_TA_VCENTER);
    LISTVIEW_AddColumn(hItem, 46, "电压\nRMS3", GUI_TA_HCENTER | GUI_TA_VCENTER);
        LISTVIEW_AddColumn(hItem, 46, "电压\nPEK3", GUI_TA_HCENTER | GUI_TA_VCENTER);
        LISTVIEW_AddColumn(hItem, 46, "功率\nRMS1", GUI_TA_HCENTER | GUI_TA_VCENTER);
        LISTVIEW_AddColumn(hItem, 46, "功率\nRMS2", GUI_TA_HCENTER | GUI_TA_VCENTER);
        LISTVIEW_AddColumn(hItem, 46, "功率\nRMS3", GUI_TA_HCENTER | GUI_TA_VCENTER);
        LISTVIEW_AddColumn(hItem, 46, "电阻\nRMS1", GUI_TA_HCENTER | GUI_TA_VCENTER);
        LISTVIEW_AddColumn(hItem, 46, "电阻\nRMS2", GUI_TA_HCENTER | GUI_TA_VCENTER);
        LISTVIEW_AddColumn(hItem, 46, "电阻\nRMS3", GUI_TA_HCENTER | GUI_TA_VCENTER);
        LISTVIEW_AddColumn(hItem, 46, "压力\nAVR1", GUI_TA_HCENTER | GUI_TA_VCENTER);
        LISTVIEW_AddColumn(hItem, 46, "压力\nAVR2", GUI_TA_HCENTER | GUI_TA_VCENTER);
        LISTVIEW_AddColumn(hItem, 46, "压力\nAVR3", GUI_TA_HCENTER | GUI_TA_VCENTER);
        LISTVIEW_AddColumn(hItem, 46, "位移", GUI_TA_HCENTER | GUI_TA_VCENTER);

然后是打开数据并加入表格的函数:
void OpenDateBase(WM_MESSAGE * pMsg)
{
        WM_HWIN hWin = pMsg->hWin;
        WM_HWIN hItem;
        FILE *fp;
        char buf1[10], buf2[10], buf[50];

        char *p;
        unsigned int row = 0;
        unsigned int col = 0;
        char sel = 0;
        int i;
        U32 size;

        osSemaphoreAcquire(BinarySemFileHandle, osWaitForever);
       
        sprintf(buf, "N0:\\20%02d%02d%02d.csv",
                                 GetDate.Year, GetDate.Month, GetDate.Date);
       
        fp = fopen(buf, "r");
       
        hItem = WM_GetDialogItem(hWin, GUI_ID_LISTVIEW0);
        LISTVIEW_DeleteAllRows(hItem);
       
        if(fp != NULL)
        {
                fseek(fp, 0L, SEEK_END);
                size = ftell(fp);
                if(size > 100000)
                {
                        fseek(fp, size-100000, SEEK_SET);
                       
                }
                else
                {
                        fseek(fp, 0L, SEEK_SET);
                }
                fgets(buf_read, MAX_READ-1, fp);        //读取头部注释字符
//                while(fgetc(fp) != '\n') ;
               
               
                sprintf(buf1, "%02d:%02d:%02d", GetTime1.Hours, GetTime1.Minutes, GetTime1.Seconds);
                sprintf(buf2, "%02d:%02d:%02d", GetTime2.Hours, GetTime2.Minutes, GetTime2.Seconds);
       
                LISTVIEW_EnableMotion(hItem, 1);
               
                while (fgets(buf_read, MAX_READ-1, fp) != NULL && row <= 1000)  
                {
                       
                        buf_read[MAX_READ-1] = 0;

                        col = 0;
                        p = buf_read;
                        while(*p != NULL && *p != '\n')
                        {
                                sel = 0;
                                while(*p != NULL && *p != ',')
                                {
                                        if(sel >= 20-1) break;
                                        SetBuf[sel++] = *p++;
                                }
                                SetBuf[sel] = 0;
                                p++;
                               
                                if(col == 0 && strcmp(SetBuf, buf1) < 0) break;
                                if(col == 0 && strcmp(SetBuf, buf2) > 0)
                                {
                                        fclose(fp);
                                        osSemaphoreRelease(BinarySemFileHandle);
                                        return;
                                }
                               
                                if(col == 0) LISTVIEW_InsertRow(hItem, 0, NULL);
                               
                                if(col <= (MAX_SAVE_NUM) - 1)
                                {
                                        LISTVIEW_SetItemText(hItem, col, 0, SetBuf);       
                                       
                                }
                                else
                                {
                                        if(strcmp(SetBuf, "0") == 0)
                                        {
                                                for(i = 0; i <= (MAX_SAVE_NUM) - 1; i++)
                                                        LISTVIEW_SetItemBkColor(hItem, i, 0, LISTVIEW_CI_UNSEL,GUI_LIGHTRED);
                                        }
                                }
                                       
                                col++;
       
                                if(col > (MAX_SAVE_NUM)) break;
                        }
                       
                        if(col > 0)
                        {
                                row++;
                        }       
                       
                }
                fclose(fp);
        }
       
        osSemaphoreRelease(BinarySemFileHandle);
}

硬汉兄可以试试。。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2022-2-9 09:49:07 | 显示全部楼层
perfect_co 发表于 2022-2-8 16:08
几百条也不应该卡死吧?这个控件是否存在BUG?我的代码如下:
首先是控件的配置:
        hItem = WM_GetDial ...

你这个是LISTVIEW_SetFont(hItem, GUI_FONT_13_ASCII);显示的中文?
回复

使用道具 举报

53

主题

77

回帖

236

积分

高级会员

积分
236
 楼主| 发表于 2022-2-9 11:07:19 | 显示全部楼层
eric2013 发表于 2022-2-9 09:49
你这个是LISTVIEW_SetFont(hItem, GUI_FONT_13_ASCII);显示的中文?

HEADER_SetDefaultFont(&GUI_FontHei16);
这个列表的头部是这个字体。
GUI_FONT_13_ASCII字体是用来显示表格内部的数字的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-15 09:19 , Processed in 0.044509 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表