請教一個完善程式碼問題 |
答題得分者是:supman
|
BIG-ROM
初階會員 發表:94 回覆:91 積分:37 註冊:2005-04-16 發送簡訊給我 |
請教一個完善程式碼問題 各位高手,您們好!!
請幫忙解決下面問題,謝謝!
------------------------------------------------- unit Unit8; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, Registry;//在此加上Registry以便調用注冊表. type
TXTZC = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
procedure FormCreate(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
private
//--------------------------
Function Check():Boolean;
Procedure CheckReg();
Procedure CreateReg();
//--------------------------- { Private declarations }
public
{ Public declarations }
end; var
XTZC: TXTZC;
//---------------------------
Pname:string; //全局變量,存放用戶名和注冊碼.
Ppass:integer;
//--------------------------- implementation {$R *.dfm}
//---------------------------
Procedure TXTZC.CreateReg();//創建用戶信息.
var Rego:Tregistry;
begin
Rego:=Tregistry.Create;
Rego.RootKey:=HKEY_USERS;
rego.OpenKey('.DEFAULT\Software\AngelSoft\Marksix',True);//鍵名為AngelSoft\Demo,可自行修改.
Rego.WriteString('Name',Pname);//寫入用戶名.
Rego.WriteInteger('Pass',Ppass);//寫入注冊碼.
Rego.Free;
ShowMessage('程序已經注冊,謝謝!');
CheckReg; //刷新.
end; Procedure TXTZC.CheckReg();//檢查程序是否在注冊表中注冊.
var Rego:Tregistry;
begin
Rego:=Tregistry.Create;
Rego.RootKey:=HKEY_USERS;
IF Rego.OpenKey('.DEFAULT\Software\AngelSoft\Marksix',False) then
begin
XTZC.Caption:='軟件已經注冊';
SpeedButton1.Enabled:=false;
Label1.Caption:=rego.ReadString('Name');//讀用戶名.
Label2.Caption:=IntToStr(Rego.ReadInteger('Pass')); //讀注冊碼.
rego.Free;
end
else XTZC.Caption:='軟件未注冊,請注冊';
end; Function TXTZC.Check():Boolean;//檢查注冊碼是否正確.
var
Temp:pchar;
Name:string;
c:char;
I,Long,Pass:integer;
begin
Pass:=0;
Name:=edit1.Text;
long:=length(Name); for I:=1 to Long do
begin
temp:=pchar(copy(Name,I,1));
c:=temp^;
Pass:=Pass+ord(c); //將用戶名每個字符轉換為ASCII碼後相加.
end;
if StrToInt(Edit2.Text)=pass then
begin
Result:=True;
Pname:=Name;
Ppass:=Pass;
end
else Result:=False;
end;
//----------------------------------
procedure TXTZC.FormCreate(Sender: TObject);
begin
CheckReg;
end; procedure TXTZC.SpeedButton1Click(Sender: TObject);
begin
if Check then CreateReg
else ShowMessage('注冊碼不正確,無法注冊'); end; procedure TXTZC.SpeedButton2Click(Sender: TObject);
begin
CLOSE;
end; end.
--------------------------------------------
上面是一個簡單的注冊機制方式,但執行時出現很大的問題。 問題表現如下:
假如Edit2為空或者輸入不是數字的話就馬上產生錯誤,請問如何將程式碼改善?? 感謝!! 寫程序——新問題會接踵而來!
|
supman
尊榮會員 發表:29 回覆:770 積分:924 註冊:2002-04-22 發送簡訊給我 |
您好:
因為StrToInt假如您輸入的資料是空白或字元,會出現不是數字的錯誤訊息,
因此您要先判斷他是否為數字再去進行StrToInt,您可以加一個函數.
Function zIsInt(Str:String):Boolean; begin try StrToFloat(Str); Result:=true; except Result:=false; end; end; 那段改成這樣 if (zIsInt(Edit2.Text) then begin if StrToInt(Edit2.Text)=pass then begin Result:=True; Pname:=Name; Ppass:=Pass; end else Result:=False; end else Result:=False;或者說用內建函數判斷 function IsNumeric(AChar: Char): Boolean; overload; function IsNumeric(const AString: string): Boolean; overload; 發表人 - supman 於 2005/04/28 19:10:40 |
BIG-ROM
初階會員 發表:94 回覆:91 積分:37 註冊:2005-04-16 發送簡訊給我 |
您好,還是之前的情況而沒有得到改善。 如果Edit2 為空就產生錯誤信息而導致程式關閉,還是跟之前一樣的情況。
引言: 您好: 因為StrToInt假如您輸入的資料是空白或字元,會出現不是數字的錯誤訊息, 因此您要先判斷他是否為數字再去進行StrToInt,您可以加一個函數.寫程序——新問題會接踵而來!Function zIsInt(Str:String):Boolean; begin try StrToFloat(Str); Result:=true; except Result:=false; end; end; 那段改成這樣 if (zIsInt(Edit2.Text) then begin if StrToInt(Edit2.Text)=pass then begin Result:=True; Pname:=Name; Ppass:=Pass; end else Result:=False; end else Result:=False;或者說用內建函數判斷 function IsNumeric(AChar: Char): Boolean; overload; function IsNumeric(const AString: string): Boolean; overload; 發表人 - supman 於 2005/04/28 19:10:40 |
supman
尊榮會員 發表:29 回覆:770 積分:924 註冊:2002-04-22 發送簡訊給我 |
我把你那段整各獨立出來寫,完全正常,不曉得你出現錯誤而整各程式關閉是什麼錯誤訊息,請把錯誤訊息的圖貼上來,另外請確定是否問題是出在StrToInt那段,因為就算那邊有問題也不至於導致整各程式關閉.
還有一些無效的程式碼也把他改掉.
補充一點如果您要使用IsNumberic必須Uses IdGlobal.
implementation uses IdGlobal; {$R *.dfm} Function TForm1.Check():Boolean;//檢查注冊碼是否正確. var //Temp:pchar;拿掉 Name:string; c:char; //I,Long,Pass:integer; //I,Pass:integer; begin Pass:=0; Name:=edit1.Text; //long:=length(Name); for I:=1 to Length(Name) do begin //temp:=pchar(copy(Name,I,1));拿掉 //c:=temp^;拿掉 //Pass:=Pass ord(c);//將用戶名每個字符轉換為ASCII碼後相加. Pass:=Pass ord(Name[i]); end; if (IsNumeric(Edit2.Text)) then begin if StrToInt(Edit2.Text)=pass then begin Result:=True; //Pname:=Name; //Ppass:=Pass; end else Result:=False; end else Result:=false; end; procedure TForm1.Button1Click(Sender: TObject); begin Check(); showmessage('正常'); end; |
BIG-ROM
初階會員 發表:94 回覆:91 積分:37 註冊:2005-04-16 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |