2012-01-13 5 views
1

파일 경로를 지정하는 데 사용하는 TEdit 상자가 두 개 있습니다. 하나는 UNC 경로 용이고 다른 하나는 로컬 경로 용입니다. 그러나 사용자가 하나의 상자에만 텍스트를 입력 할 수 있으면 좋습니다. 한 상자에 텍스트를 입력하면 다른 상자를 지워야합니다. 어떻게해야합니까? 또한 OnEnter, OnChange 또는 다른 방법을 사용해야하는지 잘 모르겠습니다.두 개의 TEdit을 독점적으로 만들기

+1

에 모두 편집 상자 후크 수'당신이 조사해야 할 이벤트가 OnExit', 나는 생각한다. – Pateman

+6

아마도 'OnChange'가 작동 할 것입니다. 나는 두 개의 추가 라디오 버튼을 제공하고 사용자가 하나를 선택하도록 강제 할 것이다. –

+1

나는 Sertac과 함께있다. 하나의 TEdit, 두 개의 라디오 버튼. btw, 그것은 UNC와 로컬 경로의 차이점입니까? – kobik

답변

2

매우 간단하게 처리 할 수 ​​있습니다. 하나의 OnChange 핸들러를 생성하고 Object Inspector의 Events 탭을 사용하여 두 TEdits에 할당합니다. 그런 다음 다음과 같은 것을 사용할 수 있습니다 :

procedure TForm1.EditChanged(Sender: TObject); //Sender is the edit being changed 
begin 
    if Sender = UNCEdit then // If it's is the UNCEdit being changed 
    begin 
    LocalPathEdit.OnChange := nil;   // Prevent recursive calling! 
    LocalPathEdit.Text := '';     // Clear the text 
    LocalPathEdit.OnChange := EditChanged; // Restore the event handler 
    end; 
    else 
    begin 
    UNCEdit.OnChange := nil; 
    UNCEdit.Text := ''; 
    UNCEdit.OnChange := EditChanged; 
    end; 
end; 

이것은 다소 간소화 될 수 있지만 다른 사람들에게는 읽기 쉽지 않습니다. 또한 try..finally로 보호 할 수도 있지만 편집 내용을 지우는 것은 실제로 필요하지 않습니다.

procedure TForm1.EditChanged(Sender: TObject); 
var 
    TmpEdit: TEdit; 
begin 
    if Sender = UNCEdit then 
    TmpEdit := LocalPathEdit 
    else 
    TmpEdit := UNCEdit; 
    TmpEdit.OnChange := nil; 
    try 
    TmpEdit.Text := ''; 
    finally 
    TmpEdit.OnChange := EditChanged; 
    end; 
end; 
+0

D7에서'Text' 속성을 설정하면 noet 트리거가'OnChange' 이벤트를 발생 시키므로 재귀 방지 기능을 사용할 수 없습니다. 'Edit.Clear'는 OnChange를 트리거합니다! – NGLN

+0

제대로 기억하고 있다면 델파이로 불리는 몇 가지 버전이 있습니다. (잘못 생각할 수도 있습니다.) 그것은 경우에 대비하여 재발하지 않도록하기 위해 아무런 상처를주지 않습니다. :) 이벤트 처리기를 지우거나 복원하는 데 오버 헤드가 없습니다. –

1

두 개의 입력란을 유지하려면이 방법을 사용하십시오.

procedure TForm1.Edit1Exit(Sender: TObject); 
begin 
    if (Edit1.text <> '') then 
    Edit2.text:= ''; 
end; 

procedure TForm1.Edit2Exit(Sender: TObject); 
begin 
    if (Edit2.text <> '') then 
    Edit1.text:= ''; 
end; 

사용자가 필드를 탭하여 실수로 값을 지우지 않도록 값 확인을 원합니다.

0

다음과 같은 KeyPress 이벤트

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); 
begin 
    If Sender = Edit1 then 
    Edit2.clear 
    else 
    if Sender = Edit2 then 
    Edit1.clear; 
end; 
+1

타입 변환이 필요하지 않습니다. 두 개의 TObject 포인터의 주소를 비교할 때'Sender = Edit1'의 평등이 제대로 작동합니다. –

+0

좋은 캐치, 고정. –

관련 문제