Time of Update: 2018-12-07
因為使用方法參數的不同, 所以有了呼叫慣例.譬如 Delphi 預設的是從左至右讀取參數; Window API 是從右至左讀取參數.如果沒有呼叫慣例, Delphi 就無法使用由 C 語言編寫的 Window API;如果沒有呼叫慣例, 別的語言也無法使用由 Delphi 編寫的 DLL 檔案中的方法.指示字參數讀取順序參數刪除參數傳遞備忘register 左→右方法返回時自動刪除參數前三個參數使用CPU的三個寄存器傳遞; 其他使用棧傳遞速度最快, 是 Delphi
Time of Update: 2018-12-07
關於屬性的話題還有很多, 譬如: 數組屬性、預設屬性、class 屬性等等.先總結一下前面提到過的屬性吧.TMyClass = class(TObject) private FName: string; procedure SetName(const Value: string); published property Name: string read FName write SetName; end;1、屬性用 property 定義;2、read、write
Time of Update: 2018-12-07
Delphi 的屬性太複雜了, 先換換思路, 再繼續學習.程式需要的記憶體空間分為 heap(堆) 和 stack(棧);heap 是自由儲存區, stack 是自動儲存區;使用 heap 需要手動申請、手動釋放, stack 是自動申請、自動釋放;使用 heap 時, 如果只申請不釋放, 就會發生"記憶體泄露";不需要申請和釋放空間的元素, 譬如變數、結構(record)等, 是存與 stack(棧);反之如需要 Create 和 Free 的對象、需要 GetMem 和 FreeMem
Time of Update: 2018-12-07
Screen 對象是 TScreen 類的一個變數, 它聲明在 Forms 單元的第 1323 行(Delphi 2007); 並且 TScreen 類也來自 Forms 單元.也就是說, 只要 uses 了 Forms 單元, Screen 對象就可以使用了.我們自己建立一個 TScreen 類的對象可以嗎? 當然可以!var MyScreen: TScreen;begin MyScreen := TScreen.Create(nil); {建立}
Time of Update: 2018-12-07
//一個包含兩個表單的例子, 這是工程中的內容:program Project1;uses Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2};{$R *.res}begin Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TForm1, Form1);
Time of Update: 2018-12-07
//更換表單或某個控制項的游標可以不通過 Screen 對象, 譬如:begin Self.Cursor := crAppStart; Panel1.Cursor := crHandPoint;{游標可選值: crDefault = TCursor(0); crNone = TCursor(-1); crArrow = TCursor(-2); crCross = TCursor(-3); crIBeam =
Time of Update: 2018-12-07
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;type TForm1 = class(TForm) Timer1: TTimer; {需要個定時器} procedure FormCreate(Sender: TObject); procedure
Time of Update: 2018-12-07
方法來到類中, 以前的特點基本都在;因為類一般是存在於一個繼承鏈中, 所以就有了一些新的概念, 譬如: 繼承、覆蓋;也有了很多新名稱, 譬如: 靜態方法、虛方法、動態方法、抽象方法、類方法、訊息方法.先從虛方法與動態方法開始吧//下面的類中就定義了兩個虛方法(virtual)、兩個動態方法(dynamic)TMyClass = class procedure Proc1(x,y: Real); virtual; function Fun1(x,y: Real): Real; virtual;
Time of Update: 2018-12-07
//標準的覆蓋是這樣的TBass = class procedure Proc; virtual; {或用 dynamic}end;TChild = class(TBass) procedure Proc; override;end;//以下幾種情況屬於重定義, 其中例 3-5 還會有編譯提示{例1}TBass = class procedure Proc;end;TChild = class(TBass) procedure Proc;end;{例2}TBass = class
Time of Update: 2018-12-07
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) end;TBass = class function Fun1(x,y: Integer): Integer; virtual; {Fun1 有 virtual 指示字} function Fun2
Time of Update: 2018-12-07
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;type TForm1 = class(TForm) Timer1: TTimer; Button1: TButton; procedure Timer1Timer(Sender: TObject);
Time of Update: 2018-12-07
//下面說的資料成員不僅僅指方法TMyClass = class(TObject) function Fun1: string; {公用地區的資料成員在預設狀態下會歸於 published 區} //所謂預設狀態就是編譯指令為{$M+}, 如果是{$M-}這些資料成員會歸於 public 區 private function Fun2: string; {private 區的資料成員只能在類內訪問}protected function Fun3: string; {protected
Time of Update: 2018-12-07
//靜態方法是預設的, 如果不是虛方法或純虛方法, 那它就是一個靜態方法.//類方法就是通過類名就可以訪問的方法unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; Button2: TButton;
Time of Update: 2018-12-07
//擷取滑鼠在表單中的當前位置procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);var str: string;begin str := Format('%d,%d',[X,Y]); ShowMessage(str);end;//用 GetCursorPos 擷取的是滑鼠相對與螢幕的位置var ps: TPoint; str:
Time of Update: 2018-12-07
//類中的方法重載首先具備前面說過的重載相關的所有特點, 如:TMyClass = class(TObject) function Fun(s: string): string; overload; function Fun(i: Integer): Integer; overload; function Fun(x,y: Integer): string; overload;end;//但如果是重載父類中的方法, 如果父類中被重載的方法在本類中沒有重載的話, 可以省略
Time of Update: 2018-12-07
// inherited 就是調用父類方法的一個特殊命令; 舉例:unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject);
Time of Update: 2018-12-07
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; procedure
Time of Update: 2018-12-07
//抽象方法類似與介面; 在沒有介面的年代 Delphi 是用抽象方法來類比介面的; 我想它最終會被介面替代.{下面就定義了兩個抽象方法}TMyClass = class(TObject) procedure Proc1; virtual; abstract; {抽象方法首先應該是一個虛方法或動態方法} function Fun: string; dynamic; abstract; {抽象方法也叫純虛方法}end;{ 抽象方法在本類中只有定義、沒有實現;
Time of Update: 2018-12-07
{ 抽象類別是一定要被繼承才可以使用的; 抽象方法是一定要被覆蓋才可以使用的. 現在說的是不能被覆蓋的方法, 與不能被繼承的類.}//譬如:TA = class procedure Proc; virtual; {TA 中的虛方法, 將要被覆蓋}end;TB = class(TA) procedure Proc; override; {覆蓋}end;TC = class(TB) procedure Proc; override; {再次覆蓋}end;//假如要設定 TB.Proc
Time of Update: 2018-12-07
//構造方法就是對象建立時調用的方法; 析構方法就是對象銷毀時調用的方法. 如:TMyClass = class(TObject)public constructor Create; {構造方法} destructor Destroy; override; {析構方法}end;{幾個要點: 這兩個方法都可以追溯到所有類的祖先類 TObject; 它們都屬於類方法, 儘管沒有 class 標識符; 但和類方法也有區別: 一般的類方法不能使用類中非待用資料;