我正在使用一个带有2个BitBtns和2个TEdits的Delphi XE2项目。两个TEdits都包含秘密数据,因此我隐藏了内容。我的要求是在BitBtn1点击之后将TEdit1的内容复制到剪贴板,对于TEdit2也是如此。这是我的示例代码: 单位Unit1;
http://stackoverflow.com/a/16910191/2511206
OR
http://stackoverflow.com/a/26749685/2511206
但问题如下:
1.如果设置了interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Clipbrd;
type
TMainForm = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
BitBtn5: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.BitBtn1Click(Sender: TObject);
begin
Edit1.PasswordChar := #0;
Clipboard.Clear;
Edit1.CopyToClipboard;
Edit1.PasswordChar := '*';
end;
procedure TMainForm.BitBtn2Click(Sender: TObject);
begin
Edit2.PasswordChar := #0;
Clipboard.Clear;
Edit2.CopyToClipboard;
Edit2.PasswordChar := '*';
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
Edit1.Text := 'User Name';
Edit1.PasswordChar := '*';
Edit2.Text := 'Password';
Edit2.PasswordChar := '*';
end;
end.
,则无法将内容复制到剪贴板
2.如果我编译了示例代码,PasswordChar := '*';
单击TEdit1
后将内容复制到剪贴板,但BitBtn1
单击TEdit2
后内容未复制到剪贴板,尽管第一次操作(BitBtn2
)成功执行
3.如果我双击Clipboard.Clear;
,然后点击TEdit2
现在BitBtn2
内容将被复制到剪贴板。
我不知道为什么会这样发生?
答案 0 :(得分:1)
如果要将文本放在剪贴板中,请按以下步骤操作:
Clipboard.AsText := SecretEdit.Text;
或
Clipboard.AsText := SecretEdit.SelText;
控件的默认行为是阻止复制到剪贴板的原因是,如果您离开计算机而没有意识到您在剪贴板上以明文形式留下密码以供恶意攻击者窃取。您应该考虑是否要将此风险与应用程序的用户一起承担。
答案 1 :(得分:0)
如果未选择任何文本,则CopyToClipboard不执行任何操作。 使用此:
procedure TMainForm.BitBtn2Click(Sender: TObject);
begin
Edit2.SetFocus;
Edit2.PasswordChar := #0;
Clipboard.Clear;
Edit2.CopyToClipboard;
Edit2.PasswordChar := '*';
end;
procedure TMainForm.BitBtn1Click(Sender: TObject);
begin
Edit1.SetFocus;
Edit1.PasswordChar := #0;
Clipboard.Clear;
Edit1.CopyToClipboard;
Edit1.PasswordChar := '*';
end;