1. 程式人生 > 其它 >Delphi 系統[28]關鍵字和保留字 index、near、far、export、exports、external、name、resident

Delphi 系統[28]關鍵字和保留字 index、near、far、export、exports、external、name、resident

Delphi 系統[28]關鍵字和保留字 index、near、far、export、exports、external、name、resident

1、定義:

  • index :用於在屬性中標識序號,以便用相同的屬性方法(Get,Set)對不同的屬性進行操作。index 關鍵字也用於在屬性中指出多個元素。
  • near :標明函式的呼叫協定,指出函式可以被本地呼叫。其他程式可以用 dll 的形式呼叫程式內的函式,保留它是為了向下相容。
  • far :標明瞭函式呼叫協定,指出函式可以被遠端呼叫。其他程式可以用 dll 的形式呼叫程式內的函式,保留它是為了向下相容。
  • export :標明瞭函式的呼叫協定,指出函式可以被輸出,輸出的函式能被本地或遠端呼叫。其他程式可以用 dll 的形式呼叫程式內的函式,保留它是為了向下相容。
  • exports :用於輸出物件,它必須被用在介面和實現之間,可以同時輸出多個項,項與項之間用逗號分開。
  • external :用於引用一個外部的或是 OBJ 內的方法。使用 external 關鍵字時,程式碼必須注意大小寫,否則將出現錯誤。
  • name :用於指出方法的別名,對於一個要被外部引用的方法,建議用 name 申請方法別名,以避免外部程式改動方法的實體內容。從外部引用一個方法時,如果該方法有別名,則必須用 name 進行標識。
  • resident :使用 resident,則當 DLLs 裝入時,特定的輸出資訊始終保持在記憶體中。這樣當其它應用程式呼叫該過程時,可以比利用名字掃描 DLL 入口降低時間開銷。對於那些其它應用程式常常要呼叫的過程或函式,使用 resident 指示是合適的。這個關鍵字已經被廢棄不用了。

2、示例:

{ index:屬性序號 }
type
  TMyObject = class(TObject)
  private
    FLeft: Integer;
    FTop: Integer;
    FWidth: Integer;
    FHeight: Integer;
    function GetInfo(const Index: Integer): Longint;
    procedure SetInfo(const Index: Integer; const Value: Longint);
  public
    property iLeft: Longint index 0 read GetInfo write SetInfo;
    property iTop: Longint index 1 read GetInfo write SetInfo;
    property iWidth: Longint index 2 read GetInfo write SetInfo;
    property iHeight: Longint index 3 read GetInfo write SetInfo;
  end;

function TMyObject.GetInfo(const Index: Integer): Longint;
begin
  case Index of
    0: Result := FLeft;
    1: Result := FTop;
    2: Result := FWidth;
    3: Result :=FHeight;
  end;
end;

procedure TMyObject.SetInfo(const Index: Integer; const Value: Longint);
begin
  case Index of
    0: FLeft := Value;
    1: FTop := Value;
    2: FWidth := Value;
    3: FHeight :=Value;
  end;
end;

----------------------------------------------------------------------------------------
{ index:屬性的多個元素 }
type
  TMyObject = class(TObject)
  private
    FList: TStringList;
    function GetItem(Index: Integer): string;
    procedure SetItem(Index: Integer; const Value: string);
  public
    constructor Create;
    destructor Destroy; override;
    property Items[Index: Integer]: string read GetItem write SetItem;
  end;

constructor TMyObject.Create;
begin
  inherited;
  FList := TStringList.Create;
  FList.Add('星期一');
  FList.Add('星期二');
  FList.Add('星期三');
  FList.Add('星期四');
  FList.Add('星期五');
  FList.Add('星期六');
  FList.Add('星期日');
end;

destructor TMyObject.Destroy;
begin
  FList.Free;
  inherited;
end;

function TMyObject.GetItem(Index: Integer): string;
begin
  if (Index >= 0) and (Index <= (FList.Count - 1)) then
    Result := FList[Index]
  else
    Result := 'Out of Index';
end;

procedure TMyObject.SetItem(Index: Integer; const Value: string);
begin
  if (Index >= 0) and (Index <= (FList.Count - 1)) then
    FList[Index] := Value;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
  MyObj: TMyObject;
begin
  MyObj := TMyObject.Create;
  try
    Caption := MyObj.Items[2];
    MyObj.Items[2] := 'Wednesday';
    for I := 0 to 6 do
      ShowMessage(MyObj.Items[I]);
  finally
    MyObj.Free;
  end;
end;

---------------------------------------------------------------------------------------
{ near }
function Add(A, B: Integer): Integer; near;
{ 如果這個程式被編譯為 Test.exe,並且另一個處於本地的程式需要呼叫這個函式,可以使用以下語句 }
function Add(A, B: Integer): Integer; stdcall; external 'Test.exe';

----------------------------------------------------------------------------------------
{ far }
function Add(a,b: Integer): Integer; far;
{ 如果這個程式被編譯為 Test.exe, 並且另一個處於其他計算機的程式需要呼叫這個函式, 可以使用以下語句 }
function Add(a,b: Integer): Integer; stdcall; external 'Test.exe';

----------------------------------------------------------------------------------------
{ export }
function Add(a,b: Integer): Integer; export;
{ 如果這個程式被編譯為 Test.exe, 而另一個程式需要呼叫這個函式,可以使用以下語句 }
function Add(a,b: Integer): Integer; stdcall; external 'Test.exe';

----------------------------------------------------------------------------------------
{ exports }
library Test;

function TestFunc(I: Integer): string; stdcall;
begin
  Result := IntToStr(I);
end;

exports TestFunc;

begin

end.

{ name 如果輸出的物件被過載,則必須給物件起個別名,並註明引數 }
library Test;

function TestFunc(I: Integer): string; overload; stdcall;
begin
  Result := IntToStr(I); 
end;

function TestFunc(S: string): Integer; overload; stdcall;
begin
  Result := StrToInt(S);
end;

exports
  TestFunc(I: Integer) name 'TestFunc1',
  TestFunc(S: string)  name 'TestFunc2';

begin

end.

----------------------------------------------------------------------------------------
{ external }

{$L Test.OBJ}
procedure TestFunc(I:Integer); external;

{ 如果是從 dll 或外部程式中引用,則可以使用以下程式碼 }
function TestFunc(FileName: string): string; external 'Test.dll';

{ 如果被引用的函式被過載,則必須另外指出引用的名稱 }
function MyFunc1(Code: Integer): string; overload; stdcall; external 'Test.dll' name 'TestFunc1';
function MyFunc2(Name: string): Integer; overload; stdcall; external 'Test.dll' name 'TestFunc2';

----------------------------------------------------------------------------------------
{ name }
function MessageBox(HWnd: Integer; Text, Caption: PChar; Flags: Integer): Integer; stdcall; external 'user32.dll' name 'MessageBoxA';

----------------------------------------------------------------------------------------
{ resident }
function Test: string;exports Test name 'MyTest' resident;   //編譯時會給出警告:Symbol 'RESIDENT' is deprecated

  

建立時間:2021.08.16  更新時間:

部落格園 滔Roy https://www.cnblogs.com/guorongtao 希望內容對你所有幫助,謝謝!