Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 강좌/문서
Delphi Programming Tutorial&Documents
[118] Edit 컨트롤(TEdit, TDbEdit)의 Enabled:= False 보완하기
이경환.단디 [lncsoft] 8272 읽음    2007-03-30 00:04
일반적으로 TEdit나 TDBEdit 같은 컨트롤들을 쓰면서, 사용자가 입력하는 것을 막으려면 Enabled 속성을 False 로 주거나 혹은, ReadOnly 속성을 True 로 주게 됩니다.

물론, 그렇게 사용해도 상관은 없지만, Enabled 속성을 False로 해 놓으면 회색빛으로 보기가 별로 안 좋고, 내용자체를 복사 따위의 용도로 선택이 불가능 합니다.

또한, ReadOnly를 True로 해 놓으면 커서가 계속 깜박이게 되므로, 사용자들이 무심코 먼가 입력을 하려한다는 문제가 있습니다.

그런데, html코드에서 input type=text 의 태그에 대하여 readonly 속성을 readonly로 해 놓으면, 인터넷 익스플로러에서 커서는 안 보이지만, 사용자 선택이 가능합니다.

html의 readonly 속성의 작동 방식을 델파이에서도 사용할 수 있는 예제입니다.

추신)김태선님이 C++ 빌더로 포팅해 주셨습니다. 아래의 주소에서 보실 수 있습니다.
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tutorial&no=123

이하, 소스 나갑니다.

// 선언부
interface
....

type
TExEdit = class(TEdit)
private
protected
   procedure CreateParams(var Params: TCreateParams); override;
   procedure DoEnter; override;
   procedure DoExit; override;
   procedure Change; override;
   procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
     X, Y: Integer); override;
   procedure EMSETREADONLY(var Msg: TMessage); message EM_SETREADONLY;
public
end;

// 이 소스를 다른 파일의 TEdit 컨트롤에 일관되게 적용하려면 아래 주석을 해제하고,
// 해당 유닛의 인터페이스 선언부의 uses 절의 뒷 부분에 이 유닛의 참조를 넣어두면 됩니다.
//  TEdit = class(TExEdit);



// 구현부
procedure TExEdit.Change;
begin
inherited Change;
if ReadOnly then
   CreateCaret(Handle, 0, 0, 0);
end;

procedure TExEdit.DoEnter;
begin
inherited DoEnter;
if ReadOnly then
   CreateCaret(Handle, 0, 0, 0);
end;

procedure TExEdit.DoExit;
begin
inherited DoExit;
   CreateCaret(Handle, 1, 1, 1);
end;

// 이 부분은 마우스로 내용을 드래그할 때 캐럿이 생기는 것을 막습니다.
procedure TExEdit.MouseUp(Button: TMouseButton; Shift: TShiftState;
     X, Y: Integer);
begin
inherited MouseUp(Button, Shift, X, Y);
if ReadOnly then
   CreateCaret(Handle, 0, 0, 0);
end;

// ReadOnly 속성이 변경되었을 때...
// ReadOnly 속성이 바뀔 때 마다 vcl에서 em_setreadonly라는 메세지를 핑핑~ 날려줍니다.
// em_ 으로 시작하는 메세지들을 잘 보면, 윈도우 자체 메세지와 별도로 vcl에서 많은 메세지들을 보내줍니다.
// 언제 어떤 메세지들을 보내는지 잘 보면, 경우에 따라 많은 도움이 될 것입니다.
procedure TExEdit.EMSETREADONLY(var Msg: TMessage);
begin
// ReadOnly 일때는 Tab 키로 포커스를 받지 못하게 합니다.
TabStop:= not ReadOnly;
// 이 아래 코드는 용도에 맞게 고쳐 쓰세요~
if ReadOnly then
// ReadOnly = true 이면 노란색 배경.
   Color:= clYellow
else
// ReadOnly = false 이면 기본 색.
   Color:= clWindow;
end;

// 컴퍼넌트가 로딩될 때 초기화
// CreateParams에서 적용하지 않고 Create에서 적용하면 반영이 되질 않습니다.
procedure TExEdit.CreateParams(var Params: TCreateParams);
begin
// ReadOnly 일때는 Tab 키로 포커스를 받지 못하게 합니다.
inherited CreateParams(Params);
TabStop:= not ReadOnly;
// 이 아래 코드는 용도에 맞게 고쳐 쓰세요~
if ReadOnly then
   Color:= clYellow
else
   Color:= clWindow;
end;

조금 응용하시면, TDbEdit나 TMemo, TDbMemo에서도 사용이 가능합니다.

+ -

관련 글 리스트
118 Edit 컨트롤(TEdit, TDbEdit)의 Enabled:= False 보완하기 이경환.단디 8272 2007/03/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.