먼저 많은 노력을 하시는 것을 보니 같은 델피언으로 방갑습니다.
제가 보기엔 컴포넌트 제작쪽을 파시는 것이 많은 도움이 될꺼 같네요..
질문중 Canvas 에 대해서 말씀하셨는데,
Canvas 는 화면에 그래픽을 그릴수 있는 객쳅니다.
글자, 선, 비트맵.. 등 표현이 다양하죠..
이것은 TWinControl 쪽으로 파생된 곳에서는 쓸 수 없습니다.
정확히 말하면 없어서 못습니다. 쓸려면 Canvas 객체를 만들고,
Device Context (DC) 와 연결시켜 줘야 합니다.
쓸수 있는 곳은 TGraphicControl 에서 파생된 Shape ...등에서만
쓸수 있습니다.
다행이 TCustomControl = TWinControl + Canvas 라는 객체가 있어
여기서 파생해서 쓰면 됩니다.
그러나 지금 만들고자 하는 숫자 입력기는 안쓰고도 해결이 되어서..
일반적으로 컴포넌트를 만들려면,
1. 객체 생성, 소멸 처리
2. 이미 만들어진 것은 최대한 활용 (Override)
3. 없는것은 만들기..
라는 과정이 필요하죠
소스에 이 부분이 추가 되야 합니다.
constructor THjunEdit.Create (AOwner: TComponent);
begin
inherited Create (AOwner);
end;
숫자만 입력받기 위해서
procedure THjunEdit.KeyPress(var Key: Char);
begin
if not (Key in ['0'..'9', #8]) then
Key := #0; // #8은 back space
end;
오른쪽 정렬을 위해선,
윈도우를 생성하기 전에 모양을 결정하기위해
CreateParams 함수를 호출하는데, 그것을 Override하면 됩니다.
아래처럼요..
procedure THjunEdit.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams (Params);
with Params do
ExStyle := ExStyle or WS_EX_RIGHT; // 오른쪽 정렬..
end;
마지막으로 Enter -> DoEnter
Exit -> DoExit
Change -> X
published 부분은 전체 없애면 됩니다.
제가 고친 소스는 정수형만 되고 (소수점 안 됨)
자리수도 약 10자리만 입력이 가능합니다.
도움이 되셨나 모르겠군요..
그럼..
--- 소스는 다음과 같습니다. ---
unit HjunEdit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
THjunEdit = class(TEdit)
public
constructor Create (AOwner: TComponent); override;
procedure CreateParams(var Params: TCreateParams); override;
procedure KeyPress(var Key: Char); override;
procedure DoEnter; override;
procedure DoExit; override;
end;
procedure Register;
Function MaskToNum(IStr: String): String;
implementation
procedure Register;
begin
RegisterComponents('Sample', [THjunEdit]);
end;
procedure THjunEdit.DoEnter;
begin
Inherited;
Text := MaskToNum(Text); // 문자열에서 숫자가 아닌 문자를 제거한다.
Perform (WM_KEYDOWN, VK_END, 0); // 키보드로 움직일땐 항상 맨뒤..
end;
procedure THjunEdit.DoExit;
Var InStr: String;
begin
inherited;
InStr := Trim(Text); //입력한 문자열을 InStr에 저장
If InStr = '' Then InStr := '0'; //InStr이 ''이면 '0'으로 바꾼다.
// integer, Float 형으로 되어 있으면, 42억 밖에 입력이 안된다..
// 소수점은 처리하지 않았음..
InStr := FormatFloat('#,###', StrToFloat(InStr));
Text := InStr;
end;
procedure THjunEdit.KeyPress(var Key: Char);
begin
//inherited;
// 숫자 이외는 입력이 안되도록 함..
if not (Key in ['0'..'9', #8]) then
Key := #0;
end;
Function MaskToNum (IStr: String): String;
Var INum : integer;
ErrPos : Integer;
Begin
Result := '0'; // 일종의 보험..^^
IStr := Trim (IStr);
If Istr <> '' Then
Begin
Val (IStr, INum, ErrPos);
While ErrPos <> 0 do
Begin
Delete (IStr,ErrPos,1);
Val (IStr, INum, ErrPos);
// 이곳도 정수이므로 문제가 다소 있다..
End;
End;
if INum > -1 then
Result := Istr;
End;
////////////////////////////////////////////////////////////////////////////////
constructor THjunEdit.Create (AOwner: TComponent);
begin
inherited Create (AOwner);
end;
procedure THjunEdit.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams (Params);
with Params do
ExStyle := ExStyle or WS_EX_RIGHT; // 오른쪽 정렬..
end;
end.
|