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
[6334] >질문< 우와 델파이 증말 어렵따.
samdoo [ ] 922 읽음    1999-06-25 12:02
기왕 봐주신 김에 이것도 좀 봐주세요.
canvas가 뭔지 몰라 써보긴 했는데 에러가 나서요.
아마 parent.canvas나 parentform.canvas정도 로 써야 할것 같은데 그런건 없다고 하니 도데체 어떻게 해야 할지...
그리고 selstart에서는 왜 에러가 나는지
function은 왜 덩달아서 에러가 나는지?
증말 에러투성이 입니다.

참 이건 edit를 고쳐서 숫자를 입력하도록 만든겁니다.
포커스가 나갈때 천단위에서 콤마찍어주고 오른쪽정렬해주고
포커스가 들어오면 다시 콤마없애고
입력하는동안 숫자가 아닌 다른글자가 들어오면 입력을 받지 않도록하는겁니다.
문자마다 크기가 다르다보니 재대로 되진 않지만 그런대로 쓸만 합니다.
물론 되기만 하면...

자료실에 있는건 pas가 없어서 안된다더군요. 아마 버젼이 달라서 그런가봐요.

아래엔 소스입니다.

unit Edit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;
{-------------------------------------------------------------------------}
Function MaskToNum(IStr: String): String;
{-------------------------------------------------------------------------}
type
  TEdit1 = class(TEdit)
  private
     Procedure Enter;  Override;
     Procedure Change; Override;
     Procedure Exit;   Override;
  protected
  public
  published
     Property OnEnter;
     Property OnChange;
     Property OnExit;
  end;
{-------------------------------------------------------------------------}
procedure Register;

implementation

{-------------------------------------------------------------------------}
procedure Register;
Begin
  RegisterComponents('Samples', [TEdit1]);
End;

{-------------------------------------------------------------------------}
procedure TEdit1.Enter;
Var S: String;
begin
     Inherited Enter;
     Text := MaskToNum(Text); // 문자열에서 숫자가 아닌 문자를 제거한다.
end;
{-------------------------------------------------------------------------}
procedure Edit1.Change;
Var
   InStr:   String;
   InNum:   Double;
   ErrPos, CursorPos:  Integer;
Begin
   Inherited Change;
   InNum  := 0;
   ErrPos := 0;
   InStr := Text;
   If InStr <> '' Then
   Begin
       Val(InStr, InNum, ErrPos);    //입력한 문자를 숫자로 바꿔본다.
       If  ErrPos > 0 Then           //이때 에러가 있으면
       Begin
           CursorPos := SelStart;    //커서의 위치를 미리 저장한다.<== 에러
           Delete(InStr, ErrPos, 1); //에러위치의 문자를 제거한다.
           Text      := In Str;      //에러를 제거한 문자열(숫자)를 돌려놓는다           SelStart  := CursorPos - 1; // 커서의 위치를 본래의 위치로 <== 에러
       End;
   End;
end;

{-------------------------------------------------------------------------}
procedure TEdit1.Exit;
Var InStr: String;
begin
    Inherited Exit;
    InStr := Trim(Text);             //입력한 문자열을 InStr에 저장
    If InStr = '' Then InStr := '0'; //InStr이 ''이면 '0'으로 바꾼다.
    InStr := FormatFloat('#,##0.00', StrToFloat(InStr)); //InStr을 #,##0.00형으로
    //문자열의 앞에 Edit의 크기만큼' '를 추가함으로써 오른쪽정렬 <==== 에러
    While Canvas.TextWidth(InStr) < Width Do
          InStr := ' ' + InStr;
    Delete(InStr,1,3);               //우측정렬을 한후 약간의 여백을 준다.
    Text := InStr;
End;

{--------- 도데체 이 펑션은 왜 에러지? 위치가 잘못되ㅆ나? ----------------}
Function MaskToNum(IStr: String): String;
Var
    INum : Double;
    ErrPos : Integer;
Begin
    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;
    Result := Istr;
End;

end.


+ -

관련 글 리스트
6334 >질문< 우와 델파이 증말 어렵따. samdoo 922 1999/06/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.