一个有趣的问题,先出100分!(100分)

  • 主题发起人 主题发起人 powers
  • 开始时间 开始时间
P

powers

Unregistered / Unconfirmed
GUEST, unregistred user!
在form上放一个richedit,通过setcaretpos可以将光标(caret)设置到richedit中
的任意位置,可是如何在所设置的光标出输入文本?我试了几次都不行,每当在richedit
中输入字符时,光标又会跑会原来的位置。
 
哦,我也去试一试
 
要超出文本是要给他发送消息的,我以前作过一个日子,过两天回学校给你贴上。
 
谢谢wjiachun,高手就是高手!
 
问题提前!
 
不对呀。我用这个到是好好的。
*************************************************************************

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls;

type
TForm1 = class(TForm)
RichEdit1: TRichEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure SetCaret(RTF:TRichEdit; var row, col: word);
var
i,iStopLine,iSelStart:integer;
Strings:TStrings;
begin
if (RTF=nil) then exit;
Strings:=RTF.Lines;
if Row=0 then Row:=1;
if Col=0 then Col:=1;
//到第Row列,Col行共几个字元
iStopLine:=Row-1;
iSelStart:=0;
for i:=0 to Strings.Count-1 do
begin
if i=iStopLine then
begin
if Length(Strings)>Col then
Inc(iSelStart,Col)
else
Inc(iSelStart,Length(Strings)+2);
Break;
end;
Inc(iSelStart,Length(Strings)+2);
end;
if iSelStart>0 then Dec(iSelStart);
//以设定标记的方式指定游标位置
RTF.SelStart :=iSelStart;// + Length(RTF.Lines)+2;
//再次侦测游标位置
Row:=SendMessage(RTF.Handle,EM_LINEFROMCHAR,RTF.SelStart,0);
Col:=RTF.SelStart-SendMessage(RTF.Handle,EM_LINEINDEX,Row,0);
//卷到游标所在位置
SendMessage(RTF.Handle,EM_SCROLLCARET,0,0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var i,j:word;
begin
i:=2;
j:=3;
richedit1.SetFocus;
SetCaret(RichEdit1,i,j);
end;

end.

*************************************************************************
 
感谢doxpix,不过您可能误会我的意思了。我说的是用api函数SetCaretPos(x: integer;
y: integer)将光标设置在richedit中的任意坐标位置,这个位置并不一定在某行某列上。
比如你可以在richedit的onmousedown的事件里写如下代码:
procedure TForm1.RichEdit1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
SetCaretPos(x,y);
end;
那么你就可以通过点击richedit将caret设置到richedit中的任意坐标位置,但此时如果
你从键盘上输入字符,那么光标又会跑回以前的位置并显示你输入的字符。所以我的问
题是如何从你设置的光标位置处输入字符。
 
试一试。。。
 
问题提前
 
抱歉,最近我实在是忙,先给你一个试试!

你应该在插入文本时强行改变编辑光标位置,让它等价于鼠标位置。
发送一个ButtonDown消息锁定当前鼠标位置作为新的光标位置:
我的程序是把ListView的东西往RichEdit拖的,你改动一下应该可用。
procedure TForm1.RichEdit1DragDrop( Sender, Source: TObject;
X, Y: Integer );
begin
if Source is TListView then
begin
SendMessage(RichEdit1.Handle,WM_LButtonDown,MK_LBUTTON,MakeLParam(X,Y));
SendMessage(RichEdit1.Handle,EM_ReplaceSel,1,
LongInt(PChar(ListView1.Selected.Caption)));
end;
end;
 
感谢wjachun在百忙之中来回答的我的问题,不过您说的方法好像还是
不灵验,等您有时间了再给我好好解释一下如何?
感激再三!
 

你可以尝试先确定光标所在行列,然后将光标前用空格填充!
 
问题结束吧。
wjachun大侠80分,大侠doxpix20分。
 
后退
顶部