当前位置:网站首页>Use of class methods and class variables

Use of class methods and class variables

2022-07-04 21:34:00 pcplayer

Preface

Delphi grammar , Class method class procedure and class function ; There are also class variables class var.

What can be used for ?

scene

WebService Server side , Multiple SoapDataModule Common method , In a DataModule Go inside .

Every time SOAP call , Need to be in SoapDataModule Implement interface methods , Create the DataModule Example , Call its methods , Then release .

Create and release code , Always repeat . also , No object buffer pool .

Of course , You can give this DataModule Implement an object buffer pool based on interface release , But the code architecture is more complex .

If you want to write less code , You can consider in this DataModule It implements its own creation, release and buffer management code .

  background :

Please refer to the previous article of this article .

Code example

The following code passed the test

The module implements its own buffer pool code

unit UDmPool;

interface

uses
  System.SysUtils, System.Classes;

type
  TDmPool = class(TDataModule)
  private
    { Private declarations }
    class var FList: TList;
  public
    { Public declarations }

    class function GetMyDM: TDmPool;
    class procedure ReleaseDM(DM: TDmPool);
    class function GetPoolCount: Integer;

    function HelloPool(const S: string): string;
  end;



implementation

{%CLASSGROUP 'Vcl.Controls.TControl'}

{$R *.dfm}

{ TDmPool }

class function TDmPool.GetMyDM: TDmPool;
var
  DM: TDmPool;
begin
  if not Assigned(FList) then FList := TList.Create;

  if FList.Count = 0 then
  begin
    DM := TDmPool.Create(nil);
    Result := DM;
  end
  else
  begin
    DM := TDmPool(FList.Items[0]);
    FList.Delete(0);
  end;
end;

class function TDmPool.GetPoolCount: Integer;
begin
  if not Assigned(FList) then
  begin
    Result := 0;
    Exit;
  end;

  Result := FList.Count;
end;

function TDmPool.HelloPool(const S: string): string;
begin
  Result := 'Hello, ' + S + '; This is DmPool';
end;

class procedure TDmPool.ReleaseDM(DM: TDmPool);
begin
  FList.Add(DM);
end;

end.

stay SOAPDATAMODULE Inside the code that calls it

function TSoapDM_A.HelloPool(const S: string): string;
var
  DM: TDmPool;
begin
  DM := TDmPool.GetMyDM;
  Result := DM.HelloPool('SoapDM_A' + S);
  TDmPool.ReleaseDM(DM);
end;

The server-side interface shows the code of the number of buffer pools

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Label2.Caption := 'PoolCount = ' + TDmPool.GetPoolCount.ToString;
end;

Conclusion :

Use class function and class var It can solve the expectation of implementing repeated code in one class . At the same time, implement a simple buffer pool .

原网站

版权声明
本文为[pcplayer]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/185/202207042033575278.html