全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:956
推到 Plurk!
推到 Facebook!

請教一個完善程式碼問題

答題得分者是:supman
BIG-ROM
初階會員


發表:94
回覆:91
積分:37
註冊:2005-04-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-28 18:22:50 IP:59.36.xxx.xxx 未訂閱
請教一個完善程式碼問題    各位高手,您們好!! 請幫忙解決下面問題,謝謝! -------------------------------------------------    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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-28 18:57:19 IP:61.70.xxx.xxx 未訂閱
您好: 因為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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-29 01:46:07 IP:59.36.xxx.xxx 未訂閱
您好,還是之前的情況而沒有得到改善。    如果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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-29 02:49:20 IP:203.204.xxx.xxx 未訂閱
我把你那段整各獨立出來寫,完全正常,不曉得你出現錯誤而整各程式關閉是什麼錯誤訊息,請把錯誤訊息的圖貼上來,另外請確定是否問題是出在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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-29 04:54:04 IP:59.36.xxx.xxx 未訂閱
supman 前輩您好,非常感謝您!! 感謝前輩無比熱心和無私的教導,實在使我受益不少!再一次多謝!! 果然有專業級水平,厲害!! 佩服! 寫程序——新問題會接踵而來!
系統時間:2024-06-27 0:10:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!