1. 程式人生 > >delphi Edit 控制最大值,只能輸入數字型 控制小數位數

delphi Edit 控制最大值,只能輸入數字型 控制小數位數

delphi語言受眾多程式設計師追捧,主要原因之一就是它有很多第三方的控制元件可供使用。很多資深的delphi程式設計師都把自己積累的函式、過程等設計成控制元件,以方便使用,提高開發效率。

本文通過一個只允許輸入數字、並且可以設定輸入值範圍和小數點位數的編輯框控制元件的設計,詳細介紹了控制元件的實現方法。該控制元件繼承自edit控制元件,控制元件單元名稱為numedit,控制元件類名稱為tnumedit。控制元件的實現主要分為4個階段:

1、 建立控制元件原型。

2、 設計控制元件功能程式碼。

3、 設計控制元件圖示。

4、 安裝釋出控制元件。

下面對這四個階段進行介紹。

1、 建立控制元件原型

我們可以通過delphi嚮導建立控制元件原型。通過delphi選單file-new-other

開啟new items對話方塊,然後在new屬性頁中選擇component,點選ok,彈出new component對話方塊,在該對話方塊中設定控制元件的基本資訊,如下圖(圖1.1):

圖1.1

ancestor type:選擇你的控制元件要繼承的類,我們選擇tedit(stdctrls)。

class name:要建立的控制元件的類名稱,我們設定為tnumedit。

palette page:該自定義控制元件釋出後將要停靠的控制元件面板。

unit file name:該控制元件程式碼存放路徑。

設定好上面資訊後,點ok按鈕,嚮導自動生成最原始的控制元件程式碼,如下:

unit numedit; //單元名稱

interface

uses//該控制元件需要呼叫的單元

sysutils, classes, controls, stdctrls;

type

tnumedit = class(tedit) //控制元件類,繼承自tedit

private//私有成員

{ private declarations }

protected//保護成員

{ protected declarations }

public//公有成員

{ public declarations }

published//釋出成員

{ published declarations }

end;

procedure register;//過程宣告

implementation

//下面函式功能是將控制元件tnumedit的圖示顯示在samples面板上。

procedure register;

begin

register components('samples', [tnumedit]);

end;

end.

到目前為止,控制元件tnumedit 已經具備了tedit編輯框的所有功能,下面我們就可以在這個基礎上設計我們需求的功能了。

2、 設計控制元件功能程式碼

首先我們知道,該控制元件功能需求有三個:

1)只允許輸入數字。

2)可以設定輸入範圍,即可以設定輸入數字的最小、最大值。

3)可以設定輸入數字的小數點位數。

基於上面需求,我們的控制元件需要做如下幾個方面處理:

1)繼承控制元件接收的按鍵事件,如果按的不是數字鍵直接返回。

2)增加控制元件可以接收的最大值max、最小值屬性min。

3)增加控制元件小數點設定的屬性dotnum。

4)響應控制元件焦點離開訊息(cm_exit),在這裡處理控制元件中錄入的內容,使其大於min、小於max且小數點位數等於dotnum。

下面結合該控制元件程式碼,通過程式碼的註釋介紹我們詳細的處理過程。

unit NumEdit; //單元名稱
interface
uses          //該控制元件需要呼叫的單元
 SysUtils, Classes, Controls, StdCtrls;
type
 TNumEdit = class(TEdit)        //控制元件類,繼承自TEdit
 private                        //私有變數宣告
FMin, FMax: Extended;        //編輯框允許輸入的最大最小值。
Fdotnum:Cardinal;            //小數點後位數個數
procedure CMExit(var Message: TCMExit); message cm_exit;//響應焦點離開控制元件的訊息
 protected                    //保護
procedure KeyPress(var Key: Char); override; //過載按鍵事件
procedure SetMin(value: Extended);
procedure SetMax(value: Extended); 
procedure setdotnum(value: Cardinal);
 public                       //公有
constructor Create(AOwner: TComponent); override;//過載建構函式
function formatstr(s:string):String; //規整字串
procedure delaexit;                  //處理使控制元件中的內容
published     //釋出三個屬性,分別表示最小值,最大值和小數點數 
property Min: Extended read FMin write SetMin ; //;
property Max: Extended read FMax write SetMax ; //;
property dotnum:Cardinal read Fdotnum write setdotnum ; //;
end;
procedure Register;      //註冊過程宣告
implementation
{函式描述:規整字串,使其小數位數為:fdotnum。
引數s:要處理的數值的字串形式。
返回值:字串形式的數值,小數位數為fdotnum。}
function TNumEdit.formatstr(s:string):string;
var
i,j:integer;
len:cardinal;
begin
i:=pos('.',s); //在s中定位小數點
if i<>0 then //如果存在小數點
begin
if i=1 then //如果小數點在第一位,則在前面加0
    s:='0'+s;
len:=length(s)-pos('.',s); //獲取小數點後的位數
if Fdotnum=0 then   //如果小數點個數設定為0,則取小數點前的部分
    s:=copy(s,1,length(s)-len-1)
else if len<Fdotnum then //追加0使s滿足小數點後有fdotnum位數
begin
    for j:=0 to Fdotnum-len-1 do
      s:=s+'0';
end
else //小數點後位數過多,捨去多餘部分,不考慮四捨五入
begin
    s:=copy(s,1,length(s)-(len-Fdotnum));
end;
end
else// //不存在小數點,加上小數點,再加n個0
begin
s:=s+'.';
if Fdotnum=0 then
else
    for j:=0 to Fdotnum-1 do
      s:=s+'0';
end;
result:=s;
end;
{過程描述:在自定義控制元件游標離開或者按回車鍵的時候處理,使控制元件裡面的內容(text)符合數值範圍和小數點位數設定的要求}
procedure TNumEdit.delaexit();
var
curvalue: Extended;
stemp,stemp1:string;//存放符號和值的字串形式
begin
if trim(text)='' then text:='0';//如果為空,預設填寫0
if copy(text,1,1)='-' then //如果為負數
begin
    stemp1:='-';
    stemp:=copy(text,2,length(text)-1);
end
else //如果不是負數
begin
    stemp1:='';
    stemp:=text;
end;
try
    curvalue:=StrToFloat(stemp); //轉換為數字
except //轉換失敗,預設填寫0並格式或為設定的小數位數。
    showmessage('不是有效的數字!請確認');
    text:=formatstr('0');
    self.SetFocus;
end;
//下面對最大值處理,分為大於0,等於0和小於0三種情況
if FMax>0 then //設定的最大值大於0的處理
begin
    if (stemp1='') and (curvalue>FMax) then //為正且大於最大
      curvalue:=FMax
end
else if FMax=0 then //等於0的處理
begin
    if (stemp1='') then
      curvalue:=FMax;
end
else if FMax<0 then //小於0多處理
begin
    if (stemp1='') then
      curvalue:=FMax
    else if curvalue>abs(FMax) then
      curvalue:=abs(FMax);
end;
//下面對最小值處理,分為大於0,等於0和小於0三種情況
if FMin>0 then //最小值大於0
begin
    if ((stemp1='') and (curvalue<FMin)) then //支援負數
      curvalue:=FMin
    else if stemp1='-' then
      curvalue:=FMin;
end
else if FMin=0 then //最小值等於0
begin
    if stemp1='-' then
      curvalue:=FMin;
end
else if FMin<0 then //最小值小於0
begin
    if ((stemp1='-') and (curvalue>abs(FMin))) then
      curvalue:=abs(FMin);
end;
//下面對小數位數進行處理
if curvalue=0 then
  text:=formatstr(floattostr(curvalue))
else
    text:=stemp1+formatstr(floattostr(curvalue));
end;
{函式描述:過載建構函式,設定自定義控制元件三個新增屬性的預設值} 
constructor TNumEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FMin := 0; //最小值預設為0
FMax := 255; //最大值預設為255
Fdotnum:=2; //小數點個數預設為2個
Text := formatstr('0'); //text繼承自Tedit,設定預設顯示為0.00
end;

上面的編碼設計使該控制元件已經滿足了需求中提出的功能要求。

3、 設計控制元件圖示

delphi控制元件要使用一個圖示顯示在delphi的控制元件面板上供開發者使用(由上面設計可知,該控制元件要顯示在delphi控制元件面板的samples面板上),控制元件的圖示有如下要求(注意圖示檔名和圖示名稱的區別,下面有講述):

1)圖示檔名稱為dcr(字尾名為dcr)格式,該類檔案可認為是圖示的容器,其中可以包含多個圖示。

2)圖示檔名要與控制元件單元的檔名一致,如該控制元件的圖示檔名應該為numedit.dcr。

3)圖示名稱要與控制元件類名稱一致。如本控制元件的圖示名稱應該為tnumedit。

4)圖示檔案要與控制元件單元檔案位於同一目錄下,這樣釋出控制元件時候才能關聯到一塊。

下面通過用delphi自帶的工具image editor設計本控制元件的圖示來介紹控制元件圖示的設計,步驟如下:

1)通過delphi的選單“tools-image editor”開啟圖示編輯工具。

2)通過file-new-component resource file(.dcr)建立一個圖示檔案。把它儲存在numedit.pas相同目錄下,名稱為:numedit.dcr。此時image-editor如下圖示(圖3.1):

圖3.1

3)在上圖中,滑鼠右鍵點contents,然後在彈出的選單中選擇 “new-bitmap”開啟“bitmap properties”框,設定屬性後點“ok”即可建立一個預設名稱為 “bitmap1”的點陣圖,把其名稱修改為“tnumedit”,並雙擊它開啟,然後通過畫筆等工具設計該點陣圖,示意如下(圖3.2):

圖3.2

設計點陣圖根據自己的喜好,這裡做簡單的設計,設計好後儲存即可。至此,該控制元件對應的圖示已經設計好。

4、 安裝釋出控制元件

目前我們已經完成了控制元件的設計,該控制元件包含兩個檔案,程式碼檔案numedit.pas和圖示檔案numedit.dcr。這一節介紹如何把該控制元件安裝到delphi的控制元件面板上供開發者使用,步驟如下:

1、 把這兩個檔案拷貝到一指定目錄下,對於自定義控制元件,作為一種好的開發習慣,我們一般在delphi安裝目錄下建立custom目錄並把自定義控制元件拷貝過去。這裡我們也建立custom\numedit目錄,然後把該控制元件的檔案拷貝到該目錄下,如下:

c:\program files\borland\delphi7\custom\numedit\

2、 在delphi庫中增加該控制元件的路徑。通過選單:

“tools-environment-options開啟environment-options對話方塊,選擇library屬性頁,然後單擊library path後的選項按鈕開啟directories對話方塊,在該對話方塊中手工錄入或者通過選項按鈕把控制元件路徑填寫進去,如圖(圖4.1)所示:

圖4.1

點選“add”按鈕,點選ok,回到“environment-options”對話方塊,再點選 “ok”完成庫檔案路徑新增。

3、控制元件安裝。通過前兩步的處理,我們就可以安裝控制元件了,通過選單“component-install component”開啟控制元件安裝對話方塊,點into existing package屬性頁中的unit file name後的browse按鈕,選中要安裝的控制元件檔案numedit.pas,然後點“ok”按鈕即可。系統提示是否編譯,選擇編譯後便可以把該控制元件安裝到delphi的控制元件面板,如下圖:

圖4.2

到目前我們已經完成了一個控制元件從最開始的需求分析到最終釋出使用的全部過程。

好了,設計程式的時候,把上面的控制元件(紅色的,在控制元件圖示設計中設計的那個圖示)拖到delphi的窗體上、通過設定控制元件的屬性就可以使用該控制元件了。簡單吧,快動手設計一個自己的控制元件吧。