Memo1.SelStart //所选择串的开始位置
Memo1.SelLength //所选择串的长度
如何知道当前光标处在所选择串的左边还是右边?
18 个解决方案
#1
procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=vk_shift then
begin
epos:=sendmessage(memo1.handle,em_lineindex,memo1.SelStart,0);
if spos<epos then
showmessage('right')
else
showmessage('left');
end;
end;
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=vk_shift then
spos:=sendmessage(memo1.handle,em_lineindex,memo1.SelStart,0);
end
搞定,你试一试,符合要求就给
Shift: TShiftState);
begin
if key=vk_shift then
begin
epos:=sendmessage(memo1.handle,em_lineindex,memo1.SelStart,0);
if spos<epos then
showmessage('right')
else
showmessage('left');
end;
end;
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=vk_shift then
spos:=sendmessage(memo1.handle,em_lineindex,memo1.SelStart,0);
end
搞定,你试一试,符合要求就给
#2
不好意思,给丢了一段
另外,lpos,spos,epos都是全局变量
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
lpos:=sendmessage(memo1.handle,em_linefromchar,memo1.SelStart,0);
end;
另外,lpos,spos,epos都是全局变量
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
lpos:=sendmessage(memo1.handle,em_linefromchar,memo1.SelStart,0);
end;
#3
那么我是用鼠标选择的哪?
#4
我刚写了一个,你看看
var
i: integer;
T: integer;
begin
T:=0;
for i:=0 to memo1.CaretPos.Y-1 do
begin
T:=T+Length(MEmo1.Lines[i])+1;
end;
T:=T+memo1.CaretPos.X+1;
if T=Memo1.SelStart then showmessage('left') else
if T=Memo1.SelStart+memo1.SelLength then showmessage('Right');
end;
var
i: integer;
T: integer;
begin
T:=0;
for i:=0 to memo1.CaretPos.Y-1 do
begin
T:=T+Length(MEmo1.Lines[i])+1;
end;
T:=T+memo1.CaretPos.X+1;
if T=Memo1.SelStart then showmessage('left') else
if T=Memo1.SelStart+memo1.SelLength then showmessage('Right');
end;
#5
If Memo1.CaretPos.x>Memo1.SelStart then showmessage('Right') else showmessage('Left');
#6
刚才测试了一下,如果MEMO中选择了多行,那么再加上一个小小的条件就可以了:
If Memo1.CaretPos.x+Memo1.SelLength>Memo1.SelStart then showmessage('Right') else showmessage('Left');
If Memo1.CaretPos.x+Memo1.SelLength>Memo1.SelStart then showmessage('Right') else showmessage('Left');
#7
不行阿!
Memo1.CaretPos.x我这为什么不是当前光标的横坐标哪?
例如我只有一行字符,选择第3,4个字符,
光标在第三个字符前面,
用Memo1.CaretPos.x得到的是4,???
Memo1.CaretPos.x我这为什么不是当前光标的横坐标哪?
例如我只有一行字符,选择第3,4个字符,
光标在第三个字符前面,
用Memo1.CaretPos.x得到的是4,???
#8
急用!请大家帮忙了!
#9
我的代码不行吗?你试了没有,我试了,怎么就可以
#10
对不起,好象是不行,我在看看。
#11
我测试过了,得到的结果都是'Right',我单步调试了
就是Memo1.CaretPos.x的问题因为他始终=(SelEnd)选择内容的最后位置
就是Memo1.CaretPos.x的问题因为他始终=(SelEnd)选择内容的最后位置
#12
其实这个问题比较复杂!因为还涉及字体的问题!
#13
你是过我的程序了吗??
我是调试后发上来的
我是调试后发上来的
#14
to naughtyboy(淘气男孩) :
你的程序我也调试了,总是'left'
可我也得用鼠标选择阿!
你的程序我也调试了,总是'left'
可我也得用鼠标选择阿!
#15
如果要确定光标的位置:
如果在SelText的左边,memo1.Lines.Text[memo1.SelStart]则是memo1.SelText的起始字符,否则memo1.Lines.Text[memo1.SelStart-1]则是memo1.SelText的结束字符。
如果想确定光标所在地行列,则这样写:
function GetRow(memo: TMemo): Longint;
begin
Result := memo.Perform(EM_LINEFROMCHAR, -1, 0);
end;
function GetColumn(memo: TMemo): Longint;
begin
Result := memo.SelStart - memo.Perform(EM_LINEINDEX, -1, 0);
end;
如果在SelText的左边,memo1.Lines.Text[memo1.SelStart]则是memo1.SelText的起始字符,否则memo1.Lines.Text[memo1.SelStart-1]则是memo1.SelText的结束字符。
如果想确定光标所在地行列,则这样写:
function GetRow(memo: TMemo): Longint;
begin
Result := memo.Perform(EM_LINEFROMCHAR, -1, 0);
end;
function GetColumn(memo: TMemo): Longint;
begin
Result := memo.SelStart - memo.Perform(EM_LINEINDEX, -1, 0);
end;
#16
to chechy(我爱洁洁)
谢谢你的解答,但是我的问题还没有解决:
判断两边的字符不行:
当两边的字符都是一样的就判断不准了!!!!
function GetColumn(memo: TMemo): Longint;
begin
Result := memo.SelStart - memo.Perform(EM_LINEINDEX, -1, 0);
end;
memo.Perform(EM_LINEINDEX, -1, 0); 返回的结果是光标前n行的字符数之和
当选择多行内容时GetColumn返回值就 <0 了
最终还是得不到正确的结果!!!
谢谢你的解答,但是我的问题还没有解决:
判断两边的字符不行:
当两边的字符都是一样的就判断不准了!!!!
function GetColumn(memo: TMemo): Longint;
begin
Result := memo.SelStart - memo.Perform(EM_LINEINDEX, -1, 0);
end;
memo.Perform(EM_LINEINDEX, -1, 0); 返回的结果是光标前n行的字符数之和
当选择多行内容时GetColumn返回值就 <0 了
最终还是得不到正确的结果!!!
#17
这个问题我还没有解决
希望大家能帮帮忙!!
先谢谢了!!!!!!
希望大家能帮帮忙!!
先谢谢了!!!!!!
#18
这个问题我还没有解决
希望大家帮帮忙!!!
希望大家帮帮忙!!!
#1
procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=vk_shift then
begin
epos:=sendmessage(memo1.handle,em_lineindex,memo1.SelStart,0);
if spos<epos then
showmessage('right')
else
showmessage('left');
end;
end;
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=vk_shift then
spos:=sendmessage(memo1.handle,em_lineindex,memo1.SelStart,0);
end
搞定,你试一试,符合要求就给
Shift: TShiftState);
begin
if key=vk_shift then
begin
epos:=sendmessage(memo1.handle,em_lineindex,memo1.SelStart,0);
if spos<epos then
showmessage('right')
else
showmessage('left');
end;
end;
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=vk_shift then
spos:=sendmessage(memo1.handle,em_lineindex,memo1.SelStart,0);
end
搞定,你试一试,符合要求就给
#2
不好意思,给丢了一段
另外,lpos,spos,epos都是全局变量
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
lpos:=sendmessage(memo1.handle,em_linefromchar,memo1.SelStart,0);
end;
另外,lpos,spos,epos都是全局变量
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
lpos:=sendmessage(memo1.handle,em_linefromchar,memo1.SelStart,0);
end;
#3
那么我是用鼠标选择的哪?
#4
我刚写了一个,你看看
var
i: integer;
T: integer;
begin
T:=0;
for i:=0 to memo1.CaretPos.Y-1 do
begin
T:=T+Length(MEmo1.Lines[i])+1;
end;
T:=T+memo1.CaretPos.X+1;
if T=Memo1.SelStart then showmessage('left') else
if T=Memo1.SelStart+memo1.SelLength then showmessage('Right');
end;
var
i: integer;
T: integer;
begin
T:=0;
for i:=0 to memo1.CaretPos.Y-1 do
begin
T:=T+Length(MEmo1.Lines[i])+1;
end;
T:=T+memo1.CaretPos.X+1;
if T=Memo1.SelStart then showmessage('left') else
if T=Memo1.SelStart+memo1.SelLength then showmessage('Right');
end;
#5
If Memo1.CaretPos.x>Memo1.SelStart then showmessage('Right') else showmessage('Left');
#6
刚才测试了一下,如果MEMO中选择了多行,那么再加上一个小小的条件就可以了:
If Memo1.CaretPos.x+Memo1.SelLength>Memo1.SelStart then showmessage('Right') else showmessage('Left');
If Memo1.CaretPos.x+Memo1.SelLength>Memo1.SelStart then showmessage('Right') else showmessage('Left');
#7
不行阿!
Memo1.CaretPos.x我这为什么不是当前光标的横坐标哪?
例如我只有一行字符,选择第3,4个字符,
光标在第三个字符前面,
用Memo1.CaretPos.x得到的是4,???
Memo1.CaretPos.x我这为什么不是当前光标的横坐标哪?
例如我只有一行字符,选择第3,4个字符,
光标在第三个字符前面,
用Memo1.CaretPos.x得到的是4,???
#8
急用!请大家帮忙了!
#9
我的代码不行吗?你试了没有,我试了,怎么就可以
#10
对不起,好象是不行,我在看看。
#11
我测试过了,得到的结果都是'Right',我单步调试了
就是Memo1.CaretPos.x的问题因为他始终=(SelEnd)选择内容的最后位置
就是Memo1.CaretPos.x的问题因为他始终=(SelEnd)选择内容的最后位置
#12
其实这个问题比较复杂!因为还涉及字体的问题!
#13
你是过我的程序了吗??
我是调试后发上来的
我是调试后发上来的
#14
to naughtyboy(淘气男孩) :
你的程序我也调试了,总是'left'
可我也得用鼠标选择阿!
你的程序我也调试了,总是'left'
可我也得用鼠标选择阿!
#15
如果要确定光标的位置:
如果在SelText的左边,memo1.Lines.Text[memo1.SelStart]则是memo1.SelText的起始字符,否则memo1.Lines.Text[memo1.SelStart-1]则是memo1.SelText的结束字符。
如果想确定光标所在地行列,则这样写:
function GetRow(memo: TMemo): Longint;
begin
Result := memo.Perform(EM_LINEFROMCHAR, -1, 0);
end;
function GetColumn(memo: TMemo): Longint;
begin
Result := memo.SelStart - memo.Perform(EM_LINEINDEX, -1, 0);
end;
如果在SelText的左边,memo1.Lines.Text[memo1.SelStart]则是memo1.SelText的起始字符,否则memo1.Lines.Text[memo1.SelStart-1]则是memo1.SelText的结束字符。
如果想确定光标所在地行列,则这样写:
function GetRow(memo: TMemo): Longint;
begin
Result := memo.Perform(EM_LINEFROMCHAR, -1, 0);
end;
function GetColumn(memo: TMemo): Longint;
begin
Result := memo.SelStart - memo.Perform(EM_LINEINDEX, -1, 0);
end;
#16
to chechy(我爱洁洁)
谢谢你的解答,但是我的问题还没有解决:
判断两边的字符不行:
当两边的字符都是一样的就判断不准了!!!!
function GetColumn(memo: TMemo): Longint;
begin
Result := memo.SelStart - memo.Perform(EM_LINEINDEX, -1, 0);
end;
memo.Perform(EM_LINEINDEX, -1, 0); 返回的结果是光标前n行的字符数之和
当选择多行内容时GetColumn返回值就 <0 了
最终还是得不到正确的结果!!!
谢谢你的解答,但是我的问题还没有解决:
判断两边的字符不行:
当两边的字符都是一样的就判断不准了!!!!
function GetColumn(memo: TMemo): Longint;
begin
Result := memo.SelStart - memo.Perform(EM_LINEINDEX, -1, 0);
end;
memo.Perform(EM_LINEINDEX, -1, 0); 返回的结果是光标前n行的字符数之和
当选择多行内容时GetColumn返回值就 <0 了
最终还是得不到正确的结果!!!
#17
这个问题我还没有解决
希望大家能帮帮忙!!
先谢谢了!!!!!!
希望大家能帮帮忙!!
先谢谢了!!!!!!
#18
这个问题我还没有解决
希望大家帮帮忙!!!
希望大家帮帮忙!!!