delphi 的一些注意點和知識點

 關於Delphi中產生的文件
    編輯階段: pas/單元文件,dpk/組件包文件,dpr/工程文件,dfm/窗體文件
    編譯階段: dcu/單元編譯文件,dcp/Delphi Compile package
    鏈接階段: exe,dll,bpl/Borland package library
    運行階段數據庫


 使用Delphi編程中須要掌握的四大語言
    A. Object Pascal   B. SQL   C. HTML/XML   D. UMI編程


Delphi發展的兩個主要技術 {數據庫引擎,網絡開發}小程序


工程中包含的單元主要有帶Form的單元和不帶Form的單元windows


單元文件的結構{unit 單元名,接口部分,實現部分,初始化部分,結束部分}
    前三個部分是必選的,後兩個是可選的。
    初始化部分:單元載入內存的時候初始化裏面的代碼
    結束部分: 單元結束的時候執行的代碼數組


代碼模版在Tools菜單的Editor Options 中的Code Insight
    Code Template 部分的Code中編寫代碼的時候加個"|"代表光標定位處
    Ctrl+J:在單元中編寫代碼的時候,敲入模版 按下Ctrl+J自動產生模版代碼服務器


 {$開頭的表示:編譯器指令字 而不是純粹的註釋
    單行註釋 //
    塊註釋 (* *) 或者 {   } 相同類型塊註釋不能嵌套網絡


微調控制方向鍵:Ctrl+方向鍵;微調改變大小: Shift+方向鍵編程語言


 Edit菜單中Creation Order的功能是:控制非可視組件在窗體產生的時候的建立順序ide


 Edit菜單--〉Scale功能:改變窗體上全部組件的位置和大小範圍在[25%-400%]
    包括Left,Top,Width,Height都按照比例改變函數


 Compile Ctrl+F9 僅僅編譯,只有當源代碼文件改變了才加以編譯
      build     無論改變否,都從新編譯鏈接生成目標文件
      Run F9 先看源文件是否改變,改變則Compile ,而後鏈接生成目標文件運行


 斷點設置F5,鼠標單擊針對一行,若是該行有多條語句則F8後同時執行完成
    F4 Run to Cursor讓程序運行起來,若程序運行到該行則相似F5功能,
        若是把光標移到其它行再按下F4程序就跳到光標行很實用
    F7 Trace Into :能夠進入例程
    F8 Step Over :單行/句執行
    工程選項中Options的Compile中的 Use Debug Dcus 能夠跟蹤進入DCU、
    Run 中的 program Reset 或者使用Ctrl+F2 能夠把僵死在IDE環境中的程序解除。


 Project菜單下的Options中的設置僅對當前工程有效,
    若是選中了Options中的Default則該設置對之後產生的工程也有效。


1> Project菜單下的Options設置中Compile頁中選中Optimization
    能夠消除無用代碼,如for I:=0 to–1 do 絕對不會編譯    
 2> Extended syntax 若是去掉則 function中的result不能用
 3> Record field alignment:分配變量的對齊方式字節爲單位,8指8字節比較超前


 工具菜單環境選項命令,如下設置針對全部工程
    preferences->Docking->選中Auto Drag Docking 窗口拖放自動融合,
    若想不入鄔則按住Ctrl鍵(在選中狀況下)。
    Library->Library path :能夠設置經常使用的搜索路徑,適用全部工程
    順帶了解:Tools-->Editor Options 和 Tools-->Debug Options


試題19     窗體模版的選用 File->New->other->Forms     三種選用方式:
    Copy拷貝:徹底拷貝,互不影響
    Inherited繼承:做爲子類使用,模版改變則子類改變
    Use使用:以指針的方式來用,雙向變化
    刪除模版方法:進入Tools->Repository找到模版頁,在Objects中選中對象刪除
試題20     標識符的注意點:字母或下劃線開始,只能包含字母、數字和下劃線的字符串
    不能與保留子相同,儘可能使用有意義的單詞或單詞組合
試題21     命名約定
    常量名:全大寫    
    保留字:全小寫
    類型名:T 表示類 E表示異常 I表示COM接口
    對象名:edtName btnCalc 類中元音不要,取輔音做前綴,重複輔音取一個
        如 button 去掉u和o 僅保留 btn用小寫
    枚舉常量名:如Pen中Style:psSolid,psDash,psDot,psDashDot,psDashDotDot,psClear,psInsideFrame
    事件屬性名:OnClick 以On開頭
    變量、域名:用名詞;
    例程名:動賓結構 DoAdd,DrawCircle
試題22     保留字和指示字,65個保留字 + 類中的4個P和異常處理中的on
    44個指示字只在特定上下文中有特定含義如message abstract virtual
    不然能夠看成標識符使用。
試題23     數值數據:十進制,科學表示法7e-2 12.35E6 ; 十六進制 $AAAA
試題24     字符串中的注意點
    ‘I can’’t ‘ = ‘I can’#39’t’
    ‘Line ‘#13#$A’Line 2’=’Line 1’+#13#10+’Line 2’
    var message:Single;
    message:=12.25E6; 總共11位
    write(message :15:2);
    writeln(''''); 輸出'符號後加上回車換行符
試題25     運算符的優先級排列問題
    ., @, not,^                                   first (highest)
    *, /, div, mod, and, shl, shr(右移), as(類型轉換)     second
    +, - ,or, xor                                   third
    =, <>, <, >, <=, >=, in, is(類型判斷)                 fourth (lowest)
試題26     數據類型中的幾個問題
    17數據類型,5種標準數據類型(內建聲明的數據類型)
    {整型9種:integer 和Cardinal 通用:32位機上是32位,64位上是64位    
    實型5種,記住字節數 Single 4; Extended 10; 其餘8 Real爲通用
          Currency類型實際存放的方式:數值*10000保存整數形式,取出來除以10000
    字符型 AnsiChar 等價 char 1個字節 WideChar 2個字節
    字符串型 shortstring 短字符串 Ansistring 長字符串
    WideString 寬字符串 string 同AnsiString   通用型 String
    布爾型 Boolean 只能取 True or False }
    七種結構數據類型{數組、記錄、集合、文件、類、類引用(class of)、接口}
    三種特殊數據類型{指針 ^ , 變體 variant , 過程 procedure}
    Delphi專用數據類型{Type TdateTime=type double; TPoint}
試題27     變量的內存空間                              
    var I:Byte I佔據1個字節  
    var str:String; 佔據4個字節爲空指針,當str:=’abcd’的時候,
    在堆中分配空間存放引用計數和abcd四個字符,而後空指針指向這個堆中的起始地址
    字符串具備:CopyOnWrite技術和具備垃圾回收功能。
    var str:string[100]   佔據101字節
    var str:ShortString; 分配256個字節,實際字符佔據255
試題28     有序數據類型的用法,直接前趨pred、直接後繼succ
    如for循環和case 只能用有序數據類型
    整數、字符、布爾、子界、枚舉 Ord( )返回整數序號, Pred(),Succ()返回枚舉類型
    枚舉要注意:它的序號問題,佔據的內存問題(可變長的):佔據1個字節仍是多個字節,看序號大小
    如:TEnum=(meBlue,meRed=0,meGreen=65536) 4個字節 2000則爲2個字節
    TmyEnum=(meBlue,meRed=0,meGreen=1)   1個字節還有mrGreen的前趨能夠是 meBlue也能夠是meRed


  數組:一維動態數組,二維動態數組,下標老是從0開始,分配函數SetLength( )
   例如 type dynIntOne=array of integer;  
          dynIntTwo:array of array of integer;
        var dd1:dynIntOne;
          dd2:dynIntTwo;  
      沒有使用SetLength分配空間以前,此時low(dd1)=0, high(dd1)=-1;
記錄變量是靜態分配的,在棧中分配,全部的對象都是在堆中分配的。


   集合類型 type Tmyset=set of 基類型   最多256個元素,基類型爲有序類型
    不但數量<=255 且序號都必須0<=X<=255
    type myset=set of 5..256; 不行,set of 0 .. 255 正確
    File類型:無類型文件 File (按128字節分塊) 文本文件 TextFile
試題33     type TnotifyEvent=procedure(sender:Tobject) of object;  
    //類中的過程指針
    type TmyProcedure=procedure(s:string);   //通常的過程指針
試題34     Type TdateTime=type double;
    整數部分:表示日期 加1表示天數加1
    小數部分:表示時間 0 表示午夜0點,0.5表示中午12點
    1/24 一小時,1/(24*60) 一分鐘 1/24*60*60 一秒鐘 以此類推
    從1899年12月30日午夜0點 開始計時 :0
試題34     數據類型轉化
    x mod y=x-(x div y)*y   求餘看被除數的符號
    10 mod 3=1 -10 mod 3=-1 -10 mod –3=-1 10 mod –3=1
試題35     Pascal中的語句知識,考小程序較多
    語句以分號結束,程序或單元以點句號結束。
試題36     一般函數調用不該當單獨構成語句,而應當用做表達式置於賦值語句的右側。
    設置工程選項對話框Compiler標籤頁的Extended Syntax爲未選中,
    能夠禁止函數用做語句。同時,也禁止了Result預約義變量的使用。
試題37     注意Begin   End 界定符的用法:end 以前的那條語句能夠不用分號」;」,
    end以後若是做爲複合語句通常狀況下有分號,但也能夠沒有分號如if else語句
試題38     with 語句的功能:用在記錄、類和無名對象中如 with Tbitmap.Create do
    嵌套的with語句的優先級問題:按照最接近原則處理.結果爲Button2.caption變爲dddd
    with button2,button1 do
    begin
      caption:='ddd';
    end;
    with button1 do
    begin
      with button2 do
      begin
      caption:='ddddd';    
      end;
    end;
試題39     註釋語句:同級不能夠嵌套,切記!!
    If xxxx then dosomething
    Else do else;   上述兩句在Delphi中算一條語句
    If xxxx then dosomething ;   算一條語句,對一條語句的理解
試題40     Case 語句:值表達式必須是有序類型
    case 值表達式 of
      valuei: 語句;//begin end; 複合語句
      else 語句;//begin end; 複合語句     此處else 沒有冒號
    end;   //有end 沒有 begin
試題41     循環語句:for 循環中的循環變量在循環體中不能賦值,且爲有序類型
    I:Char;
      for I:=’A’ to ‘Z’ do
    只能在循環中使用的:continue(再度進入循環)和 break(退出循環);
試題42     exit 退出一段例程,若是爲主例程則整個程序退出
    repeat語句中有必要用begin end結束嗎?能夠/不能夠,應該能夠。
      begin
      end;
    until 結束條件爲真;
試題43     兩種例程:procedure / function
    聲明:相同的連續的形參能夠放在一條以逗號隔開的類型聲明語句中
    多個形參用分號隔開。
    定義:只能在implementation部分
    調用:調用的時候參數間所有用逗號分隔。
試題44     參數類型5種:值參,變參 var,常參 const,
    in/out COM應用中:單純的只(進)讀和只(出)寫,兩個可合用
試題45     例程中的缺省參數的使用:注意從後往前缺省,中間不能跳躍
試題46     例程重載(overload)的使用:必須知足一下條件之一
    參數個數不一樣;參數類型不一樣;相同個數狀況下某個對應位置類型不一樣
    記住:只要參數類型不一樣便可,返回值不一樣無效,
    可是如下能夠經過,
    procedure swap(const A,B:Integer);overload;
    begin
    end;
    function swap(const A,B:single):Integer;overload;
    begin
    end;
試題46     做用域問題
    可見性:變量能夠被訪問的範圍。
    生命期:變量能在多長時間內保持其值和保持可見性。
試題47     記錄與類的區別
    記錄中只能放數據,記錄變量是在棧中分配內存,不能自動初始化,
    全部的數據(域)不能對外隱藏。
試題48     type my=record
            name:string;   //4 實際 4 地址嗎
            age:single;   //4 實際 4
            bs:Boolean;   //4 實際 1
    end;
    //若是Project Options的編譯器中設置了對齊爲1個字節則爲9,4-8個字節爲12
    若是使用sizeof(my)則結果爲:12,
    若是聲明變量 var dd:my 無論有沒有賦值; sizeof(dd)則結果都爲:12
試題49     類中能夠包含數據外,還能包含處理數據的例程即方法,對於數據和方法的可見性的約束。
    類類型變量(即對象)的存儲分配方式爲動態分配也不一樣於記錄變量,類中還包括屬性成員
試題50     ctrl+shift+c :自動代碼完成針對:方法(定義)、屬性(Private方法和域的自動添加)
    Ctrl+shift+↑:回到代碼聲明處   Ctr+Shift+↓:進入代碼定義處
    Ctrl+J: 代碼完成         Ctrl+Shift+U 整塊左移,Ctrl+Shift+I整塊右移
試題51     構造函數功能:實例化和初始化對象
    var bb:Tbitmap; //此時只是個空指針,尚未建立實例
    begin
      listbox1.Items.Add(inttostr(Integer(bb))); //指針1
      bb:=TBitmap.Create; //在heap中建立對象,
      listbox1.Items.Add(inttostr(Integer(bb))); //指針2
      指針1和2不同,可是大小都是4個字節,用來存放指針。
    End;
試題52     類的Free方法在Tobject中:間接調用了Destroy;
    procedure TObject.Free;
    begin
      if Self <> nil then
            Destroy;
    end;
試題53 TPerson = class
      Name: string;
      BirthDay: TDate;
      Sex: Boolean;
      constructor Create(const N: string; B: TDate; S: Boolean); overload;
      procedure Talk; virtual;
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    var b:Tperson;
    begin
      ListBox1.Clear;
      ListBox1.Items.Add(b.Name);
      if b.Sex then
      ListBox1.Items.Add('男')
      else
      ListBox1.Items.Add('女');
      //變量b的存儲空間大小
      ListBox1.Items.Add(IntToStr(SizeOf(b)));
      //對象b的實例空間大小
      ListBox1.Items.Add(IntToStr(b.InstanceSize));
      //變量b所在的存儲地址
      ListBox1.Items.Add(IntToStr(LongInt(@b)));
      //對象b所在的存儲地址
      ListBox1.Items.Add(IntToStr(LongInt(b)));
      //對象b中第一個數據成員的存儲地址
      ListBox1.Items.Add(IntToStr(LongInt(@b.Name)));
      //對象b中第二個數據成員的存儲地址
      ListBox1.Items.Add(IntToStr(LongInt(@b.BirthDay)));
      //對象b中第三個數據成員的存儲地址
      ListBox1.Items.Add(IntToStr(LongInt(@b.Sex)));
      b.Free; b:=nil;   //特別要注意回收內存
    end;
試題54     成員的討論:重要
    數據(域)成員:變量。
    方法成員:前向分類——構造(器)方法、析構(器)方法、通常方法、類方法。
        類方法:能夠經過對象和類引用的方法含構造方法。
    通常方法:只能經過對象引用
    方法成員:後向分類——靜態方法 尾巴乾淨的、虛擬方法Virtual、
    動態方法dynamic、抽象方法abstract、覆蓋override和重載overload的方法、處理消息的方法message 消息常量。
    虛擬方法:用空間換時間,較快   動態方法:時間換空間,較慢
    抽象方法:前綴必須是虛擬方法或動態方法,只需聲明不用定義
    Tobject.destroy 是虛擬的
    屬性成員:反映數據(域)的窗口,對數據處理。包括數據屬性和事件屬性。
試題55     所謂面向對象的語言OOP,就是同時具有抽象性、封裝性、繼承性和多態性的語言。
試題56     抽象性:建模考慮的問題
    封裝性     private protected public
        private     除本單元外,徹底不可見。C++中的友元問題。
    注:在Delphi中,對友元概念的支持是經過放置在同一個單元來實現的。
        Protected 除本單元及其子類外,不可見。
        Public 若是類聲明在單元接口部分,其它單元只需uses便可見。
        Published 若是是組件,則不只具備public的可見性,
              並且在設計期的對象檢視器可見。缺省的可見性爲published。


編寫組件的時候按可見性從小到大排列。
    在每一種可見性中,先數據(域),後方法,再屬性。


試題58     一般:數據(域)放在private部分;屬性放在published(組件)
    或public(通常類)部分。方法的放置要複雜一些,請注意積累,
    可以可見性低則儘可能不要高。


子類訪問父類的私有域出錯!子類訪問保護域沒問題!
    孫子類調用訪問父類的私有方法,出錯!訪問祖父類的保護域沒問題!
    若是把三個類都放在一個單元內,則均可以訪問!四個域均可以!


 繼承:若是子類調用父類的Create則只實現了實例化,而沒有初始化。
    多態:構成多態的基本要素:
    (1)類有繼承關係;
    (2)派生類對象能夠賦給父對象;
    (3)派生類能夠override基類的virtual和dynamic方法。
    多態判斷規則:
    (1)靜態方法看聲明,誰聲明就是調用誰的即便字類賦給父類,塵歸塵,土歸土;
    (2)覆蓋方法看實際,參考procedure(Sender:Tobject);中的Sender
下列代碼執行後,其正確的輸出結果序列爲:[考題]
    type
    TA = class
      procedure One; virtual;
      procedure Two;
    end;
    TAA = class(TA)
      procedure One; override;
      procedure Two;
    end;
    procedure TA.One;
    begin
      ShowMessage('基類One');
    end;
    procedure TA.Two;
    begin
      ShowMessage('基類Two');
    end;
    procedure TAA.One;
    begin
      ShowMessage('派生類One');
    end;
    procedure TAA.Two;
    begin
      ShowMessage('派生類Two');
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      fa: TA;
      ca: TAA;
    begin
      Memo1.Clear;
      fa := TA.Create;
      ca := TAA.Create;
      fa.One;
      ca.One;
      fa.Free;
      ca.Free;
      fa := TAA.Create;
      fa.One;         //重點考這裏
      fa.Two;
      fa.Free;
    end;

三大數據模塊和公司(Corba:OMG組織;
    DCOM:MS微軟公司,RMI(Remote Mothod Invocation):SUN公司
試題63     試題:exception主體結構
    Exception = class(TObject)
    private
        FMessage: string;
    public
        constructor Create(const Msg: string);
          property Message: string read FMessage write FMessage;
    end;


 銷燬一個窗口的事件發生的順序OnCloseQuery   OnClose   OnDestroy


 建立一個窗口的事件發生的順序OnCreate OnShow OnActivate OnResize OnPaint
    按鍵發生的系列事件順序以下:OnKeyDown OnKeyPress OnKeyUp
    鼠標單擊的時間順序onMouseDown OnClick OnMouseUp
    雙擊鼠標 OnMouseDown OnClick OnMouseUp OnDblClick OnMouseDown OnMouseUp
    注意:OnEnter和OnExit事件 若是沒有焦點則在單/雙擊多發生一個事件OnEnter
試題66     Polygon(const Points:array of TPoint);     //封閉圖形,用當前的畫刷填充,邊框用Pen
      PolyLine(const Points:array of TPoint); //畫多邊形,用當前的Pen
試題67     Arc,Ellipse,LineTo,MoveTo,Pie, Rectangle方法的使用以及參數
試題68     類層次結構圖,從Tobject 開始的整個VCL類圖,有考類之間的繼承關係
    TObject->TPersistent->TComponent->TControl->{TGraphicControl/TWinControl}
    TObject->Exception->
    TObject->TInterfaceObject


TWinControl即窗口控件的三大特徵:句柄、焦點、部分能夠爲父


TGraphicControl即圖形控件的三大特徵:無句柄、無焦點,所有不能夠爲父


TControl類中,控件爲了顯示出來要指定父parent,可是爲父的必定是TwinControl 窗口控件
    Enabled   visible parent   屬性進來了

 控件關係Tcontrol->TgraphicControl->Speedbutton
    Tbutton->BitBtn
    由於沒有多繼承,因此先肯定一個主類加以繼承,而後把另外一個類做爲一個屬性
試題72     Sizeof(self)   //4
        Sizeof(sender) //4
    類的函數 instancesize(real size) 返回實例空間


祖先類的選擇原則:
      非可視組件最好的基類:TComponent
      做圖形控件最好的基類:TgraphicControl
      做窗口控件最好的基類:TcustomControl,由於它引入了Canvas屬性


組件命名問題:在組件名稱以前加一些個性化東西如TLSLPerson
procedure Register;
    begin
      RegisterComponents('Wujispace', [TLSLPerson]);
    end;
Register的大小寫不能改變,參數含義:(組件面板頁名稱,組件類名字-〉開放數組)


在設計組件時候,屬性若是爲字符串則不能有缺省值 即不能使用 default
 爲組件創建位圖圖標
      默認使用父類圖標,父類沒有則使用缺省的Delphi位圖
      用Image Editor創建DCR文件,並在其中創建24*24位圖,保存時候位圖名應與
    組件類名徹底相同並大寫,DCR名字同組件包名相同這時候在包文件中編寫{$R *.dcr}。
      若是dcr文件不一樣於組件包名的話,須要在包文件中指定{$R 文件所在路徑}
      注意:左下角的顏色決定了透明色。這個*號表示:名字相同的狀況下缺省。
試題77     定義定製的事件
    1.經過添加事件屬性在發佈部分創建事件句柄
    property OnPersonClick:TnotifyEvent read FpersonClick write FpersonClick;
    2.在保護部分添加事件調度程序
    procedure PersonClick;dynamic;
    3.在私有部分定義消息處理過程,訪問調度程序
    FOnPersonClick:TnotifyEvent;
    procedure WMLButtonClick(var Msg:TWMMouse);message WM_LBUTTONDOWN;


屬性中的default做用:

屬性的值若是在設計器改變且不一樣於default的值則該屬性要保存
    在dfm文件中,若是相同則不保存。若是去掉default則屬性都會保存在dfm文件中。
    若是保留default部分,刪除create中的屬性賦值,結果同上,這個來自Tpersistent.
    注意:有沒有default都不會對屬性初始化,初始化只在構造方法中。若是構造方法中
    沒有對屬性初始化則全部屬性初始值爲0或者空。


 組件拖放到窗體上由IDE自動實現組件的Owner和Parent的設置
    建立組件對象的時候指定Owner須要注意:Owner必須比被擁有者存活的時間長


  測試組件對象,注意:1. 事件的賦值和處理方式
    2. 順序 * 建立組件對象     * 測試組件對象 *釋放對象


 異常處理注意:中四個關鍵字和兩套結構[異常共2題]
    try         決定一個代碼保護塊的起始
    except 有異常才執行
    finally 有沒有異常都執行
    raise   拋出一個異常
      1)如何處理在程序中出現的異常
      2)當程序中出現錯誤時候,如何引起異常 raise 異常實例初始化
      3)異常處理它處理的是異常而不是錯誤,其實錯誤尚未發生
      4)多個異常如何處理


 要想IDE環境直接顯示異常消息對話框,而不是進入異常調試狀態請在
    Tools中的Debugger Options中的Language Exceptions頁中
    不勾選 Stop On Delphi Exception
試題83     分析下面的代碼中調用了那個異常處理
    try
      i := StrToInt('Sam');
      ShowMessage(IntToStr(i));
    except
      on A: EDatabaseError do   ShowMessage(A.message);
      on B: EDivByZero do     ShowMessage(B.Message);
      on C: Exception do     ShowMessage('Exception: ' + C.Message);
      on D: EConvertError do   ShowMessage('EConvertError: ' + D.Message);
    end;
    只執行了:On C:Exception do 這一條,實際上應該由On D: 來處理的!


異常機制作了這樣兩件奇妙的事
    (1)錯誤消息自動包含在異常類的message屬性中出現;
    (2)異常幫助你避免發生錯誤以後意外地執行任何敏感的代碼。


 自定義異常類,爲建立本身的異常,須要聲明一個異常類:
    type
      ESillySpellingError = class(Exception);

 

異常處理完後,還能夠在把這個異常繼續拋出
    此時就沒有必要再實例化和初始化一個異常對象,直接使用 Raise 便可。
    由於此時異常處理中已經知道這個異常是屬於哪一個異常類了。


 如何使下面代碼中光標在處理完計算後保持crDefault,可使用處理異常保護
    try
      try
        for I := 1000 downto 0 do
          J := J + J div I;
        MessageDlg('Total: ' + IntToStr(J), mtInformation, [mbOK], 0);
      finally
        Screen.Cursor := crDefault;
      end;
    except
      on E: EDivByZero do ShowMessage('Error in Algorithm');
    end;

  包是被Delphi程序或IDE所調用的一類特殊的DLL。在Delphi中有兩類包:
    運行期包和設計期包,前者在程序運行時提供必定的功能,後者主要用於擴展IDE的功能。


動態鏈接庫容許多個由不一樣語言建立的Windows應用程序或DLL共享程序代碼和資源,
    以過程和函數調用的方式來提供服務。在多數Delphi開發的應用程序中,包比DLL更加靈活,
    並且易於建立,但在下列狀況下,DLL更適合:
    (1)程序模塊由非Delphi應用程序調用;     (2)擴展Web Server的功能;
    (3)建立第三方應用模塊;         (4)建立的工程是一個OLE容器。


試題90     理解靜態鏈接和動態鏈接的概念:
    靜態鏈接:編譯後將子程序鏈接到EXE中;EXE文件大,但運行時快。
    動態鏈接:編譯後鏈接時根據程序中的external聲明創建與子程序的聯繫表,     運行時,先將DLL裝入內存並用其運行地址填入聯繫表(子程序與程序在同一地址空間,
    參數傳遞發生在堆棧上);EXE文件小,但運行時慢,這個是動態鏈接中的靜態方式。
    另外一種動態方式:在程序中真正須要訪問的時候經過LoadLibrary FreeLibray動態調用


哪些是動態鏈接庫文件:bpl,dll,fon,drv


 動態鏈接庫的好處:
    1.若是不一樣的程序使用相同的DLL,只需在內存中裝載該DLL一次便可。
    2.對於複雜程序的維護更加方便。僅需維護易於維護的DLL便可。
    3.使用DLL存儲資源如字體、設備驅動程序、不一樣語言的字符串、位圖圖標等。
    4.DLL獨立於編程語言。


由外部程序調用的DLL函數或過程必須遵照下列規則:
    1.它必須列在exports子句中,使其可在外部看到;
    2.輸出函數應被聲明爲stdcall,以使用標準的Win32參數傳遞技術代替
      優化的register參數傳遞技術;
    3.DLL的參數類型必須是默認的Windows類型,至少在但願該DLL可以應用於其它開發環境時;
4.DLL可使用全局數據,每當應用程序裝載DLL時,其實是在本身的地址空間中存儲着DLL的全局數據,互相不會衝突,無需保護。


 DLL的使用方式
    (1)完成通常子例程的功能;
    (2)用於窗體重用;
    (3)用於數據交換。
試題95     應用程序調用DLL的兩種方式:
    (1)靜態調用(隱式裝載)使用external ‘DLL文件名’;     //嚴格講此處是一個dll文件路徑
    (2)動態調用(顯式裝載)使用三個API函數:LoadLibrary、GetProcAddress、FreeLibrary。
試題96     字符串在dll中傳遞能夠用可是會出異常。這時候就要在工程代碼文件中uses Sharemem單元,
    並且必須放在uses語句中的第一個;並且在開發的動態庫文件中也要加入uses的第一個單元,
    兩邊都要加。若是隻是將字符串傳入dll則無需在兩端都加入sharemem(都不要),若是要加則都加。


 Name屬性 全部的組件有,並不是全部的類都有.
Anchors 大部分組件有,相對於父控件Resize而言的錨定點默認爲左上角,試着拖動窗體


 助手類知識點
    Tpersistent->Tstrings->TstringList
        有排序:sort 和 sorted
        提供文本變化的事件處理器:OnChange
    Tlist->TobjectList/TClassList->TcomponentList


管理指針數組
    TorderedList->Tqueue->TobjectQueue->Tstack

管理指針的隊列和堆棧,管理對象指針的隊列和堆棧


 只要是組件就有屬性:Name組件名稱和 tag組件標記
    owner擁有者概念:
      任何一個組件必須被另外一個組件所擁有,任何一個組件均可以擁有其餘組件
      擁有者在銷燬本身以前必須負責被擁有組件的銷燬
    窗體的擁有者是 Application ,Application的擁有者是 nil


Tobject,總共25個方法,瞭解其中7個
    1)     構造和析構相關的3個
        create 靜態         destroy 虛擬         Free 靜態
    2)     3個類方法
        ClassName     返回類的名稱,shortstring
        ClassParent     返回直接基類的指針(類引用)
        InstanceSize     返回對象實例空間的大小 Longint
    3)     一個通常方法
        ClassType     返回指向自己類的指針 (類引用)
    4)     其餘
        dispatch 消息分發     GetInterface COM接口中用到


  類引用類型是指向類而不是對象的指針,方便使用類方法,它不是類。
    Tclass=class of Tobject;
    Delphi自帶的Tclass如上所示,它不是一個類,而是一個類引用,
    因此不能夠建立類引用類型的數組。實際上能夠建立數組。


 對象之間進行類型轉化:使用As進行類型轉化 或者 類型加()
    Tcomponent(Sender) 或者使用 (Sender as Tcomponent)
    AS運算符能夠在基類和派生類指針之間進行相互轉化,可是基類轉成派生類會不會出現異常呢?
    編譯能夠經過,可是運行後會出異常提示類型不匹配。


 類型判斷操做符 Is, 如 If Sender is Tbutton then //左邊是否爲右邊的派生類
    在肯定類型的狀況下使用As或者()兩種方式,不然先用is 判斷後使用As


任何繼承自TForm的窗體,他的任何事件建立時,Delphi默認書寫方式都是以Form打頭的,切記。
    如TForm1.FormCreate(Sender:Tobject);
    這個不一樣其它控件的事件實現,都是名字後加事件,如Button1Click(sender:TObject);


Application 中關於hint屬性和OnHint事件的使用,實現上下文們敏感提示
    procedure Tform1.ShowMyHint(Sender:Tobject);
    begin
      self.caption:=Application.Hint;
    end;
    Procedure Tform1.FormCreate(Sender:Tobject);
    Begin
      Application.OnHint:=ShowMyHint;
    End;
    hint:=’toolbar text|statusbar text’;   《1》
    則 《1》處的hint中」|」前面顯示在組件上,後面顯示在caption上


  關於Self 和 Sender
    Self 用來引用運行時調用該方法的對象,對調用者的引用,是一個指針
        用來判斷通常例程和方法的一個標誌
    Sender 傳遞引起該事件的對象,也是一個指針 如:Sender:Tobject


試題107     控制Table的可編輯的屬性是:readonly
    控制Query的可編輯的屬性是:readonly和 RequestLive
    Table、Query和StoredProc的區別
試題108     數據集的Locate方法的使用和結果
    locate(關鍵字段,字段值,大小寫匹配+部分匹配) 返回true找到
    找到結果則:定位到找到的第一條,找不到則位置不動。
試題109     Query1.SQLS.Text:='select * from Customer where Custno:=custno';
    Query1.params.parambyname('custno').asinteger := 134;
    If not Query1.Prepared then
      Query1.prepare;     //優化準備
    Query1.open;
    Delphi自動作準備嗎? 對,不寫也能夠
    若是Query1.Open 已經打開,是否能夠作Query1.Prepare? 能夠,不會出現任何異常
試題110     數據集的Active與數據庫Database的Connected屬性的關係
能夠由 Active:=true 觸發 Database.Connected鏈接變爲true,注意表/庫該關閉的時候關閉,
試題111     數據庫組件好處:提供事務的支持;減小與實際數據庫的鏈接的句柄,減小開銷;
    能夠提供內部使用的別名即便外部文件路徑改變也不用改變內部程序;登陸提示可設置loginPrompt
試題112     BDE設置的問題:
    取別名 非SQL數據庫別名指定文件夾,SQL數據庫指定到文件
    數據庫中的表經過主鍵+外鍵–〉關鍵字
    默認的interbase的帳號 SYSDBA 密碼 masterkey
    Database組件的AliasName 來自BDE; DatabaseName提供給程序內部用,自定義
    Table組件中的DataBaseName必須設成 Database.DataBaseName
    此處建議Database.DataBaseName同AliasName同樣,好處:內部使用保持一致性
    這樣一致的Databasename實現了外部實際數據庫的物理無關性
試題113     BDE borland傳統引擎,功能強大,配合SQL與ODBC,可以支持絕大多數主流數據庫,
    缺點是部署複雜致使不容易分發以及只支持windows
試題114     ADO (ActiveX Data Object) 微軟標準,功能強大,易於分發針對windows
試題115     dbExpress   Delphi 6新技術,跨Windows And Linux平臺,輕量級引擎,開銷小,
    缺點:提供單向只讀數據集,但與客戶數據集組件技術一塊兒使用
    有很高的性能,易於分發(僅需150KB,BDE用幾兆)
    但dbExpress數據集不能使用過濾技術。
試題116     procedure TForm1.Button1Click(Sender: TObject);
    var i:integer;
    begin
      for i:=0 to ListBox1.Items.Count-1 do
      begin
        if listBox1.Selected then
            ListBox1.Items.Delete(i);
      end;
    end;
    請問這段代碼會出哪些問題?
    刪除最後一行沒有問題,刪除第0行到第n-1行都會出異常,由於Listbox1的Items.Count會變化,
    顯然selected[]已經變化了
試題117     ExtractFiledrive/Path/filename/ext各返回什麼
    Drive:返回 盤符+:如C:         Path:返回所在目錄+’\’
    Filename:返回文件名xxx.txt     ext:返回擴展名 如.txt
試題118     按下Esc鍵能夠逐步返回父組件的焦點,設計的時候
    模式窗口和非模式窗口的製做,ShowModal 和Show的區別
試題120     對話框的defaultExt 設置缺省擴展名的時候只須要三個字母便可,
    不須要加點如:defaultext:='txt';
    Filter設置:注意由'|'分隔(描述|過濾器) 如filter:=’all file(*.*)|*.*
    多個過濾器用'|'隔開,一個過濾器中的複合filter用分號隔開 '文本文件(*.*)|*.txt;*.doc'
試題121     利用ActionList進行事件/任務以及Groupindex的分配,比較方便
試題122     Style         Grouped     AllowAllUp     效果
    TbsButton(缺省)任意     任意         普通按鈕
              False(缺省)     任意     複選按鈕
    TbsCheck     True     False(缺省)     單選按鈕
                  True         單選但可全不選
試題123     若是要作出複選效果,可令幾個按鈕有不一樣的非0的GroupIndex且其AllowAllUp爲True。
    Panel + Speedbutton作出工具欄的樣子
    GroupIndex     AllowAllUp     效果
    0(缺省)     任意         普通按鈕
    非0         False(缺省)     單選按鈕
              True         單選但可全不選
    非0但值不一樣     true         多選但可全不選
試題124     Imagelist組件的使用
試題125     在按鈕中如何改變Form1的標題
    Caption:=’kkk’;
    Self.caption :=’kkk’;
    Form1.Caption:=’kkk’;
試題126     查詢字段必須作過索引(findkey:datasource),或者locate不必定須要有索引。
試題127     經過DBExpress單向只讀引擎從數據庫下載數據到本地客戶集,在本地修改後,如何提交到服務器上。
    若是在本地修改了數據,而後執行Refresh方法但願從數據庫獲得新的數據,你會獲得一個異常。
    這個問題的解決要這樣作:先在本地提交數據修改Applyupdates使(delta爲空),而後refresh
    利用客戶數據集的ApplyUpdates方法將本地數據提交到服務器,參數的含義表示容錯級別
    -1表示忽略全部的修改錯誤,有多少能夠在數據庫提交的就該多少
    >=0 表示若是有一條修改在服務器出現錯誤則全部的修改無效
    例如5 若是發生了4個錯誤則能夠把其餘的正確提交,若是錯誤數達到5則全部的修改無效。
    這個要注意。
試題128     窗體默認的Position屬性是poDesigned,屏幕居中 poScreenCenter
試題129     如何訪問字段,持久字段(利用字段組件名便可),命名習慣:數據集名+字段名
    非持久字段的方法:Fields/FieldByName/FindField 返回的類型都是TField
    還有一個方法直接在數據集名字後加上['數據表中字段名']如:Table1['ID'] 返回類型是變體
    屬性數組中若是缺省值作法是 default; 說明它是這個類的缺省屬性,能夠經過類名加下標訪問
    property FieldValues[const FieldName: string]: Variant read GetFieldValue write SetFieldValue; default;
    default 只能針對數組
試題130     Trunc(2.8) 返回整數部分,Round(2.5)返回的老是偶數此處爲:2,Round(3.5)返回4
    正負數規律同樣。

試題131     DataSetProvider:構成客戶數據集與外部存儲之間的管道,向提出請求的客戶集提供數據,    而且在客戶修改數據時候賦則將數據發送回底層數據存儲(實際由構造SQL語句完成)    應用程序服務器:一般包含企業邏輯,它包含鏈接底層數據庫和向客戶應用程序提供結果數據所需的所有代碼。試題132     TClientSocket如何指定服務器:        1.指定服務器機器,其中Host優先於Adress        2.指定服務器服務端口,Service優先於Port    TServerSocket組件如何監聽,指定監聽端口時候service優先於Port    鏈接或者監聽採用:Active屬性或者Open方法試題133     [學生]考過InputQuery以及相關的對話框的使用試題134     NMFTP NMHTTP NMUDP NMSMTP   NMPOP3使用的協議試題135     經過文件或者流填充記住四個方法    LoadFromFile, SaveToFile, LoadFromStream, SaveToStream    注意:上述保存方法中除文件名/流對象名稱參數外還有一個格式參數,有缺省值      Format:TdataPacketFormat = dfBinary      DfBinary 專門的二進制格式,      DfXML,dfXMLUTF8 :XML格式    保存到磁盤上的客戶數據集文件就是所謂MyBase文件(cds文件),    通常它保存一個單獨的數據集,也能夠保存嵌套數據集。試題136     Data 與 Delta的做用:客戶機的數據所有放在data中,    剛開始delta爲空;用戶修改使用post後,修改的情況將反饋到data和delta中    最後使用ApplyUpdates()提交到服務器(實際構造SQL語句從Delta中提交數據完成)試題137     嵌套數據集例子須要以下組件:(利用DBExpress組件實現三層形式的數據庫應用)    SQLConnection,兩個SQLClientDataSet,DataSource,DatasetProvider,     ClientDataset        SQLConnection鏈接Interbase數據庫,主SQLClientDataSet取自SQLConnection鏈接Customer表,        從SQLClientDataSet取自SQLConnection鏈接Order表,    DataSource的DataSet屬性與主客戶集鏈接    從客戶集的MasterSource鏈接DataSource,MasterFields產生Customer表的CustNo        與Order表的CustON創建關聯。    DataSetProvider的DataSet取自主客戶集,而後將ClientDataSet的ProviderName        設成DataSetProvider,設置Active=true就能夠了在客戶端提取服務器端的數據了。    在ClientDataSet上右鍵單擊保存成Binary或者XML文檔    這樣就實現了從服務器下載數據到本地客戶集,而後保存成本地文件,方便攜帶編輯,    若是須要提交到服務器,能夠再把本地數據發送到服務器的數據庫。把單向數據集變成    可雙向編輯方便攜帶的本地數據集。試題138     組件 TcustomerClientDataSet->TclientDataSet    優勢:1)基於內存 //             2)快速     //本地內存數據固然快      3)高效     //數據存儲的格式   4)支持動態索引      5)支持撤銷操做和匯聚 //匯聚 求平均值等      缺點: 1)單用戶   //基於內存試題139     在設計期建立        數據字段:data 佔據物理存儲        計算字段:不佔據物理存儲,每當須要時候動態計算受AutoCalcFields屬性影響,        缺省(True)條件下在打開數據集進入編輯模式,窗體上移動焦點修改時候自動計算。              不然只有在打開數據集進入編輯模式時候從新計算。        內部計算字段:佔物理存儲,所以能夠在其上建立索引,計算一次後存儲在內存中,              當相關底層字段發生變化時候自動從新計算        查找字段:相似計算字段,當要依賴另一個數據集    添加兩個ClientDataSet組件,雙擊進入字段編輯:創建一個部門表和部門描述表    cdsCustomer: ID,LastName,FirstName,Department,Bonus,Names,DepartDesc,Salary          計算字段:Bonus,     內部計算字段:Names    在cdsCustomerCalcFields事件中編寫:    CDSCustomerBonus.AsFloat:=CDSCustomerSalary.AsFloat*0.15;    if CDSCustomer.State=dsInternalCalc then //只有當內部字段須要計算時候        CDSCustomerNames.AsString:=CDSCustomerLastName.AsString+','+            CDSCustomerFirstName.AsString;    cdsDepartment: Dept,Description        其中Department->Dept DepartDesc->Description    而後 Create DataSet建立一個數據集,最後右擊選擇4種類型進行保存數據集這就是公文包的形式試題140     運行其建立字段的方法    var      cds:TclientData;    begin      cds:=Tclientdataset.create(nil);      try      finally    end;    添加字段,使用AddFieldDef方法    var FieldDef:TfieldDef;    begin      FieldDef:=cds.FieldDefs.AddFieldDef;      FieldDef.Name:=’ID’;      FieldDef.DataType:=ftString;      FieldDef.Size:=20;      FieldDef.Required:=True;    end;    也可使用:cds.FieldDefs.Add(‘Names’,ftString,20,true)試題141     建立索引    設計時候建立:indexdefs屬性    運行時候建立:AddIndex方法和DeleteIndex方法    ClientDataset1.AddIndex(‘ByName’,’LastName;FirstName’,[ixUnique]);    參數:索引名,索引字段名用分號隔開,選項    使用索引: IndexName屬性如:clientDataset1.IndexName:=’Byname’;    或者       IndexFieldNames屬性注意分號隔開。、    獲取索引信息:GetIndexNames方法,結果放入Tstings對象中。

相關文章
相關標籤/搜索