可能有些不好理解。
假如Edit1中有“123456xxyy”这么多个字符,由于Edit1宽度不够,现在只能显示123456这几个字符,xxyy被隐藏了,显示不出来。但这是假的隐藏,因为把鼠标点进Edit1中往右一拉,xxyy还是能够显示出来。
我现在的意思就是:无论是往右拉鼠标,还是用方向键往右移动光标,yy就是显示不出来,让yy真正隐藏起来,但是xx能显示出来。这就是真正隐藏Edit中的部分字符。
现在只能做到让xxyy都真正隐藏起来。
希望高手能指点,先谢谢!!!
假如Edit1中有“123456xxyy”这么多个字符,由于Edit1宽度不够,现在只能显示123456这几个字符,xxyy被隐藏了,显示不出来。但这是假的隐藏,因为把鼠标点进Edit1中往右一拉,xxyy还是能够显示出来。
我现在的意思就是:无论是往右拉鼠标,还是用方向键往右移动光标,yy就是显示不出来,让yy真正隐藏起来,但是xx能显示出来。这就是真正隐藏Edit中的部分字符。
现在只能做到让xxyy都真正隐藏起来。
希望高手能指点,先谢谢!!!
procedure TForm1.btn1Click(Sender: TObject);
var
orgStr, newStr: string;
begin
orgStr := '123456xxyy';
// 你自己的字符串截断逻辑,比如
// 按指定字符截断
newStr := StringReplace(orgStr, 'yy', '', [rfReplaceAll, rfIgnoreCase]);
// 或按指定字符数截断
Delete(orgStr, 9, 2); edt1.Text := orgStr; // 123456xx
edt2.Text := newStr; // 123456xx
end;
你还想在读取edit1的值时是‘是'123456xxyy’,虽然edit1显示的是'123456xx'
那就edit显示一个截断后的字串,而对edit取时转而去另一个保存'123456xxyy'的变量
var
orgStr:string = '123456xxyy';// 截断字串显示到edit1
procedure TForm1.btn1Click(Sender: TObject);
var
newStr: string;
begin
newStr := StringReplace(orgStr, 'yy', '', [rfReplaceAll, rfIgnoreCase]);
edt1.Text := orgStr; // 123456xx
end;// 取edit1的text时转从orgStr中取
procedure TForm1.btn9999Click(Sender: TObject);
var
newStr: string;
begin
newStr := orgStr;
ShowMessage(newStr); // 123456xxyy
end;
不要随便用什么“奇葩”这样的词,我是有实际需要的。
不论怎样,不管你是截断字符串还是隐藏部分字符串,把字符串不显示的部分过滤除去都是必须经过的步骤。而把'123456xx'显示到edit1的text中
或是显示'123456xxyy'到edit1.text中再隐藏'yy'
处理的过程都是一样的
或者你可以用combobox来做
把combobox的style设为csSimple,这样它看起来就跟edit一样
procedure TForm1.FormCreate(Sender: TObject);
var
orgStr: string;
begin
orgStr := '123456xxyy';
cbb1.Style := csSimple;
// 显示的字串'123456xx' , 完整的字串在 cbb1.Items.Objects[0]
cbb1.AddItem('123456xx', TObject(orgStr));
cbb1.ItemIndex := 0;
end;// 取值
procedure TForm1.btn1Click(Sender: TObject);
var
newStr: string;
begin
newStr := string(cbb1.Items.Objects[0]);
ShowMessage(newStr); // 123456xxyy
end;
//Edit1.Width := 52;
//Edit1.Text := '123456xxyy';
const
MAX_CHARPOS=8;procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
with TEdit(Sender) do
if ((Key = VK_RIGHT) and ((SelStart+SelLength >= MAX_CHARPOS) or (ssCtrl in Shift)))
or (Key = VK_END) then
begin
Key := 0;
if ssShift in Shift then
SelLength := MAX_CHARPOS-SelStart
else
SelStart := MAX_CHARPOS
end
end;procedure TForm1.Edit1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
with TEdit(Sender) do
if SelStart+SelLength > MAX_CHARPOS then
begin
SelStart := 0;
SelLength := MAX_CHARPOS;
end
end;procedure TForm1.Edit1ContextPopup(Sender: TObject; MousePos: TPoint;
var Handled: Boolean);
begin
with TEdit(Sender) do
if SelStart+SelLength > MAX_CHARPOS then
begin
SelStart := 0;
SelLength := MAX_CHARPOS;
end
end;procedure TForm1.Edit1DblClick(Sender: TObject);
begin
with TEdit(Sender) do
begin
SelStart := 0;
SelLength := MAX_CHARPOS
end;
end;
但试了试还是没达到我的要求:
1、yy没有真正隐藏。有个笨办法:在yy前加6个空格就可以隐藏yy,但往右一拉鼠标易造成Edit为空。
2、SelStart := 0;
SelLength := MAX_CHARPOS;
这两句在DblClick事件中是非常对的,但用在其它事件中我觉得不妥。万一人家想选择“56xx”怎么办?我的目的:
我想在Edit中保存姓名和人员编号,但只显示姓名(空间有限只能显示3个字)。4个字的名字往右拉拉鼠标(移移光标)也可以显示第4个字。
在YY前加一个CHR(13)如何,但保存时也需要去掉。
往右一拉鼠标易造成Edit为空,已经被OnMouseMove事件的代码解决了!要选56xx很容易,就是用鼠标从5往右拉到x或者从x往左拉到5!看了你的目的真让人无语。当遇到很棘手的技术难题,就要考虑你当初的设计是不是有缺陷了。
1、edit要“装着”姓名 和 编号,但是编号不能显示出来。
2、edit只显示姓名,编号不要显示。如果是第一种要求,应该很难。除非你做一个edit1 “装”姓名,一个edit2 “装” 编号,但edit2的visible := false ;
如果是第二种要求,只要把编号截掉就行了。