找回密码
 注册
Simdroid-非首页
查看: 321|回复: 3

[原创]为Activex控件MSFlexGrid增加键盘数据输入功能

[复制链接]
发表于 2005-3-21 19:35:52 | 显示全部楼层 |阅读模式 来自 陕西西安
这些天试了不少activex控件,不过很多属性不懂,能很好用的不多,前些天写了个electirc clock,觉得利用现成的activex控件确实可以大大丰富界面元素,得到意想不到的效果.对于Grid显示方面的控件,觉得还是MSFlexGrid属性最丰富,最易控制,于是集中精力,实现了MSFlexGrid控件从键盘输入数据,调试结果基本满足要求:

通过编写MSFlexGrid控件的event handler函数,完成了键盘数据输入功能,并实现了最简单的编辑功能,双击输入,单击或回车确认,双击后未输入字符时原字符仍然保存,可用BackSpace删除.

代码(直接保存为m文件运行):
function h=MSFGrid
%function h=MSFGrid
%MSFlexGrid输入数据或字符,双击输入,单击或回车确认,双击后未输入字符则原字符保存,支持BackSpace删除
% by nostalgica;email:nostalgica@163.com

ID='MSFlexGridLib.MSFlexGrid';
fi=figure('NumberTitle','off','toolbar','none','menubar','none','Name','Test Activex','pos',[159 150 550 250],'visible','off');
h = actxcontrol(ID,[0 0 550,250],fi,@gridhandler);
set(h,'rows',16,'cols',9);
for i=1:get(h,'rows')-1%固定栏标题
    set(h,'row',i,'col',0,'text',num2str(i));
end
for i=1:get(h,'cols')-1
    set(h,'row',0,'col',i,'text',num2str(i));
end
set(h,'format','No.');%标题

%========找一个数据交换的地方=========
atxdata{1}=get(h,'text');
atxdata{2}=[get(h,'row') get(h,'col')];
uicontrol(fi,'style','text','tag','datacontainer','visible','off','userdata',atxdata);%存放临时数据
=====================================
set(fi,'visible','on');

function gridhandler(varargin)
%varargin{1}:object (com,progid)
%varargin{2}:event id
%varargin{3}:event args
%varargin{4}:event name
switch varargin{2}
%-----------------------------------
case -600,    %single click
     [h,prow,pcol,ptext,datacontainer,atxdata]=dataprepare(varargin);
     row=get(h,'row');col=get(h,'col');
     rowsel=get(h,'rowsel');colsel=get(h,'colsel');%rowsel,colsel与row,col构成一矩形区为选定区
     set(h,'row',prow,'col',pcol);
     if length(ptext)~=0
     if ptext(end)=='|'
         if length(ptext)==1
             atxdata{1}=atxdata{3};
         else
             atxdata{1}=ptext(1:end-1);
         end
         set(h,'text',atxdata{1});
     end
     end
     set(h,'row',row,'col',col,'rowsel',rowsel,'colsel',colsel);
     atxdata{2}=[row col];
     set(datacontainer,'userdata',atxdata);
%-----------------------------------   
case -601,%Dbclick
     [h,prow,pcol,ptext,datacontainer,atxdata]=dataprepare(varargin);
     atxdata{3}=get(h,'text');
     atxdata{1}='|';
     set(h,'text',atxdata{1});
     set(datacontainer,'userdata',atxdata);
%-----------------------------------  
%case -602, %keypress
%-----------------------------------
case -603, %charpress
    [h,prow,pcol,ptext,datacontainer,atxdata]=dataprepare(varargin);
    text=get(h,'text');
    newchar=char(varargin{3});
    if strcmp(newchar,char(13))==1%回车
        if length(text)==1
            set(h,'text','');
            atxdata{1}=[];
            set(datacontainer,'userdata',atxdata);
        else
          set(h,'text',text(1:end-1));
        end
          return
    end
    if strcmp(newchar,char(8))==1%Back Space
        if length(text)>1
             atxdata{1}=[text(1:end-2),'|'];
             set(h,'text',atxdata{1});
        end
       set(datacontainer,'userdata',atxdata);
       return
    end
    if length(text)~=0
    if text(end)=='|'
        if length(text)==1
            atxdata{1}=[newchar,'|'];
        else
            atxdata{1}=[text(1:end-1),newchar,'|'];
        end
        set(h,'text',atxdata{1});
        set(datacontainer,'userdata',atxdata);
    end
    end
%-----------------------------------
%case -604, %keypress
%-----------------------------------
%case -605, %mouse down
%-----------------------------------
%case -606, %mouse move
%-----------------------------------
%case -607, %mouse up
%-----------------------------------
end

function [h,prow,pcol,ptext,datacontainer,atxdata]=dataprepare(event)
datacontainer=findobj('style','text','tag','datacontainer');
datacontainer=datacontainer(end);
atxdata=get(datacontainer,'userdata');
h=event{1};
prow=atxdata{2}(1);
pcol=atxdata{2}(2);
ptext=atxdata{1};

[ 本帖最后由 nostalgica 于 2006-9-2 14:48 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

发表于 2005-3-25 13:44:05 | 显示全部楼层 来自 台湾

Re:[原创]为Activex控件MSFlexGrid增加键盘数据输入功能

Simdroid开发平台
真是厉害, 曾经想过这个功能,但是不知如何实现,谢谢你解决我多日的疑惑,不过我还有个疑问,在excel内可以藉由ctrl键加上鼠标同时选取多个不同的方格,但是使用MSFlexGrid该怎么做呢?
 楼主| 发表于 2005-3-25 19:55:40 | 显示全部楼层 来自 陕西西安

Re:[原创]为Activex控件MSFlexGrid增加键盘数据输入功能

直接用鼠标拖动即可选.wsel,colsel与row,col四个属性构成一矩形区为选定区
发表于 2005-3-30 10:20:01 | 显示全部楼层 来自 台湾

Re:[原创]为Activex控件MSFlexGrid增加键盘数据输入功能

我的意思是选择不相邻的区域,例如同时选择坐标为(1,1)的格子和坐标(2,4)的储存格,我只要选择这两个储存格,而不是(1,1)到(2,4)所包含的区域,不知有没有办法做到?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-5-4 13:44 , Processed in 0.044190 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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