일반적으로 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에서도 사용이 가능합니다.