如何在拖动内容到rxRichEdit后马上将其全部内容赋值给另一个RxRichEdit?(50分)

  • 主题发起人 主题发起人 任远
  • 开始时间 开始时间

任远

Unregistered / Unconfirmed
GUEST, unregistred user!
最近想做一个程序,可以将外部内容拖入进RxRichEdit中,然后在拖动完成后立即将其内容赋值给另一个RXrichEdit,将清空其中的内容,但我在不知道如何捕获拖放事件,在onStartDock、onStartDrag、onDragDrop、onDragDrop、onDragOver、onDockOver、onDravOver中都加入showmessage('触发');,拖入内容后居然没有任何反应,应该如何解决呀?
 
不会吧?居然没人知道?
 
你的外部指的是你程序的外部吗?系统的文件?
如果是,我想你这样做应该是得不到
我现在也在做这样的程序,用了三方控件,可以实现和系统的文件的拖放
 
在网上找的,不晓得能不能帮你。
在DBGrid上Drag & Drop(拖放)我们在做程序中发现,如果能够让用户将一个Edit的内容直接拖放到一个DBGrid里,会显得很方便,但在程序编制过程中发现,似乎拖放只能拖放到当前的记录上,那假如要拖放到其他记录又怎么办呢,总不能让用户先选择记录,然后再拖放吧。
后来,通过研究发现,当用鼠标点DBGrid时,DBGrid会自动将记录指针移动到所点击的记录上,这就给了我一个思路,让程序模拟在DBGrid上的一次点击先让光标移动到那条记录上,然后就可以将拖放的数据写入DBgrid里面了。
通过事实证明这个思路是可行的。下面,我就告诉大家我的做法:
1) 首先在Form上放一个DBGrid,并它能够显示记录,(这比较简单,就不用多说了)
2) 在Form上放一个Edit
3) 修改Edit的属性,把DragMode改为dmAutoMatic, 让用户能够拖放
4) 在Dbgrid的DragOver事件中增加如下代码: 让它能够接收 Drag & drop

procedure TForm1.DBGrid1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
accept:=true;
end;

5) 在Dbgrid的DragDrop事件中增加如下代码: 让它能够自动跳到光标所指定的记录上

procedure TForm1.DBGrid1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if Source<>Edit1 then exit;
with Sender as TDbGrid do begin
Perform(wm_LButtonDown,0,MakeLong(x,y));
PerForm(WM_LButtonUp, 0,MakeLong(x,y));
SelectedField.Dataset.edit;
SelectedField.AsString:=Edit1.text;
end;
end;

至此,我们就实现了想要的功能,其中PerForm是TControl的一个通用方法目的是绕过Windows本身的消息循环,而将消息直接发给要发的Control,其具体使用方法请参考Delphi的帮助。

 
DragMode属性设为dmAutomatic??这样做了没有?
 
试试App2001的办法
 
设置了dmAutomatic,但是拖入内容完毕后,再单击一下,才能触发startDrag哦?那其他事件是在什么时候触发呢?
 
把拖动方式设为自动。
在onDragOver中设置accept属性
需要接受时设为True,不需要时为false
在onDragDrop中改变RxRichEdit中的text值,
也就是把拖来的内容加到RxRichEdit中。
 
procedure TForm1.RxRichEdit1Change(Sender: TObject);
begin
if RxRichEdit1.Tag<>0 then
exit;
RxRichEdit1.Tag:=1;
RxRichEdit2.Text:=RxRichEdit2.Text+RxRichEdit1.Text; //我不知道怎么提取对象...
RxRichEdit1.Text:='';
RxRichEdit1.Tag:=0;
end;
 
我试了一下。richedit什么代码都不用就可以拖啊。
可能dxrichedit自己处理了一些消息吧。我的例子可以拖的啊。

procedure TForm1.RichEdit2DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept:=True;
end;

procedure TForm1.RichEdit2DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
RichEdit2.Text:=RichEdit2.Text+String(Source);
end;
 
To Book523:
拖入内容后,不在拖入的内容上点一下,DRagDrop事件不会触发的!另外,我做的是拖入内容赋值给另一个RichEdit,而不是同一个,如果是同一个的话就没有那么麻烦了,直接拖入不就得了嘛,还用呼应什么事件呀!
 
拖动后发个消息试试
sendMessage(handle,WM_LBUTTONDOWN,0,0);
 
没用过RXrichEdit,提点建议,在onchange 事件中作点文章
 
发消息更不行了,点击后居然都不会再触发DragDrop了!
按creation-zy和迷糊的说法,change后倒可以赋值成功,看来还是要仔细研究一下change
 
ondragstart ... 是指拖动对象的事件

用onchange 可以吗?
 
同一book523的方法
 
我的是从richedit1拖到richedit2中啊,
一点问题都没有啊。
 
RichEdit1.PasteFromClipboard;
用内存贴的方法直接贴到RichEdit2去不更方便吗??
 
谢谢大家的帮助!
感觉大家有些误会,可能是我没说清楚,我要做的是一个拖放窗,在外部的内容拖入后,比如:从IE中拖入内容,我要把拖入的内容存在后台数据库,然后马上清空拖放窗的内容,如果没有更好的答案,我只有利用onChange事件来完成了!

还有2个问题:
1、如何给rxRichEdit设置一幅背景图?
2、系统中的两个rxRichEdit之间拖放内容后,会出现错误,禁止他们之间互相拖放?
 
to 任远:
很抱歉,拖放操作我还没有真正玩过,但有一点可以肯定的是,拖放操作的数据源
和目的地都应该支持拖放消息才行.
你可以先从简单一点的开始,但我从delphi自身帮助文件中看到以下说明,请注意
后面的备注,即Notes:
Occurs when the user begins to drag the control or an object it contains by left-clicking on the control and holding the mouse button down.

type TStartDragEvent = procedure (Sender: TObject; var DragObject: TDragObject) of object;
property OnStartDrag: TStartDragEvent;

Description

Use the OnStartDrag event handler to implement special processing when the user starts to drag the control or an object it contains. OnStartDrag only occurs if DragKind is dkDrag.

Sender is the control that is about to be dragged, or that contains the object about to be dragged.

The OnStartDrag event handler can create a TDragControlObjectEx instance for the DragObject parameter to specify the drag cursor, or, optionally, a drag image list. If you create a TDragControlObjectEx instance, there is no need to call the Free method for the DragObject when dragging is over. If you create, instead, a TDragControlObject instance, your application is responsible for freeing the drag object instance.

If the OnStartDrag event handler sets the DragObject parameter to nil, a TDragControlObject object is automatically created and dragging begins on the control itself.

Note: On some controls, such as TRichEdit, the underlying Windows control handles internal drag operations. For these controls, there are no OnStartDrag or OnEndDrag events for drag operations within the control.
 
后退
顶部