2016-06-01 15 views
0

암호에 대해 폼에 TEdit 컨트롤을 배치했습니다. 내 목표는 TEdit 컨트롤이 포커스가 맞지 않을 때 별표를 표시하도록하고, 다른 사람들이 그것을 보지 못하게하고, 포커스가있을 때 편집을 허용하도록 암호를 표시하는 것입니다.TEdit.onEnter 이벤트에서 TEdit.PasswordChar 속성을 설정하면 TEdit에서 Delphi XE seattle의 선택 및 커서를 표시 할 수 없습니다.

이 작업을 수행하기 위해 OnEnter 및 OnExit 처리기를 추가하여 PasswordChar 속성을 # 0 및 '*'로 설정했습니다.

이것은 델파이 7에서 잘 작동했지만 델파이 XE seattle에서 잘못 처리되었습니다. TEdit 컨트롤은 깜박이는 편집 커서 나 OnEnter 이벤트가 발생한 후 강조 표시된 파란색 배경 선택을 표시하지 않는 이상한 상태가되었습니다. PasswordChar가 # 0으로 설정된).

디버그 모드에서 TEdit 컨트롤 소스 코드를 밟았으며 PasswordChar를 설정할 때 TEdit 컨트롤이 일부 핸들 (Windows API를 많이 알지 못함)을 다시 만듭니다. 나는 이것이 문제를 일으켰지 만 확실하지는 않으며 그것을 피하는 방법을 모른다.

제발 도와주세요, 나는 많은 시도를했지만 길을 찾지 못했습니다.

type 
    TTestForm = class(TForm) 
    Edit1: TEdit; 
    Edit2: TEdit; 
    procedure Edit1Enter(Sender: TObject); 
    procedure Edit1Exit(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    TestForm: TTestForm; 

implementation 

{$R *.dfm} 

procedure TTestForm.Edit1Enter(Sender: TObject); 
begin 
    Edit1.PasswordChar := #0; 
end; 

procedure TTestForm.Edit1Exit(Sender: TObject); 
begin 
    Edit1.PasswordChar := '*'; 
end; 

end. 

DFM : EM_SETPASSWORDCHAR 메시지

object TestForm: TTestForm 
    Left = 0 
    Top = 0 
    Caption = 'TestForm' 
    ClientHeight = 242 
    ClientWidth = 472 
    Color = clBtnFace 
    Font.Charset = DEFAULT_CHARSET 
    Font.Color = clWindowText 
    Font.Height = -11 
    Font.Name = 'Tahoma' 
    Font.Style = [] 
    OldCreateOrder = False 
    PixelsPerInch = 96 
    TextHeight = 13 
    object Edit1: TEdit 
    Left = 72 
    Top = 48 
    Width = 225 
    Height = 21 
    PasswordChar = '*' 
    TabOrder = 0 
    Text = 'You can not see text selection' 
    OnEnter = Edit1Enter 
    OnExit = Edit1Exit 
    end 
    object Edit2: TEdit 
    Left = 72 
    Top = 75 
    Width = 225 
    Height = 21 
    TabOrder = 1 
    Text = 'Click this control to trigger TEdit1.OnExit' 
    end 
end 

답변

1

당신은 지울 수 ES_PASSWORD 스타일 여기

는 간단한 테스트 프로그램입니다. 이것은 정상 상태에서 편집을 유지합니다. 그러나 OnExit에서 창을 다시 만들려면 passwordchar를 두 번 설정해야합니다. 또는 해킹 컨트롤을 사용하여 RecreateWnd 프로 시저에 액세스 할 수 있습니다 (창을 두 번 만들지 않으므로).

procedure TTestForm.Edit1Enter(Sender: TObject); 
begin 
    SendMessage(Edit1.Handle, EM_SETPASSWORDCHAR, 0, 0); 
end; 

procedure TTestForm.Edit1Exit(Sender: TObject); 
begin 
    Edit1.PasswordChar := #0; 
    Edit1.PasswordChar := '*'; 
end; 
+0

감사합니다. J.Pelttari. 코드는 매력처럼 작동합니다! 그리고 당신은 그 메커니즘을 잘 설명했습니다. 너 정말 멋지다! 다시 감사합니다! –

+1

왜''OnExit'에서''SendMessage (Edit1.Handle, EM_SETPASSWORDCHAR, Ord ('*'), 0)'를하지 않으시겠습니까? –

+0

암호 메쏘드'SendMessage (Edit1.Handle, EM_SETPASSWORDCHAR, Ord ('*'), 0)'로 암호 char을 설정하면 암호 마스크에 해당 문자 (*)가 사용됩니다. AFAIK ES_PASSWORD 스타일은 Comctl32.dll ver 6 편집 컨트롤에 검은 색 원을 암호 마스크로 표시하는 데 필요한 모든 것입니다. –