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

델파이 Q&A
Delphi Programming Q&A
[6339] [답변] SAMDOO/ 우와 델파이 증말 어렵따.
착한나무 [ ] 1083 읽음    1999-06-28 12:46

   먼저 많은 노력을 하시는 것을 보니 같은 델피언으로 방갑습니다.
   제가 보기엔 컴포넌트 제작쪽을 파시는 것이 많은 도움이 될꺼 같네요..

   질문중 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.


+ -

관련 글 리스트
6339 [답변] SAMDOO/ 우와 델파이 증말 어렵따. 착한나무 1083 1999/06/28
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.