기왕 봐주신 김에 이것도 좀 봐주세요.
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.
|