Segundo Componente Visual
Este componente será usado para receber e validar CNPJ e CPF. Assim como o TMaskEdit nosso componente terá uma mascara de edição.
Novamente repita todos os procedimentos do primeiro componente criado mudando apenas as opções abaixo:
Ancestor Component: TCustomMaskEdit
Class Name: TCNPJCPFEdit
Pallete Page: CursoDelphi
Unit File Name: CNPJCPFEdit.pas
Inclua o código abaixo:
01 |
unit CNPJCPFEdit; |
02 |
|
03 |
interface |
04 |
|
05 |
uses |
06 |
SysUtils, Classes, Controls, StdCtrls, Mask, Dialogs; |
07 |
|
08 |
type |
09 |
TTipoDoc = (tdCNPJ, tdCPF); |
10 |
|
11 |
TCNPJCPFEdit = class(TCustomMaskEdit) |
12 |
private |
13 |
{ Private declarations } |
14 |
procedure cmExit(var message: TCMExit); message cm_Exit; |
15 |
procedure ConfigEditMask; |
16 |
function CNPJ: Boolean; |
17 |
function CPF: Boolean; |
18 |
protected |
19 |
{ Protected declarations } |
20 |
public |
21 |
{ Public declarations } |
22 |
constructor Create(AOwner: TComponent); override; |
23 |
published |
24 |
{ Published declarations } |
25 |
property TipoDoc: TTipoDoc; |
26 |
property WidthCNPJ: Integer; |
27 |
property WidthCPF: Integer; |
28 |
property OnChange; |
29 |
property OnClick; |
30 |
property OnDblClick; |
31 |
property OnDragDrop; |
32 |
property OnDragOver; |
33 |
property OnEndDock; |
34 |
property OnEndDrag; |
35 |
property OnEnter; |
36 |
property OnExit; |
37 |
property OnKeyDown; |
38 |
property OnKeyPress; |
39 |
property OnKeyUp; |
40 |
property OnMouseDown; |
41 |
property OnMouseMove; |
42 |
property OnMouseUp; |
43 |
property OnStartDock; |
44 |
property OnStartDrag; |
45 |
end; |
46 |
|
47 |
procedure Register; |
48 |
|
49 |
implementation |
50 |
|
51 |
procedure Register; |
52 |
begin |
53 |
RegisterComponents('CursoDelphi', [TCNPJCPFEdit]); |
54 |
end; |
55 |
|
56 |
end. |
Pressione Ctrl+Shift+C e continue incluindo o código mostrado:
001 |
unit CNPJCPFEdit; |
002 |
|
003 |
interface |
004 |
|
005 |
uses |
006 |
SysUtils, Classes, Controls, StdCtrls, Mask, Dialogs; |
007 |
|
008 |
type |
009 |
TTipoDoc = (tdCNPJ, tdCPF); |
010 |
|
011 |
TCNPJCPFEdit = class(TCustomMaskEdit) |
012 |
private |
013 |
FWidthCNPJ: Integer; |
014 |
FWidthCPF: Integer; |
015 |
FTipoDoc: TipoDoc; |
016 |
procedure SetTipoDoc(const Value: TTipoDoc); |
017 |
procedure SetWidthCNPJ(const Value: Integer); |
018 |
procedure SetWidthCPF(const Value: Integer); |
019 |
{ Private declarations } |
020 |
procedure cmExit(var message: TCMExit); message cm_Exit; |
021 |
procedure ConfigEditMask; |
022 |
function CNPJ: Boolean; |
023 |
function CPF: Boolean; |
024 |
protected |
025 |
{ Protected declarations } |
026 |
public |
027 |
{ Public declarations } |
028 |
constructor Create(AOwner: TComponent); override; |
029 |
published |
030 |
{ Published declarations } |
031 |
property TipoDoc: TTipoDoc read FTipoDoc write SetTipoDoc; |
032 |
property WidthCNPJ: Integer read FWidthCNPJ write SetWidthCNPJ; |
033 |
property WidthCPF: Integer read FWidthCPF write SetWidthCPF; |
034 |
property OnChange; |
035 |
property OnClick; |
036 |
property OnDblClick; |
037 |
property OnDragDrop; |
038 |
property OnDragOver; |
039 |
property OnEndDock; |
040 |
property OnEndDrag; |
041 |
property OnEnter; |
042 |
property OnExit; |
043 |
property OnKeyDown; |
044 |
property OnKeyPress; |
045 |
property OnKeyUp; |
046 |
property OnMouseDown; |
047 |
property OnMouseMove; |
048 |
property OnMouseUp; |
049 |
property OnStartDock; |
050 |
property OnStartDrag; |
051 |
end; |
052 |
|
053 |
procedure Register; |
054 |
|
055 |
implementation |
056 |
|
057 |
procedure Register; |
058 |
begin |
059 |
RegisterComponents('CursoDelphi', [TCNPJCPFEdit]); |
060 |
end; |
061 |
|
062 |
{ TCNPJCPFEdit } |
063 |
|
064 |
procedure TCNPJCPFEdit.cmExit(var message: TCMExit); |
065 |
begin |
066 |
case Self.FTipoDoc of |
067 |
tdCNPJ:if not( CNPJ ) then Self.SetFocus; |
068 |
tdCPF:if not( CPF ) then Self.SetFocus; |
069 |
end; |
070 |
end; |
071 |
|
072 |
function TCNPJCPFEdit.CNPJ: Boolean; |
073 |
var |
074 |
n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, d1, d2: Integer; |
075 |
Num, Digitado, Calculado: string; |
076 |
begin |
077 |
Num := StringReplace(Self.Text, '.', '', [rfReplaceAll]); |
078 |
Num := StringReplace(Num, '-', '', [rfReplaceAll]); |
079 |
Num := StringReplace(Num, '/', '', [rfReplaceAll]); |
080 |
if ( Trim( Num ) = '' ) then |
081 |
begin |
082 |
Result := True; |
083 |
Exit; |
084 |
end; |
085 |
if ( Length( Num ) <> 14 ) then |
086 |
begin |
087 |
MessageDlg('CNPJ incompleto. Digite novamente.', |
088 |
mtError, [mbOk], 0 ); |
089 |
Result := False; |
090 |
Exit; |
091 |
end; |
092 |
n1 := StrToInt( Num[1] ); |
093 |
n2 := StrToInt( Num[2] ); |
094 |
n3 := StrToInt( Num[3] ); |
095 |
n4 := StrToInt( Num[4] ); |
096 |
n5 := StrToInt( Num[5] ); |
097 |
n6 := StrToInt( Num[6] ); |
098 |
n7 := StrToInt( Num[7] ); |
099 |
n8 := StrToInt( Num[8] ); |
100 |
n9 := StrToInt( Num[9] ); |
101 |
n10 := StrToInt( Num[10] ); |
102 |
n11 := StrToInt( Num[11] ); |
103 |
n12 := StrToInt( Num[12] ); |
104 |
d1 := n12*2+n11*3+n10*4+n9*5+n8*6+ |
105 |
n7*7+n6*8+n5*9+n4*2+n3*3+n2*4+n1*5; |
106 |
d1 := 11 - ( d1 mod 11 ); |
107 |
if ( d1 >= 10 ) then d1 := 0; |
108 |
d2 := d1*2+n12*3+n11*4+n10*5+n9*6+n8*7+ |
109 |
n7*8+n6*9+n5*2+n4*3+n3*4+n2*5+n1*6; |
110 |
d2 := 11 - ( d2 mod 11 ); |
111 |
if ( d2 >= 10 ) then d2 := 0; |
112 |
Calculado := IntToStr(d1) + IntToStr(d2); |
113 |
Digitado := Num[13] + Num[14]; |
114 |
if ( Calculado = Digitado ) then Result := True |
115 |
else |
116 |
begin |
117 |
MessageDlg('CNPJ inválido.', mtError, [mbOk], 0); |
118 |
Result := False; |
119 |
end; |
120 |
end; |
121 |
|
122 |
procedure TCNPJCPFEdit.ConfigEditMask; |
123 |
begin |
124 |
Self.Clear; |
125 |
case FTipoDoc of |
126 |
tdCNPJ: |
127 |
begin |
128 |
Self.EditMask := '!99.999.999/9999-99;1;_'; |
129 |
Self.Width := WidthCNPJ; |
130 |
end; |
131 |
tdCPF: |
132 |
begin |
133 |
Self.EditMask := '!999.999.999-99;1;_'; |
134 |
Self.Width := WidthCPF; |
135 |
end; |
136 |
end; |
137 |
end; |
138 |
|
139 |
function TCNPJCPFEdit.CPF: Boolean; |
140 |
var |
141 |
n1, n2, n3, n4, n5, n6, n7, n8, n9, d1, d2: Integer; |
142 |
Num, Digitado, Calculado: string; |
143 |
begin |
144 |
Num := StringReplace(Self.Text, '.', '', [rfReplaceAll]); |
145 |
Num := StringReplace(Num, '-', '', [rfReplaceAll]); |
146 |
if ( Trim( Num ) = '' ) then |
147 |
begin |
148 |
Result := True; |
149 |
Exit; |
150 |
end; |
151 |
if ( Length( Num ) <> 11 ) then |
152 |
begin |
153 |
MessageDlg('CPF incompleto. Digite novamente.', |
154 |
mtError, [mbOk], 0); |
155 |
Result := False; |
156 |
Exit; |
157 |
end; |
158 |
n1 := StrToInt( Num[1] ); |
159 |
n2 := StrToInt( Num[2] ); |
160 |
n3 := StrToInt( Num[3] ); |
161 |
n4 := StrToInt( Num[4] ); |
162 |
n5 := StrToInt( Num[5] ); |
163 |
n6 := StrToInt( Num[6] ); |
164 |
n7 := StrToInt( Num[7] ); |
165 |
n8 := StrToInt( Num[8] ); |
166 |
n9 := StrToInt( Num[9] ); |
167 |
d1 := n9*2+n8*3+n7*4+n6*5+n5*6+n4*7+n3*8+n2*9+n1*10; |
168 |
d1 := 11 - ( d1 mod 11 ); |
169 |
if ( d1 >= 10 ) then d1 := 0; |
170 |
d2 := d1*2+n9*3+n8*4+n7*5+n6*6+n5*7+n4*8+n3*9+n2*10+n1*11; |
171 |
d2 := 11 - ( d2 mod 11 ); |
172 |
if ( d2 >= 10 ) then d2 := 0; |
173 |
Calculado := IntToStr(d1) + IntToStr(d2); |
174 |
Digitado := Num[10] + Num[11]; |
175 |
if ( Calculado = Digitado ) then Result := True |
176 |
else |
177 |
begin |
178 |
MessageDlg('CPF inválido.', mtError, [mbOk], 0); |
179 |
Result := False; |
180 |
end; |
181 |
end; |
182 |
|
183 |
constructor TCNPJCPFEdit.Create(AOwner: TComponent); |
184 |
begin |
185 |
inherited; |
186 |
Self.FWidthCNPJ := 110; |
187 |
Self.FWidthCPF := 85; |
188 |
Self.FTipoDoc := tdCNPJ; |
189 |
Self.Width := WidthCNPJ; |
190 |
Self.Clear; |
191 |
Self.EditMask := '!99.999.999/9999-99;1;_'; |
192 |
end; |
193 |
|
194 |
procedure TCNPJCPFEdit.SetTipoDoc(const Value: TTipoDoc); |
195 |
begin |
196 |
FTipoDoc := Value; |
197 |
ConfigEditMask; |
198 |
end; |
199 |
|
200 |
procedure TCNPJCPFEdit.SetWidthCNPJ(const Value: Integer); |
201 |
begin |
202 |
FWidthCNPJ := Value; |
203 |
if ( Self.FTipoDoc = tdCNPJ ) then Width := Value; |
204 |
end; |
205 |
|
206 |
procedure TCNPJCPFEdit.SetWidthCPF(const Value: Integer); |
207 |
begin |
208 |
FWidthCPF := Value; |
209 |
if ( Self.FTipoDoc = tdCPF ) then Width := Value; |
210 |
end; |
211 |
|
212 |
end. |
Crie um arquivo DCR e um bitmap para o componente (Figura 1). Depois acrescente este componente ao nosso pacote dê um Build, não é precisando chamar o Install do pacote.
Figura 1 – Imagem do componente TCNPJCPFEdit