如何禁止Ctrl+C等方法拷贝TDBGrid的内容?

LuoGD 2006-09-18 05:27:44
如题,要求可以输入文字,但不能拷贝出来。
...全文
555 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccrun.com 2006-09-19
  • 打赏
  • 举报
回复
我觉的用DBCtrlGrid不错。
楼主试着参考一下。放几个Label,Edit之类的作为显示题,备选答案和自填答案用。考生只需滚动鼠标就可以向下浏览,答题只需点击一下鼠标。尽量让使用者减少操作的复杂程度。
LuoGD 2006-09-19
  • 打赏
  • 举报
回复
该DBGrid主要是实现类似于考试回答问题的功能,前面是题号,后面是问题描述,再后面是考试人员的回答内容,
回答内容有选择项,也可以考试人员自己输入答案,
每个问题的备选回答不同,所以我就动态生成该列的PickList,在onCellClick事件中动态设置PickList,
但这样感觉给考试人员操作不是很方便,要点一下该问题(一行),让该Cell获得焦点,再点一下才触发onCellClick事件动态加载备选答案,再点击选择答案,这样回答一个问题要至少点鼠标3下,
感觉效率不高,有没有更有效的方法?

|id | 问题 |解答
| 1 | 问题描述1 |
| 2 | 问题描述2 |
BlueDeepOcean 2006-09-19
  • 打赏
  • 举报
回复
//在CPP文件中写代码如下:
//借鉴了"一个有趣的...(我不记得了.)贴子"
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TInplaceEdit::WndProc(Messages::TMessage &Message)
{
if( Message.Msg==WM_COPY )
{
ShowMessage("不许COPY");
}
else
Dispatch( &Message );
}

//上面是jjwwang((空园歌独酌,春日赋闲居)) 的

同时在头文件的

private: // User declarations
void __fastcall WndProc(Messages::TMessage &Message);

之后调用:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
DBGrid1->WindowProc = WndProc;
}
//---------------------------------------------------------------------------
jiangshx 2006-09-19
  • 打赏
  • 举报
回复
我试了,只需要把这段加到DBGrid1所在的窗体里就行了,不需要再添加任何代码。
LuoGD 2006-09-19
  • 打赏
  • 举报
回复
to jjwwang((空园歌独酌,春日赋闲居)) ( )

void __fastcall TInplaceEdit::WndProc(Messages::TMessage &Message)
{
if( Message.Msg==WM_COPY )
{
ShowMessage("不许COPY");
}
else
Dispatch( &Message );
}

这个代码直接加在我的Form的.cpp里面,
重新build工程,显示这几行代码不会被执行,设置断点时,断点也是无效的?
这段代码应该置于何处?

(另为感谢ccrun和jjwwang的热心,本贴增加到200分)
ccrun.com 2006-09-19
  • 打赏
  • 举报
回复
恩。jjwwang的有道理。因为DBGrid的编辑框其实是另外一个窗口,类名就是TInplaceEdit。这个方法很巧妙。不错。
CACACACACA 2006-09-19
  • 打赏
  • 举报
回复
建议重新Build工程一下.
tanlim 2006-09-19
  • 打赏
  • 举报
回复
可以将问题提交到我组织的这次BCB6界面研讨会上解决,请关注相关贴子
http://community.csdn.net/Expert/topic/5031/5031801.xml?temp=.7387659
CACACACACA 2006-09-19
  • 打赏
  • 举报
回复
不可能, 我测试了的.
LuoGD 2006-09-19
  • 打赏
  • 举报
回复
to jjwwang((空园歌独酌,春日赋闲居)) ( )
你的方法看起来很好,但没有效果!
jiangshx 2006-09-19
  • 打赏
  • 举报
回复
我弄了半天也没搞明白怎么拦截WM_COPY ,还是楼上牛,学习一下。
CACACACACA 2006-09-19
  • 打赏
  • 举报
回复
不会影响整个程序,只会禁止DBGrid的单元格的Copy.
CACACACACA 2006-09-19
  • 打赏
  • 举报
回复
//在CPP文件中写代码如下:
//借鉴了"一个有趣的...(我不记得了.)贴子"
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TInplaceEdit::WndProc(Messages::TMessage &Message)
{
if( Message.Msg==WM_COPY )
{
ShowMessage("不许COPY");
}
else
Dispatch( &Message );
}
LuoGD 2006-09-19
  • 打赏
  • 举报
回复
谢谢ccrun(老妖)~~~
DBGrid需要用户能修改一个字段的值,比如“是/否”等,但要防止用户拷贝其他字段的信息
BlueDeepOcean 2006-09-19
  • 打赏
  • 举报
回复
其实,如果就是针对具有诸如dgEditing属性的组件,直接操作即可,没必要搞得那么复杂,当然,条条大路通罗马吗,可我还是推崇能够直接解决问题的方法。:)
BlueDeepOcean 2006-09-19
  • 打赏
  • 举报
回复
学习一哈。
ccrun.com 2006-09-19
  • 打赏
  • 举报
回复
刚才想了想,在判断Ctrl + C的代码中还应该再加上判断当前窗口是否为本进程的窗口,以防误判断。另外还得解决鼠标右键菜单的复制粘贴。

最后想问楼主的是:非要允许用户编辑DBGrid中的内容吗?如果不是必须的话,可以将DBGrid->Options的dgEditing设为false,就不用这么费劲了。 -_-|||
ccrun.com 2006-09-19
  • 打赏
  • 举报
回复
我来了!!!
一个简单例程,通过Hook实现屏蔽Ctrl + C拷贝TDBGrid的内容,仅对键盘起作用。注意:通过鼠标右键菜单还可以拷贝。

HHOOK g_hOldHook = NULL;

long CALLBACK KeyProc(int nCode, WPARAM wParam, LPARAM lParam);
//---------------------------------------------------------------------------
long CALLBACK KeyProc(int nCode, WPARAM wParam, LPARAM lParam)
{
KBDLLHOOKSTRUCT *hs = (KBDLLHOOKSTRUCT *)lParam;
// 判断当前按键是否为Ctrl + C
if(hs->vkCode == 'C' && GetAsyncKeyState(VK_CONTROL) < 0)
{
// 通过判断当前焦点窗口DBGrid的编辑框而决定是否屏蔽掉Ctrl + C
HWND hFocusWin = GetFocus();
// 获取焦点窗口的类名
char szClassName[255];
GetClassName(hFocusWin, szClassName, 255);
// 判断当前窗口是否为DBGrid的编辑框:TDBGridInplaceEdit
if(!strcmp(szClassName, "TDBGridInplaceEdit"))
return 1; // 如果是则直接返回,不处理Ctrl + C的消息
}
return CallNextHookEx(g_hOldHook, nCode, wParam, lParam);
// 以上只处理了Ctrl + C,如果要处理Ctrl + V或Ctrl + X等,方法类似
// ccrun(老妖)就不写那么多了。
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
// 安装键盘钩子
g_hOldHook = SetWindowsHookEx(WH_KEYBOARD_LL,
(HOOKPROC)KeyProc, HInstance, NULL);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
// 结束时卸载键盘钩子
if(g_hOldHook)
UnhookWindowsHookEx(g_hOldHook);
}
i_love_pc 2006-09-19
  • 打赏
  • 举报
回复
学习!
LuoGD 2006-09-19
  • 打赏
  • 举报
回复
http://www.msf8.com/htm_data/42/0607/14646.html
的hook的方法会屏蔽整个程序的Ctrol+C,但我只需要屏蔽一个窗口的一个TDBGrid,其他控件还是可以拷贝怎么办?

老妖请帮忙!
加载更多回复(15)

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧